[Mlir-commits] [mlir] [MLIR][GPUToLLVMSPV] Use global & local memory scope for GPUBarrierConversion (PR #169026)
Tomek KuczyĆski
llvmlistbot at llvm.org
Sun Nov 23 23:26:45 PST 2025
https://github.com/dev-tomek updated https://github.com/llvm/llvm-project/pull/169026
>From 6d1c42a9f33e23ebc9afb2169bea375a41453b56 Mon Sep 17 00:00:00 2001
From: dev-tomek <tomek.kuczynski at intel.com>
Date: Fri, 21 Nov 2025 10:40:30 +0000
Subject: [PATCH] [MLIR][GPUToLLVMSPV] Use global & local memory scope for
GPUBarrierConversion
---
.../Conversion/GPUToLLVMSPV/GPUToLLVMSPV.cpp | 17 +++++++++++------
.../GPUToLLVMSPV/gpu-to-llvm-spv.mlir | 2 +-
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/mlir/lib/Conversion/GPUToLLVMSPV/GPUToLLVMSPV.cpp b/mlir/lib/Conversion/GPUToLLVMSPV/GPUToLLVMSPV.cpp
index 425594b3382f0..8f8f5c4b8ba13 100644
--- a/mlir/lib/Conversion/GPUToLLVMSPV/GPUToLLVMSPV.cpp
+++ b/mlir/lib/Conversion/GPUToLLVMSPV/GPUToLLVMSPV.cpp
@@ -93,12 +93,14 @@ namespace {
// Barriers
//===----------------------------------------------------------------------===//
-/// Replace `gpu.barrier` with an `llvm.call` to `barrier` with
-/// `CLK_LOCAL_MEM_FENCE` argument, indicating work-group memory scope:
+/// Replace `gpu.barrier` with an `llvm.call` to `barrier` using
+/// `CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE`, ensuring that all memory
+/// accesses are visible to all work-items in the work-group.
/// ```
/// // gpu.barrier
-/// %c1 = llvm.mlir.constant(1: i32) : i32
-/// llvm.call spir_funccc @_Z7barrierj(%c1) : (i32) -> ()
+/// // 3 = CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE
+/// %c3 = llvm.mlir.constant(3: i32) : i32
+/// llvm.call spir_funccc @_Z7barrierj(%c3) : (i32) -> ()
/// ```
struct GPUBarrierConversion final : ConvertOpToLLVMPattern<gpu::BarrierOp> {
using ConvertOpToLLVMPattern::ConvertOpToLLVMPattern;
@@ -116,12 +118,15 @@ struct GPUBarrierConversion final : ConvertOpToLLVMPattern<gpu::BarrierOp> {
lookupOrCreateSPIRVFn(moduleOp, funcName, flagTy, voidTy,
/*isMemNone=*/false, /*isConvergent=*/true);
- // Value used by SPIR-V backend to represent `CLK_LOCAL_MEM_FENCE`.
+ // Values used by SPIR-V backend to represent a combination of
+ // `CLK_LOCAL_MEM_FENCE` and `CLK_GLOBAL_MEM_FENCE`.
// See `llvm/lib/Target/SPIRV/SPIRVBuiltins.td`.
constexpr int64_t localMemFenceFlag = 1;
+ constexpr int64_t globalMemFenceFlag = 2;
+ constexpr int64_t localGlobalMemFenceFlag = localMemFenceFlag | globalMemFenceFlag;
Location loc = op->getLoc();
Value flag =
- LLVM::ConstantOp::create(rewriter, loc, flagTy, localMemFenceFlag);
+ LLVM::ConstantOp::create(rewriter, loc, flagTy, localGlobalMemFenceFlag);
rewriter.replaceOp(op, createSPIRVBuiltinCall(loc, rewriter, func, flag));
return success();
}
diff --git a/mlir/test/Conversion/GPUToLLVMSPV/gpu-to-llvm-spv.mlir b/mlir/test/Conversion/GPUToLLVMSPV/gpu-to-llvm-spv.mlir
index 0c2c021b9d43c..227287a9adcee 100644
--- a/mlir/test/Conversion/GPUToLLVMSPV/gpu-to-llvm-spv.mlir
+++ b/mlir/test/Conversion/GPUToLLVMSPV/gpu-to-llvm-spv.mlir
@@ -215,7 +215,7 @@ gpu.module @barriers {
// CHECK-LABEL: gpu_barrier
func.func @gpu_barrier() {
- // CHECK: [[FLAGS:%.*]] = llvm.mlir.constant(1 : i32) : i32
+ // CHECK: [[FLAGS:%.*]] = llvm.mlir.constant(3 : i32) : i32
// CHECK: llvm.call spir_funccc @_Z7barrierj([[FLAGS]]) {
// CHECK-SAME-DAG: no_unwind
// CHECK-SAME-DAG: convergent
More information about the Mlir-commits
mailing list