Skip to content

Commit f1e7b1e

Browse files
committed
Atomic Options Support
1 parent 282af2d commit f1e7b1e

File tree

3 files changed

+43
-6
lines changed

3 files changed

+43
-6
lines changed

mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2164,12 +2164,18 @@ def LLVM_AtomicRMWOp : LLVM_MemAccessOpBase<"atomicrmw", [
21642164
LLVM_AtomicRMWType:$val, AtomicOrdering:$ordering,
21652165
OptionalAttr<StrAttr>:$syncscope,
21662166
OptionalAttr<I64Attr>:$alignment,
2167-
UnitAttr:$volatile_);
2167+
UnitAttr:$volatile_,
2168+
UnitAttr:$amdgpu_no_fine_grained_memory,
2169+
UnitAttr:$amdgpu_ignore_denormal_mode,
2170+
UnitAttr:$amdgpu_no_remote_memory);
21682171
// Append the aliasing related attributes defined in LLVM_MemAccessOpBase.
21692172
let arguments = !con(args, aliasAttrs);
21702173
let results = (outs LLVM_AtomicRMWType:$res);
21712174
let assemblyFormat = [{
2172-
(`volatile` $volatile_^)? $bin_op $ptr `,` $val
2175+
(`volatile` $volatile_^)?
2176+
(`amdgpu_ignore_denormal_mode` $amdgpu_ignore_denormal_mode^)?
2177+
(`amdgpu_no_fine_grained_memory` $amdgpu_no_fine_grained_memory^)?
2178+
(`amdgpu_no_remote_memory` $amdgpu_no_remote_memory^)? $bin_op $ptr `,` $val
21732179
(`syncscope` `(` $syncscope^ `)`)? $ordering attr-dict `:`
21742180
qualified(type($ptr)) `,` type($val)
21752181
}];
@@ -2179,6 +2185,19 @@ def LLVM_AtomicRMWOp : LLVM_MemAccessOpBase<"atomicrmw", [
21792185
convertAtomicBinOpToLLVM($bin_op), $ptr, $val, llvm::MaybeAlign(),
21802186
convertAtomicOrderingToLLVM($ordering));
21812187
$res = inst;
2188+
auto &llvmContext = inst->getContext();
2189+
if($amdgpu_ignore_denormal_mode) {
2190+
llvm::MDNode *metadata = llvm::MDNode::get(llvmContext, std::nullopt);
2191+
inst->setMetadata((llvmContext).getMDKindID("amdgpu.ignore.denormal.mode"), metadata);
2192+
}
2193+
if($amdgpu_no_fine_grained_memory) {
2194+
llvm::MDNode *metadata = llvm::MDNode::get(llvmContext, std::nullopt);
2195+
inst->setMetadata(llvmContext.getMDKindID("amdgpu.no.fine.grained.memory"), metadata);
2196+
}
2197+
if($amdgpu_no_remote_memory) {
2198+
llvm::MDNode *metadata = llvm::MDNode::get(llvmContext, std::nullopt);
2199+
inst->setMetadata((llvmContext).getMDKindID("amdgpu.no.remote.memory"), metadata);
2200+
}
21822201
}] # setVolatileCode
21832202
# setSyncScopeCode
21842203
# setAlignmentCode
@@ -2192,12 +2211,16 @@ def LLVM_AtomicRMWOp : LLVM_MemAccessOpBase<"atomicrmw", [
21922211
convertAtomicOrderingFromLLVM(atomicInst->getOrdering()),
21932212
getLLVMSyncScope(atomicInst), alignment, atomicInst->isVolatile());
21942213
}];
2195-
list<int> llvmArgIndices = [-1, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1];
2214+
list<int> llvmArgIndices = [-1, 0, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
2215+
-1];
21962216
let builders = [
2197-
OpBuilder<(ins "LLVM::AtomicBinOp":$binOp, "Value":$ptr, "Value":$val,
2217+
OpBuilder<(ins "LLVM::AtomicBinOp":$binOp, "Value":$ptr,"Value":$val,
21982218
"LLVM::AtomicOrdering":$ordering,
21992219
CArg<"StringRef", "StringRef()">:$syncscope,
2200-
CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile
2220+
CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile,
2221+
CArg<"bool", "false">:$isAmdgpuIgnoreDenormalMode,
2222+
CArg<"bool", "false">:$isAmdgpuNoFineGrainedMemory,
2223+
CArg<"bool", "false">:$isAmdgpuNoRemoteMemory
22012224
)>
22022225
];
22032226
let hasVerifier = 1;

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3274,10 +3274,15 @@ OpFoldResult LLVM::ConstantOp::fold(FoldAdaptor) { return getValue(); }
32743274
void AtomicRMWOp::build(OpBuilder &builder, OperationState &state,
32753275
AtomicBinOp binOp, Value ptr, Value val,
32763276
AtomicOrdering ordering, StringRef syncscope,
3277-
unsigned alignment, bool isVolatile) {
3277+
unsigned alignment, bool isVolatile,
3278+
bool isAmdgpuIgnoreDenormalMode,
3279+
bool isAmdgpuNoFineGrainedMemory,
3280+
bool isAmdgpuNoRemoteMemory) {
32783281
build(builder, state, val.getType(), binOp, ptr, val, ordering,
32793282
!syncscope.empty() ? builder.getStringAttr(syncscope) : nullptr,
32803283
alignment ? builder.getI64IntegerAttr(alignment) : nullptr, isVolatile,
3284+
isAmdgpuIgnoreDenormalMode, isAmdgpuNoFineGrainedMemory,
3285+
isAmdgpuNoRemoteMemory,
32813286
/*access_groups=*/nullptr,
32823287
/*alias_scopes=*/nullptr, /*noalias_scopes=*/nullptr, /*tbaa=*/nullptr);
32833288
}

mlir/test/Target/LLVMIR/llvmir.mlir

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,6 +1568,15 @@ llvm.func @atomicrmw(
15681568
// CHECK-SAME: syncscope("singlethread")
15691569
// CHECK-SAME: align 8
15701570
%27 = llvm.atomicrmw volatile udec_wrap %i32_ptr, %i32 syncscope("singlethread") monotonic {alignment = 8 : i64} : !llvm.ptr, i32
1571+
// CHECK: atomicrmw
1572+
// CHECK-SAME: !amdgpu.ignore.denormal.mode
1573+
%28 = llvm.atomicrmw amdgpu_ignore_denormal_mode udec_wrap %i32_ptr, %i32 monotonic {alignment = 8 : i64} : !llvm.ptr, i32
1574+
// CHECK: atomicrmw
1575+
// CHECK-SAME: !amdgpu.no.fine.grained.memory
1576+
%29 = llvm.atomicrmw amdgpu_no_fine_grained_memory udec_wrap %i32_ptr, %i32 monotonic {alignment = 8 : i64} : !llvm.ptr, i32
1577+
// CHECK: atomicrmw
1578+
// CHECK-SAME: !amdgpu.no.remote.memory
1579+
%30 = llvm.atomicrmw amdgpu_no_remote_memory udec_wrap %i32_ptr, %i32 monotonic {alignment = 8 : i64} : !llvm.ptr, i32
15711580
llvm.return
15721581
}
15731582

0 commit comments

Comments
 (0)