20 #include "llvm/ADT/TypeSwitch.h"
21 #include "llvm/IR/Constants.h"
22 #include "llvm/IR/InlineAsm.h"
23 #include "llvm/IR/Instructions.h"
24 #include "llvm/IR/IntrinsicInst.h"
25 #include "llvm/IR/MemoryModelRelaxationAnnotations.h"
31 #include "mlir/Dialect/LLVMIR/LLVMConversionEnumsFromLLVM.inc"
37 "intel_reqd_sub_group_size";
43 #include "mlir/Dialect/LLVMIR/LLVMConvertibleLLVMIRIntrinsics.inc"
45 return convertibleIntrinsics.contains(
id);
52 #include "mlir/Dialect/LLVMIR/LLVMConvertibleLLVMIRIntrinsics.inc"
54 return convertibleIntrinsics;
61 LLVM::ModuleImport &moduleImport) {
71 llvmOpBundles.reserve(inst->getNumOperandBundles());
72 for (
unsigned i = 0; i < inst->getNumOperandBundles(); ++i)
73 llvmOpBundles.push_back(inst->getOperandBundleAt(i));
75 #include "mlir/Dialect/LLVMIR/LLVMIntrinsicFromLLVMIRConversions.inc"
85 llvm::LLVMContext::MD_prof,
86 llvm::LLVMContext::MD_tbaa,
87 llvm::LLVMContext::MD_access_group,
88 llvm::LLVMContext::MD_loop,
89 llvm::LLVMContext::MD_noalias,
90 llvm::LLVMContext::MD_alias_scope,
91 llvm::LLVMContext::MD_dereferenceable,
92 llvm::LLVMContext::MD_dereferenceable_or_null,
93 llvm::LLVMContext::MD_mmra,
98 return convertibleMetadata;
106 LLVM::ModuleImport &moduleImport) {
108 if (!node->getNumOperands())
111 auto *name = dyn_cast<llvm::MDString>(node->getOperand(0));
116 if (name->getString() ==
"function_entry_count") {
119 if (node->getNumOperands() != 2)
122 llvm::ConstantInt *entryCount =
123 llvm::mdconst::dyn_extract<llvm::ConstantInt>(node->getOperand(1));
126 if (
auto funcOp = dyn_cast<LLVMFuncOp>(op)) {
127 funcOp.setFunctionEntryCount(entryCount->getZExtValue());
131 <<
"expected function_entry_count to be attached to a function";
134 if (name->getString() !=
"branch_weights")
139 branchWeights.reserve(node->getNumOperands() - 1);
140 for (
unsigned i = 1, e = node->getNumOperands(); i != e; ++i) {
141 llvm::ConstantInt *branchWeight =
142 llvm::mdconst::dyn_extract<llvm::ConstantInt>(node->getOperand(i));
145 branchWeights.push_back(branchWeight->getZExtValue());
148 if (
auto iface = dyn_cast<WeightedBranchOpInterface>(op)) {
156 iface.setWeights(branchWeights);
166 LLVM::ModuleImport &moduleImport) {
167 Attribute tbaaTagSym = moduleImport.lookupTBAAAttr(node);
171 auto iface = dyn_cast<AliasAnalysisOpInterface>(op);
175 iface.setTBAATags(
ArrayAttr::get(iface.getContext(), tbaaTagSym));
184 LLVM::ModuleImport &moduleImport) {
185 FailureOr<SmallVector<AccessGroupAttr>> accessGroups =
186 moduleImport.lookupAccessGroupAttrs(node);
190 auto iface = dyn_cast<AccessGroupOpInterface>(op);
195 iface.getContext(), llvm::to_vector_of<Attribute>(*accessGroups)));
204 LLVM::ModuleImport &moduleImport) {
205 auto dereferenceable =
206 moduleImport.translateDereferenceableAttr(node, kindID);
207 if (
failed(dereferenceable))
210 auto iface = dyn_cast<DereferenceableOpInterface>(op);
214 iface.setDereferenceable(*dereferenceable);
222 LLVM::ModuleImport &moduleImport) {
229 auto toAttribute = [&](llvm::MDNode *tag) ->
Attribute {
231 ctx, cast<llvm::MDString>(tag->getOperand(0))->getString(),
232 cast<llvm::MDString>(tag->getOperand(1))->getString());
235 if (llvm::MMRAMetadata::isTagMD(node)) {
236 mlirMmra = toAttribute(node);
239 for (
const llvm::MDOperand &operand : node->operands()) {
240 auto *tagNode = dyn_cast<llvm::MDNode>(operand.get());
241 if (!tagNode || !llvm::MMRAMetadata::isTagMD(tagNode))
243 tags.push_back(toAttribute(tagNode));
247 op->
setAttr(LLVMDialect::getMmraAttrName(), mlirMmra);
255 LLVM::ModuleImport &moduleImport) {
256 LoopAnnotationAttr attr =
257 moduleImport.translateLoopAnnotationAttr(node, op->
getLoc());
262 .Case<LLVM::BrOp, LLVM::CondBrOp>([&](
auto branchOp) {
263 branchOp.setLoopAnnotationAttr(attr);
266 .Default([](
auto) {
return failure(); });
273 LLVM::ModuleImport &moduleImport) {
274 FailureOr<SmallVector<AliasScopeAttr>> aliasScopes =
275 moduleImport.lookupAliasScopeAttrs(node);
279 auto iface = dyn_cast<AliasAnalysisOpInterface>(op);
284 iface.getContext(), llvm::to_vector_of<Attribute>(*aliasScopes)));
293 LLVM::ModuleImport &moduleImport) {
294 FailureOr<SmallVector<AliasScopeAttr>> noAliasScopes =
295 moduleImport.lookupAliasScopeAttrs(node);
296 if (
failed(noAliasScopes))
299 auto iface = dyn_cast<AliasAnalysisOpInterface>(op);
304 iface.getContext(), llvm::to_vector_of<Attribute>(*noAliasScopes)));
311 auto *constant = dyn_cast_if_present<llvm::ConstantAsMetadata>(md);
315 auto *intConstant = dyn_cast<llvm::ConstantInt>(constant->getValue());
319 return intConstant->getValue().getSExtValue();
326 if (!node || node->getNumOperands() != 2)
329 auto *hintMD = dyn_cast<llvm::ValueAsMetadata>(node->getOperand(0).get());
334 std::optional<int32_t> optIsSigned =
338 bool isSigned = *optIsSigned != 0;
340 return builder.
getAttr<VecTypeHintAttr>(hint, isSigned);
346 llvm::MDNode *node) {
350 for (
const llvm::MDOperand &op : node->operands()) {
354 vals.push_back(*mdValue);
361 if (!node || node->getNumOperands() != 1)
371 LLVM::ModuleImport &moduleImport) {
372 auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op);
380 funcOp.setVecTypeHintAttr(attr);
386 auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op);
394 funcOp.setWorkGroupSizeHintAttr(attr);
400 auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op);
408 funcOp.setReqdWorkGroupSizeAttr(attr);
418 auto funcOp = dyn_cast<LLVM::LLVMFuncOp>(op);
426 funcOp.setIntelReqdSubGroupSizeAttr(attr);
440 LogicalResult convertIntrinsic(
OpBuilder &builder, llvm::CallInst *inst,
441 LLVM::ModuleImport &moduleImport)
const final {
448 LogicalResult setMetadataAttrs(
OpBuilder &builder,
unsigned kind,
450 LLVM::ModuleImport &moduleImport)
const final {
452 if (
kind == llvm::LLVMContext::MD_prof)
454 if (
kind == llvm::LLVMContext::MD_tbaa)
456 if (
kind == llvm::LLVMContext::MD_access_group)
458 if (
kind == llvm::LLVMContext::MD_loop)
460 if (
kind == llvm::LLVMContext::MD_alias_scope)
462 if (
kind == llvm::LLVMContext::MD_noalias)
464 if (
kind == llvm::LLVMContext::MD_dereferenceable)
467 if (
kind == llvm::LLVMContext::MD_dereferenceable_or_null)
469 node, llvm::LLVMContext::MD_dereferenceable_or_null, op,
471 if (
kind == llvm::LLVMContext::MD_mmra)
473 llvm::LLVMContext &context = node->getContext();
484 llvm_unreachable(
"unknown metadata type");
496 getSupportedMetadata(llvm::LLVMContext &context)
const final {
503 registry.
insert<LLVM::LLVMDialect>();
505 dialect->addInterfaces<LLVMDialectLLVMIRImportInterface>();
static VecTypeHintAttr convertVecTypeHint(Builder builder, llvm::MDNode *node, ModuleImport &moduleImport)
Converts the provided metadata node node to an LLVM dialect VecTypeHintAttr if possible.
static constexpr StringLiteral workGroupSizeHintMDName
static LogicalResult setReqdWorkGroupSizeAttr(Builder &builder, llvm::MDNode *node, Operation *op)
static DenseI32ArrayAttr convertDenseI32Array(Builder builder, llvm::MDNode *node)
Converts the provided metadata node node to an MLIR DenseI32ArrayAttr if possible.
static LogicalResult setWorkGroupSizeHintAttr(Builder &builder, llvm::MDNode *node, Operation *op)
static LogicalResult setVecTypeHintAttr(Builder &builder, llvm::MDNode *node, Operation *op, LLVM::ModuleImport &moduleImport)
static LogicalResult setLoopAttr(const llvm::MDNode *node, Operation *op, LLVM::ModuleImport &moduleImport)
Converts the given loop metadata node to an MLIR loop annotation attribute and attaches it to the imp...
static ArrayRef< unsigned > getSupportedIntrinsicsImpl()
Returns the list of LLVM IR intrinsic identifiers that are convertible to MLIR LLVM dialect intrinsic...
static LogicalResult setTBAAAttr(const llvm::MDNode *node, Operation *op, LLVM::ModuleImport &moduleImport)
Searches for the attribute that maps to the given TBAA metadata node and attaches it to the imported ...
static constexpr StringLiteral intelReqdSubGroupSizeMDName
static ArrayRef< unsigned > getSupportedMetadataImpl(llvm::LLVMContext &context)
Returns the list of LLVM IR metadata kinds that are convertible to MLIR LLVM dialect attributes.
static LogicalResult setProfilingAttr(OpBuilder &builder, llvm::MDNode *node, Operation *op, LLVM::ModuleImport &moduleImport)
Converts the given profiling metadata node to an MLIR profiling attribute and attaches it to the impo...
static LogicalResult setIntelReqdSubGroupSizeAttr(Builder &builder, llvm::MDNode *node, Operation *op)
Converts the given intel required subgroup size metadata node to an MLIR attribute and attaches it to...
static LogicalResult setAliasScopesAttr(const llvm::MDNode *node, Operation *op, LLVM::ModuleImport &moduleImport)
Looks up all the alias scope attributes that map to the alias scope nodes starting from the alias sco...
static LogicalResult setNoaliasScopesAttr(const llvm::MDNode *node, Operation *op, LLVM::ModuleImport &moduleImport)
Looks up all the alias scope attributes that map to the alias scope nodes starting from the noalias m...
static bool isConvertibleIntrinsic(llvm::Intrinsic::ID id)
Returns true if the LLVM IR intrinsic is convertible to an MLIR LLVM dialect intrinsic.
static constexpr StringLiteral reqdWorkGroupSizeMDName
static LogicalResult setMmraAttr(llvm::MDNode *node, Operation *op, LLVM::ModuleImport &moduleImport)
Convert the given MMRA metadata (either an MMRA tag or an array of them) into corresponding MLIR attr...
static LogicalResult convertIntrinsicImpl(OpBuilder &odsBuilder, llvm::CallInst *inst, LLVM::ModuleImport &moduleImport)
Converts the LLVM intrinsic to an MLIR LLVM dialect operation if a conversion exits.
static constexpr StringLiteral vecTypeHintMDName
static LogicalResult setAccessGroupsAttr(const llvm::MDNode *node, Operation *op, LLVM::ModuleImport &moduleImport)
Looks up all the access group attributes that map to the access group nodes starting from the access ...
static IntegerAttr convertIntegerMD(Builder builder, llvm::MDNode *node)
Convert an MDNode to an MLIR IntegerAttr if possible.
static LogicalResult setDereferenceableAttr(const llvm::MDNode *node, unsigned kindID, Operation *op, LLVM::ModuleImport &moduleImport)
Converts the given dereferenceable metadata node to a dereferenceable attribute, and attaches it to t...
static std::optional< int32_t > parseIntegerMD(llvm::Metadata *md)
Extracts an integer from the provided metadata md if possible.
union mlir::linalg::@1255::ArityGroupAndKind::Kind kind
Attributes are known-constant values of operations.
This class is a general helper class for creating context-global objects like types,...
IntegerAttr getI32IntegerAttr(int32_t value)
DenseI32ArrayAttr getDenseI32ArrayAttr(ArrayRef< int32_t > values)
Attr getAttr(Args &&...args)
Get or construct an instance of the attribute Attr with provided arguments.
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
bool addExtension(TypeID extensionID, std::unique_ptr< DialectExtensionBase > extension)
Add the given extension to the registry.
Base class for dialect interfaces used to import LLVM IR.
LLVMImportDialectInterface(Dialect *dialect)
Module import implementation class that provides methods to import globals and functions from an LLVM...
Type convertType(llvm::Type *type)
Converts the type from LLVM to MLIR LLVM dialect.
MLIRContext is the top-level object for a collection of MLIR operations.
void appendDialectRegistry(const DialectRegistry ®istry)
Append the contents of the given dialect registry to the registry associated with this context.
This class helps build Operations.
Operation is the basic unit of execution within MLIR.
unsigned getNumSuccessors()
InFlightDiagnostic emitWarning(const Twine &message={})
Emit a warning about this operation, reporting up to any diagnostic handlers that may be listening.
MLIRContext * getContext()
Return the context this operation is associated with.
Location getLoc()
The source location the operation was defined or derived from.
void setAttr(StringAttr name, Attribute value)
If the an attribute exists with the specified name, change it to the new value.
Include the generated interface declarations.
void registerLLVMDialectImport(DialectRegistry ®istry)
Registers the LLVM dialect and its import from LLVM IR in the given registry.
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...