[mlir] Add loop codegen options to some LLVM dialect ops.

Add a Loop Option attribute and generate llvm metadata attached to
branch instructions to control code generation.

Reviewed By: ftynse, mehdi_amini

Differential Revision: https://reviews.llvm.org/D96820
This commit is contained in:
Arpith C. Jacob
2021-03-04 09:00:18 +01:00
committed by Alex Zinenko
parent 90b7825598
commit 4a2930f495
10 changed files with 534 additions and 4 deletions

View File

@@ -593,7 +593,7 @@ LogicalResult ModuleTranslation::convertDialectAttributes(Operation *op) {
/// Check whether the module contains only supported ops directly in its body.
static LogicalResult checkSupportedModuleOps(Operation *m) {
for (Operation &o : getModuleBody(m).getOperations())
if (!isa<LLVM::LLVMFuncOp, LLVM::GlobalOp>(&o) &&
if (!isa<LLVM::LLVMFuncOp, LLVM::GlobalOp, LLVM::MetadataOp>(&o) &&
!o.hasTrait<OpTrait::IsTerminator>())
return o.emitOpError("unsupported module-level operation");
return success();
@@ -633,6 +633,29 @@ LogicalResult ModuleTranslation::convertFunctions() {
return success();
}
llvm::MDNode *
ModuleTranslation::getAccessGroup(Operation &opInst,
SymbolRefAttr accessGroupRef) const {
auto metadataName = accessGroupRef.getRootReference();
auto accessGroupName = accessGroupRef.getLeafReference();
auto metadataOp = SymbolTable::lookupNearestSymbolFrom<LLVM::MetadataOp>(
opInst.getParentOp(), metadataName);
auto *accessGroupOp =
SymbolTable::lookupNearestSymbolFrom(metadataOp, accessGroupName);
return accessGroupMetadataMapping.lookup(accessGroupOp);
}
LogicalResult ModuleTranslation::createAccessGroupMetadata() {
mlirModule->walk([&](LLVM::MetadataOp metadatas) {
metadatas.walk([&](LLVM::AccessGroupMetadataOp op) {
llvm::LLVMContext &ctx = llvmModule->getContext();
llvm::MDNode *accessGroup = llvm::MDNode::getDistinct(ctx, {});
accessGroupMetadataMapping.insert({op, accessGroup});
});
});
return success();
}
llvm::Type *ModuleTranslation::convertType(Type type) {
return typeTranslator.translateType(type);
}
@@ -697,6 +720,8 @@ mlir::translateModuleToLLVMIR(Operation *module, llvm::LLVMContext &llvmContext,
return nullptr;
if (failed(translator.convertGlobals()))
return nullptr;
if (failed(translator.createAccessGroupMetadata()))
return nullptr;
if (failed(translator.convertFunctions()))
return nullptr;
if (llvm::verifyModule(*translator.llvmModule, &llvm::errs()))