From bfea837676038ef3e312563b15811b524cbfb6aa Mon Sep 17 00:00:00 2001 From: Tobias Gysi Date: Mon, 13 Feb 2023 22:05:01 +0100 Subject: [PATCH] [mlir][llvm] Reintroduce string based attribute setting. Reintroduce string based attribute setting in the translation from LLVM dialect to LLVM IR. The TypeSwitch based implementation introduced in https://reviews.llvm.org/D143654 does not work for intrinsics that set the requiresAccessGroup or requiresAliasScope flag. Reviewed By: hgreving Differential Revision: https://reviews.llvm.org/D143936 --- mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 36 +++++++++++++--------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 3834bf0..c928d78 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -27,7 +27,6 @@ #include "mlir/Support/LLVM.h" #include "mlir/Target/LLVMIR/LLVMTranslationInterface.h" #include "mlir/Target/LLVMIR/TypeToLLVM.h" -#include "llvm/ADT/TypeSwitch.h" #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/SetVector.h" @@ -1010,13 +1009,13 @@ LogicalResult ModuleTranslation::createAccessGroupMetadata() { void ModuleTranslation::setAccessGroupsMetadata(Operation *op, llvm::Instruction *inst) { - auto populateGroupsMetadata = [&](std::optional groupRefs) { - if (!groupRefs || groupRefs->empty()) + auto populateGroupsMetadata = [&](ArrayAttr groupRefs) { + if (!groupRefs || groupRefs.empty()) return; llvm::Module *module = inst->getModule(); SmallVector groupMDs; - for (SymbolRefAttr groupRef : groupRefs->getAsRange()) + for (SymbolRefAttr groupRef : groupRefs.getAsRange()) groupMDs.push_back(getAccessGroup(op, groupRef)); llvm::MDNode *node = nullptr; @@ -1028,10 +1027,9 @@ void ModuleTranslation::setAccessGroupsMetadata(Operation *op, inst->setMetadata(llvm::LLVMContext::MD_access_group, node); }; - llvm::TypeSwitch(op) - .Case( - [&](auto memOp) { populateGroupsMetadata(memOp.getAccessGroups()); }) - .Default([](auto) { llvm_unreachable("expected LoadOp or StoreOp"); }); + auto groupRefs = + op->getAttrOfType(LLVMDialect::getAccessGroupsAttrName()); + populateGroupsMetadata(groupRefs); } LogicalResult ModuleTranslation::createAliasScopeMetadata() { @@ -1085,26 +1083,24 @@ ModuleTranslation::getAliasScope(Operation *op, void ModuleTranslation::setAliasScopeMetadata(Operation *op, llvm::Instruction *inst) { - auto populateScopeMetadata = [&](std::optional scopeRefs, - unsigned kind) { - if (!scopeRefs || scopeRefs->empty()) + auto populateScopeMetadata = [&](ArrayAttr scopeRefs, unsigned kind) { + if (!scopeRefs || scopeRefs.empty()) return; llvm::Module *module = inst->getModule(); SmallVector scopeMDs; - for (SymbolRefAttr scopeRef : scopeRefs->getAsRange()) + for (SymbolRefAttr scopeRef : scopeRefs.getAsRange()) scopeMDs.push_back(getAliasScope(op, scopeRef)); llvm::MDNode *node = llvm::MDNode::get(module->getContext(), scopeMDs); inst->setMetadata(kind, node); }; - llvm::TypeSwitch(op) - .Case([&](auto memOp) { - populateScopeMetadata(memOp.getAliasScopes(), - llvm::LLVMContext::MD_alias_scope); - populateScopeMetadata(memOp.getNoaliasScopes(), - llvm::LLVMContext::MD_noalias); - }) - .Default([](auto) { llvm_unreachable("expected LoadOp or StoreOp"); }); + auto aliasScopeRefs = + op->getAttrOfType(LLVMDialect::getAliasScopesAttrName()); + populateScopeMetadata(aliasScopeRefs, llvm::LLVMContext::MD_alias_scope); + + auto noaliasScopeRefs = + op->getAttrOfType(LLVMDialect::getNoAliasScopesAttrName()); + populateScopeMetadata(noaliasScopeRefs, llvm::LLVMContext::MD_noalias); } llvm::MDNode *ModuleTranslation::getTBAANode(Operation *op, -- 2.7.4