35 :
public mlir::LLVMTranslationDialectInterface {
37 using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface;
42 mlir::Operation *op, llvm::IRBuilderBase &builder,
43 mlir::LLVM::ModuleTranslation &moduleTranslation)
const final {
45 if (
auto cirOp = llvm::dyn_cast<mlir::LLVM::ZeroOp>(op))
46 moduleTranslation.mapValue(cirOp.getResult()) =
47 llvm::Constant::getNullValue(
48 moduleTranslation.convertType(cirOp.getType()));
50 return mlir::success();
57 mlir::NamedAttribute attribute,
58 mlir::LLVM::ModuleTranslation &moduleTranslation)
const override {
59 if (
auto func = dyn_cast<mlir::LLVM::LLVMFuncOp>(op)) {
61 amendFunction(func, instructions, attribute, moduleTranslation)))
62 return mlir::failure();
63 }
else if (
auto mod = dyn_cast<mlir::ModuleOp>(op)) {
64 if (mlir::failed(amendModule(mod, attribute, moduleTranslation)))
65 return mlir::failure();
66 }
else if (attribute.getName() ==
"cir.riscv_nontemporal_domain") {
67 if (mlir::failed(amendRISCVNontemporalDomain(op, instructions, attribute,
69 return mlir::failure();
70 }
else if (attribute.getName() == cir::CIRDialect::getSrcLocAttrName()) {
71 if (mlir::failed(amendSrcLoc(instructions, attribute, moduleTranslation)))
72 return mlir::failure();
73 }
else if (attribute.getName() ==
74 cir::CIRDialect::getAMDGPUNoFineGrainedMemoryAttrName() ||
75 attribute.getName() ==
76 cir::CIRDialect::getAMDGPUNoRemoteMemoryAttrName() ||
77 attribute.getName() ==
78 cir::CIRDialect::getAMDGPUIgnoreDenormalModeAttrName() ||
79 attribute.getName() ==
80 cir::CIRDialect::getAMDGPUNoPrivateAddrSpaceAttrName()) {
81 amendAMDGPUAtomicMetadata(instructions, attribute, moduleTranslation);
83 return mlir::success();
91 mlir::NamedAttribute attribute,
92 mlir::LLVM::ModuleTranslation &moduleTranslation)
const {
93 auto srcLoc = mlir::dyn_cast<mlir::IntegerAttr>(attribute.getValue());
95 return mlir::failure();
97 llvm::LLVMContext &llvmContext = moduleTranslation.getLLVMContext();
98 llvm::MDNode *node = llvm::MDNode::get(
99 llvmContext, llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
100 llvm::Type::getInt64Ty(llvmContext),
101 srcLoc.getValue().getZExtValue())));
102 for (llvm::Instruction *inst : instructions)
103 inst->setMetadata(
"srcloc", node);
104 return mlir::success();
109 void amendAMDGPUAtomicMetadata(
111 mlir::NamedAttribute attribute,
112 mlir::LLVM::ModuleTranslation &moduleTranslation)
const {
113 if (attribute.getName() ==
114 cir::CIRDialect::getAMDGPUNoPrivateAddrSpaceAttrName()) {
115 llvm::MDBuilder mdHelper(moduleTranslation.getLLVMContext());
116 llvm::MDNode *asRange = mdHelper.createRange(
117 llvm::APInt(32, llvm::AMDGPUAS::PRIVATE_ADDRESS),
118 llvm::APInt(32, llvm::AMDGPUAS::PRIVATE_ADDRESS + 1));
119 for (llvm::Instruction *inst : instructions)
120 inst->setMetadata(llvm::LLVMContext::MD_noalias_addrspace, asRange);
123 llvm::MDNode *empty =
124 llvm::MDNode::get(moduleTranslation.getLLVMContext(), {});
127 if (attribute.getName() ==
128 cir::CIRDialect::getAMDGPUIgnoreDenormalModeAttrName()) {
129 for (llvm::Instruction *inst : instructions)
130 inst->setMetadata(llvm::LLVMContext::MD_atomic_ignore_denormal_mode,
134 llvm::StringRef mdName;
135 if (attribute.getName() ==
136 cir::CIRDialect::getAMDGPUNoFineGrainedMemoryAttrName())
137 mdName =
"amdgpu.no.fine.grained.memory";
138 else if (attribute.getName() ==
139 cir::CIRDialect::getAMDGPUNoRemoteMemoryAttrName())
140 mdName =
"amdgpu.no.remote.memory";
141 for (llvm::Instruction *inst : instructions)
142 inst->setMetadata(mdName, empty);
145 mlir::LogicalResult amendRISCVNontemporalDomain(
146 mlir::Operation *op, llvm::ArrayRef<llvm::Instruction *> instructions,
147 mlir::NamedAttribute attribute,
148 mlir::LLVM::ModuleTranslation &moduleTranslation)
const {
149 auto domain = mlir::dyn_cast<mlir::IntegerAttr>(attribute.getValue());
151 return op->emitError()
152 <<
"expected cir.riscv_nontemporal_domain to be an integer";
154 llvm::LLVMContext &llvmContext = moduleTranslation.getLLVMContext();
155 llvm::MDNode *
node = llvm::MDNode::get(
156 llvmContext, llvm::ConstantAsMetadata::get(llvm::ConstantInt::get(
157 llvm::Type::getInt32Ty(llvmContext),
158 domain.getValue().getZExtValue())));
159 for (llvm::Instruction *inst : instructions)
160 inst->setMetadata(
"riscv-nontemporal-domain", node);
161 return mlir::success();
166 amendFunction(mlir::LLVM::LLVMFuncOp func,
167 llvm::ArrayRef<llvm::Instruction *> instructions,
168 mlir::NamedAttribute attribute,
169 mlir::LLVM::ModuleTranslation &moduleTranslation)
const {
170 llvm::Function *llvmFunc = moduleTranslation.lookupFunction(func.getName());
171 llvm::StringRef attrName = attribute.getName().strref();
174 llvm::StringRef llvmAttrName = attrName.substr(strlen(
"cir."));
175 if (
auto strAttr = mlir::dyn_cast<mlir::StringAttr>(attribute.getValue()))
176 llvmFunc->addFnAttr(llvmAttrName, strAttr.getValue());
177 return mlir::success();
182 amendModule(mlir::ModuleOp mod, mlir::NamedAttribute attribute,
183 mlir::LLVM::ModuleTranslation &moduleTranslation)
const {
184 llvm::Module *llvmModule = moduleTranslation.getLLVMModule();
185 llvm::LLVMContext &llvmContext = llvmModule->getContext();
187 if (attribute.getName() ==
"cir.amdhsa_code_object_version") {
189 mlir::dyn_cast<mlir::IntegerAttr>(attribute.getValue())) {
190 llvmModule->addModuleFlag(llvm::Module::Error,
191 "amdhsa_code_object_version",
192 static_cast<uint32_t>(intAttr.getInt()));
196 if (attribute.getName() ==
"cir.amdgpu_printf_kind") {
198 mlir::dyn_cast<mlir::StringAttr>(attribute.getValue())) {
199 llvm::MDString *mdStr =
200 llvm::MDString::get(llvmContext, strAttr.getValue());
201 llvmModule->addModuleFlag(llvm::Module::Error,
"amdgpu_printf_kind",
206 if (attribute.getName() ==
"cir.amdgpu_xnack") {
208 mlir::dyn_cast<mlir::IntegerAttr>(attribute.getValue())) {
209 llvmModule->addModuleFlag(llvm::Module::Error,
"amdgpu.xnack",
210 static_cast<uint32_t>(intAttr.getInt()));
214 if (attribute.getName() ==
"cir.amdgpu_sramecc") {
216 mlir::dyn_cast<mlir::IntegerAttr>(attribute.getValue())) {
217 llvmModule->addModuleFlag(llvm::Module::Error,
"amdgpu.sramecc",
218 static_cast<uint32_t>(intAttr.getInt()));
222 return mlir::success();