Skip to content

Commit 77c1f50

Browse files
committed
Add a scheduling barrier guard around inlineAsm lds.barrier
This commit adds a scheduling regions around the inlineAsm to guard against possible complications arising from them interfering with the backend scheduler / register allocation.
1 parent cce1fa3 commit 77c1f50

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

mlir/lib/Conversion/AMDGPUToROCDL/AMDGPUToROCDL.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,15 +290,23 @@ struct LDSBarrierOpLowering : public ConvertOpToLLVMPattern<LDSBarrierOp> {
290290
if (requiresInlineAsm) {
291291
auto asmDialectAttr = LLVM::AsmDialectAttr::get(rewriter.getContext(),
292292
LLVM::AsmDialect::AD_ATT);
293+
Location loc = op->getLoc();
294+
// Ensure the inlineAsm is guarded with a scheduling region
295+
// So it will not interfere with backend compilation more than
296+
// it needs.
297+
rewriter.create<amdgpu::SchedBarrierOp>(
298+
loc, amdgpu::sched_barrier_opt_enum::none);
293299
const char *asmStr =
294300
";;;WARNING: BREAKS DEBUG WATCHES\ns_waitcnt lgkmcnt(0)\ns_barrier";
295301
const char *constraints = "";
296-
rewriter.replaceOpWithNewOp<LLVM::InlineAsmOp>(
297-
op,
302+
rewriter.create<LLVM::InlineAsmOp>(
303+
loc,
298304
/*resultTypes=*/TypeRange(), /*operands=*/ValueRange(),
299305
/*asm_string=*/asmStr, constraints, /*has_side_effects=*/true,
300306
/*is_align_stack=*/false, /*asm_dialect=*/asmDialectAttr,
301307
/*operand_attrs=*/ArrayAttr());
308+
rewriter.replaceOpWithNewOp<amdgpu::SchedBarrierOp>(
309+
op, amdgpu::sched_barrier_opt_enum::none);
302310
return success();
303311
}
304312
if (chipset.majorVersion < 12) {

mlir/test/Conversion/AMDGPUToROCDL/amdgpu-to-rocdl.mlir

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,14 +239,18 @@ func.func @amdgpu_raw_buffer_atomic_cmpswap_v2f16(%src : vector<2xf16>, %cmp : v
239239

240240
// CHECK-LABEL: func @lds_barrier
241241
func.func @lds_barrier() {
242+
// GFX908: rocdl.sched.barrier 0
242243
// GFX908: llvm.inline_asm has_side_effects asm_dialect = att
243244
// GFX908-SAME: ";;;WARNING: BREAKS DEBUG WATCHES\0As_waitcnt lgkmcnt(0)\0As_barrier"
245+
// GFX908: rocdl.sched.barrier 0
244246
// GFX90A: rocdl.waitcnt -7937
245247
// GFX90A-NEXT: rocdl.s.barrier
246248
// GFX10: rocdl.waitcnt -16129
247249
// GFX10-NEXT: rocdl.s.barrier
250+
// GFX11: rocdl.sched.barrier 0
248251
// GFX11: llvm.inline_asm has_side_effects asm_dialect = att
249252
// GFX11-SAME: ";;;WARNING: BREAKS DEBUG WATCHES\0As_waitcnt lgkmcnt(0)\0As_barrier"
253+
// GFX11: rocdl.sched.barrier 0
250254
// GFX12: rocdl.s.wait.dscnt 0
251255
// GFX12-NEXT: rocdl.s.barrier.signal -1
252256
// GFX12-NEXT: rocdl.s.barrier.wait -1

0 commit comments

Comments
 (0)