Skip to content

Commit 2f6f045

Browse files
authored
[mlir][LLVM] Resync memory effect attribute with LLVM IR (#168568)
- Add missing locations, namely 'ErrnoMem', 'TargetMem0', and 'TargetMem1'.
1 parent a55e30b commit 2f6f045

File tree

20 files changed

+201
-132
lines changed

20 files changed

+201
-132
lines changed

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,10 @@ void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow,
284284
memoryEffect = mlir::LLVM::MemoryEffectsAttr::get(
285285
callOp->getContext(), /*other=*/ModRefInfo::Ref,
286286
/*argMem=*/ModRefInfo::Ref,
287-
/*inaccessibleMem=*/ModRefInfo::Ref);
287+
/*inaccessibleMem=*/ModRefInfo::Ref,
288+
/*errnoMem=*/ModRefInfo::Ref,
289+
/*targetMem0=*/ModRefInfo::Ref,
290+
/*targetMem1=*/ModRefInfo::Ref);
288291
noUnwind = true;
289292
willReturn = true;
290293
break;
@@ -293,7 +296,10 @@ void convertSideEffectForCall(mlir::Operation *callOp, bool isNothrow,
293296
memoryEffect = mlir::LLVM::MemoryEffectsAttr::get(
294297
callOp->getContext(), /*other=*/ModRefInfo::NoModRef,
295298
/*argMem=*/ModRefInfo::NoModRef,
296-
/*inaccessibleMem=*/ModRefInfo::NoModRef);
299+
/*inaccessibleMem=*/ModRefInfo::NoModRef,
300+
/*errnoMem=*/ModRefInfo::NoModRef,
301+
/*targetMem0=*/ModRefInfo::NoModRef,
302+
/*targetMem1=*/ModRefInfo::NoModRef);
297303
noUnwind = true;
298304
willReturn = true;
299305
break;

clang/test/CIR/CodeGen/call.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ int f12(void) {
130130
// OGCG: %{{.+}} = call i32 @f10(i32 noundef 1) #[[ATTR0:.+]]
131131
// OGCG-NEXT: %{{.+}} = call i32 @f11(i32 noundef 2) #[[ATTR1:.+]]
132132

133-
// LLVM: attributes #[[ATTR0]] = { nounwind willreturn memory(read, errnomem: none, target_mem0: none, target_mem1: none) }
133+
// LLVM: attributes #[[ATTR0]] = { nounwind willreturn memory(read) }
134134
// LLVM: attributes #[[ATTR1]] = { nounwind willreturn memory(none) }
135135

136136
// OGCG: attributes #[[ATTR0]] = { nounwind willreturn memory(read) }

flang/lib/Optimizer/Transforms/SetRuntimeCallAttributes.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ static mlir::LLVM::MemoryEffectsAttr getGenericMemoryAttr(fir::CallOp callOp) {
8585
callOp->getContext(),
8686
{/*other=*/mlir::LLVM::ModRefInfo::NoModRef,
8787
/*argMem=*/mlir::LLVM::ModRefInfo::ModRef,
88-
/*inaccessibleMem=*/mlir::LLVM::ModRefInfo::ModRef});
88+
/*inaccessibleMem=*/mlir::LLVM::ModRefInfo::ModRef,
89+
/*errnoMem=*/mlir::LLVM::ModRefInfo::NoModRef,
90+
/*targetMem0=*/mlir::LLVM::ModRefInfo::NoModRef,
91+
/*targetMem1=*/mlir::LLVM::ModRefInfo::NoModRef});
8992
}
9093

9194
return {};

flang/test/Transforms/set-runtime-call-attributes.fir

Lines changed: 67 additions & 67 deletions
Large diffs are not rendered by default.

mlir/include/mlir/Dialect/LLVMIR/LLVMAttrDefs.td

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -931,11 +931,9 @@ def LLVM_DIStringTypeAttr : LLVM_Attr<"DIStringType", "di_string_type",
931931
//===----------------------------------------------------------------------===//
932932

933933
def LLVM_MemoryEffectsAttr : LLVM_Attr<"MemoryEffects", "memory_effects"> {
934-
let parameters = (ins
935-
"ModRefInfo":$other,
936-
"ModRefInfo":$argMem,
937-
"ModRefInfo":$inaccessibleMem
938-
);
934+
let parameters = (ins "ModRefInfo":$other, "ModRefInfo":$argMem,
935+
"ModRefInfo":$inaccessibleMem, "ModRefInfo":$errnoMem,
936+
"ModRefInfo":$targetMem0, "ModRefInfo":$targetMem1);
939937
let extraClassDeclaration = [{
940938
bool isReadWrite();
941939
}];

mlir/lib/Conversion/FuncToLLVM/FuncToLLVM.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,9 +374,12 @@ FailureOr<LLVM::LLVMFuncOp> mlir::convertFuncOpToLLVMFuncOp(
374374
// Create a memory effect attribute corresponding to readnone.
375375
if (funcOp->hasAttr(readnoneAttrName)) {
376376
auto memoryAttr = LLVM::MemoryEffectsAttr::get(
377-
rewriter.getContext(),
378-
{LLVM::ModRefInfo::NoModRef, LLVM::ModRefInfo::NoModRef,
379-
LLVM::ModRefInfo::NoModRef});
377+
rewriter.getContext(), {/*other=*/LLVM::ModRefInfo::NoModRef,
378+
/*argMem=*/LLVM::ModRefInfo::NoModRef,
379+
/*inaccessibleMem=*/LLVM::ModRefInfo::NoModRef,
380+
/*errnoMem=*/LLVM::ModRefInfo::NoModRef,
381+
/*targetMem0=*/LLVM::ModRefInfo::NoModRef,
382+
/*targetMem1=*/LLVM::ModRefInfo::NoModRef});
380383
newFuncOp.setMemoryEffectsAttr(memoryAttr);
381384
}
382385

mlir/lib/Conversion/GPUToLLVMSPV/GPUToLLVMSPV.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@ static LLVM::LLVMFuncOp lookupOrCreateSPIRVFn(Operation *symbolTable,
6666
constexpr auto noModRef = mlir::LLVM::ModRefInfo::NoModRef;
6767
auto memAttr = b.getAttr<LLVM::MemoryEffectsAttr>(
6868
/*other=*/noModRef,
69-
/*argMem=*/noModRef, /*inaccessibleMem=*/noModRef);
69+
/*argMem=*/noModRef, /*inaccessibleMem=*/noModRef,
70+
/*errnoMem=*/noModRef,
71+
/*targetMem0=*/noModRef,
72+
/*targetMem1=*/noModRef);
7073
func.setMemoryEffectsAttr(memAttr);
7174
}
7275

mlir/lib/Conversion/XeVMToLLVM/XeVMToLLVM.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,10 @@ class MMAToOCLPattern : public OpConversionPattern<xevm::MMAOp> {
401401
auto memAttr = rewriter.getAttr<LLVM::MemoryEffectsAttr>(
402402
/*other=*/LLVM::ModRefInfo::NoModRef,
403403
/*argMem=*/LLVM::ModRefInfo::NoModRef,
404-
/*inaccessibleMem=*/LLVM::ModRefInfo::NoModRef);
404+
/*inaccessibleMem=*/LLVM::ModRefInfo::NoModRef,
405+
/*errnoMem=*/LLVM::ModRefInfo::NoModRef,
406+
/*targetMem0=*/LLVM::ModRefInfo::NoModRef,
407+
/*targetMem1=*/LLVM::ModRefInfo::NoModRef);
405408
auto funcAttrs = convergentNoUnwindWillReturnAttrs;
406409
funcAttrs.memEffectsAttr = memAttr;
407410
Value result =
@@ -450,7 +453,10 @@ class PrefetchToOCLPattern : public OpConversionPattern<PrefetchOp> {
450453
auto memAttr = rewriter.getAttr<LLVM::MemoryEffectsAttr>(
451454
/*other=*/LLVM::ModRefInfo::NoModRef,
452455
/*argMem=*/LLVM::ModRefInfo::Ref,
453-
/*inaccessibleMem=*/LLVM::ModRefInfo::NoModRef);
456+
/*inaccessibleMem=*/LLVM::ModRefInfo::NoModRef,
457+
/*errnoMem=*/LLVM::ModRefInfo::NoModRef,
458+
/*targetMem0=*/LLVM::ModRefInfo::NoModRef,
459+
/*targetMem1=*/LLVM::ModRefInfo::NoModRef);
454460
funcAttr.memEffectsAttr = memAttr;
455461

456462
LLVM::CallOp call = createDeviceFunctionCall(
@@ -556,7 +562,10 @@ class LoadStorePrefetchToOCLPattern : public OpConversionPattern<OpType> {
556562
auto memAttr = rewriter.getAttr<LLVM::MemoryEffectsAttr>(
557563
/*other=*/LLVM::ModRefInfo::NoModRef,
558564
/*argMem=*/LLVM::ModRefInfo::Ref,
559-
/*inaccessibleMem=*/LLVM::ModRefInfo::NoModRef);
565+
/*inaccessibleMem=*/LLVM::ModRefInfo::NoModRef,
566+
/*errnoMem=*/LLVM::ModRefInfo::NoModRef,
567+
/*targetMem0=*/LLVM::ModRefInfo::NoModRef,
568+
/*targetMem1=*/LLVM::ModRefInfo::NoModRef);
560569
funcAttr = noUnwindAttrs;
561570
funcAttr.memEffectsAttr = memAttr;
562571
} else {
@@ -798,7 +807,10 @@ class LaunchConfigOpToOCLPattern : public OpConversionPattern<OpType> {
798807
constexpr auto noModRef = LLVM::ModRefInfo::NoModRef;
799808
auto memAttr = rewriter.getAttr<LLVM::MemoryEffectsAttr>(
800809
/*other=*/noModRef,
801-
/*argMem=*/noModRef, /*inaccessibleMem=*/noModRef);
810+
/*argMem=*/noModRef, /*inaccessibleMem=*/noModRef,
811+
/*errnoMem=*/noModRef,
812+
/*targetMem0=*/noModRef,
813+
/*targetMem1=*/noModRef);
802814
call.setMemoryEffectsAttr(memAttr);
803815
rewriter.replaceOp(op, call);
804816
return success();
@@ -836,7 +848,10 @@ class SubgroupOpWorkitemOpToOCLPattern : public OpConversionPattern<OpType> {
836848
constexpr auto noModRef = LLVM::ModRefInfo::NoModRef;
837849
auto memAttr = rewriter.getAttr<LLVM::MemoryEffectsAttr>(
838850
/*other=*/noModRef,
839-
/*argMem=*/noModRef, /*inaccessibleMem=*/noModRef);
851+
/*argMem=*/noModRef, /*inaccessibleMem=*/noModRef,
852+
/*errnoMem=*/noModRef,
853+
/*targetMem0=*/noModRef,
854+
/*targetMem1=*/noModRef);
840855
call.setMemoryEffectsAttr(memAttr);
841856
rewriter.replaceOp(op, call);
842857
return success();

mlir/lib/Dialect/LLVMIR/IR/LLVMAttrs.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,16 @@ bool TBAANodeAttr::classof(Attribute attr) {
219219
MemoryEffectsAttr MemoryEffectsAttr::get(MLIRContext *context,
220220
ArrayRef<ModRefInfo> memInfoArgs) {
221221
if (memInfoArgs.empty())
222-
return MemoryEffectsAttr::get(context, ModRefInfo::ModRef,
223-
ModRefInfo::ModRef, ModRefInfo::ModRef);
224-
if (memInfoArgs.size() == 3)
222+
return MemoryEffectsAttr::get(context, /*other=*/ModRefInfo::ModRef,
223+
/*argMem=*/ModRefInfo::ModRef,
224+
/*inaccessibleMem=*/ModRefInfo::ModRef,
225+
/*errnoMem=*/ModRefInfo::ModRef,
226+
/*targetMem0=*/ModRefInfo::ModRef,
227+
/*targetMem1=*/ModRefInfo::ModRef);
228+
if (memInfoArgs.size() == 6)
225229
return MemoryEffectsAttr::get(context, memInfoArgs[0], memInfoArgs[1],
226-
memInfoArgs[2]);
230+
memInfoArgs[2], memInfoArgs[3],
231+
memInfoArgs[4], memInfoArgs[5]);
227232
return {};
228233
}
229234

@@ -234,6 +239,12 @@ bool MemoryEffectsAttr::isReadWrite() {
234239
return false;
235240
if (this->getOther() != ModRefInfo::ModRef)
236241
return false;
242+
if (this->getErrnoMem() != ModRefInfo::ModRef)
243+
return false;
244+
if (this->getTargetMem0() != ModRefInfo::ModRef)
245+
return false;
246+
if (this->getTargetMem1() != ModRefInfo::ModRef)
247+
return false;
237248
return true;
238249
}
239250

mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,14 @@ convertOperationImpl(Operation &opInst, llvm::IRBuilderBase &builder,
439439
llvm::MemoryEffects::Location::InaccessibleMem,
440440
convertModRefInfoToLLVM(memAttr.getInaccessibleMem())) |
441441
llvm::MemoryEffects(llvm::MemoryEffects::Location::Other,
442-
convertModRefInfoToLLVM(memAttr.getOther()));
442+
convertModRefInfoToLLVM(memAttr.getOther())) |
443+
llvm::MemoryEffects(llvm::MemoryEffects::Location::ErrnoMem,
444+
convertModRefInfoToLLVM(memAttr.getErrnoMem())) |
445+
llvm::MemoryEffects(
446+
llvm::MemoryEffects::Location::TargetMem0,
447+
convertModRefInfoToLLVM(memAttr.getTargetMem0())) |
448+
llvm::MemoryEffects(llvm::MemoryEffects::Location::TargetMem1,
449+
convertModRefInfoToLLVM(memAttr.getTargetMem1()));
443450
call->setMemoryEffects(memEffects);
444451
}
445452

0 commit comments

Comments
 (0)