[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