[Mlir-commits] [mlir] 07d07be - [mlir][OpenMP] Fix infinite loop after #174105 (#174736)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Wed Jan 7 02:48:21 PST 2026


Author: Tom Eccles
Date: 2026-01-07T10:48:16Z
New Revision: 07d07be73d96c5b15775af78d37570fea221cb3e

URL: https://github.com/llvm/llvm-project/commit/07d07be73d96c5b15775af78d37570fea221cb3e
DIFF: https://github.com/llvm/llvm-project/commit/07d07be73d96c5b15775af78d37570fea221cb3e.diff

LOG: [mlir][OpenMP] Fix infinite loop after #174105 (#174736)

Added: 
    

Modified: 
    mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
    mlir/test/Target/LLVMIR/openmp-private-barrier-single.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 614f06017a324..55df986ad3d11 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -1715,7 +1715,8 @@ allocatePrivateVars(llvm::IRBuilderBase &builder,
 /// This can't always be determined statically, but when we can, it is good to
 /// avoid generating compiler-added barriers which will deadlock the program.
 static bool opIsInSingleThread(mlir::Operation *op) {
-  while (mlir::Operation *parent = op->getParentOp()) {
+  for (mlir::Operation *parent = op->getParentOp(); parent != nullptr;
+       parent = parent->getParentOp()) {
     if (mlir::isa<omp::SingleOp, omp::CriticalOp>(parent))
       return true;
 

diff  --git a/mlir/test/Target/LLVMIR/openmp-private-barrier-single.mlir b/mlir/test/Target/LLVMIR/openmp-private-barrier-single.mlir
index 9dd66a34a17f8..0c003db0903da 100644
--- a/mlir/test/Target/LLVMIR/openmp-private-barrier-single.mlir
+++ b/mlir/test/Target/LLVMIR/openmp-private-barrier-single.mlir
@@ -21,6 +21,7 @@ omp.private {type = firstprivate} @_QFwsloop_privateEc_firstprivate_ref_c8 : !ll
   omp.yield
 }
 
+// CHECK-LABEL wsloop_private_
 llvm.func @wsloop_private_(%arg0: !llvm.ptr {fir.bindc_name = "y"}) attributes {fir.internal_name = "_QPwsloop_private", frame_pointer = #llvm.framePointerKind<all>, target_cpu = "x86-64"} {
   %0 = llvm.mlir.constant(1 : i64) : i64
   %1 = llvm.alloca %0 x f32 {bindc_name = "x"} : (i64) -> !llvm.ptr
@@ -45,3 +46,43 @@ llvm.func @wsloop_private_(%arg0: !llvm.ptr {fir.bindc_name = "y"}) attributes {
   }
   llvm.return
 }
+
+
+// Check for a case where  the barrier should be applied. Regression check for
+// infinite loop.
+omp.private {type = private} @_QFsubEi_private_i32 : i32
+omp.private {type = firstprivate} @_QFsubEp_firstprivate_i32 : i32 copy {
+^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):
+  %0 = llvm.load %arg0 : !llvm.ptr -> i32
+  llvm.store %0, %arg1 : i32, !llvm.ptr
+  omp.yield(%arg1 : !llvm.ptr)
+}
+
+// CHECK-LABEL: _QPsub
+llvm.func @_QPsub() {
+  %0 = llvm.mlir.constant(100 : i32) : i32
+  %1 = llvm.mlir.constant(1 : i32) : i32
+  %2 = llvm.mlir.constant(1 : i64) : i64
+  %3 = llvm.alloca %2 x i32 {bindc_name = "p"} : (i64) -> !llvm.ptr
+  %4 = llvm.alloca %2 x i32 {bindc_name = "i"} : (i64) -> !llvm.ptr
+  llvm.store %0, %3 : i32, !llvm.ptr
+  omp.wsloop private(@_QFsubEp_firstprivate_i32 %3 -> %arg0, @_QFsubEi_private_i32 %4 -> %arg1 : !llvm.ptr, !llvm.ptr) private_barrier {
+  // CHECK: omp.private.copy:
+  // CHECK: __kmpc_barrier
+  // CHECK: br label
+    omp.loop_nest (%arg2) : i32 = (%1) to (%1) inclusive step (%1) {
+      llvm.store %arg2, %arg1 : i32, !llvm.ptr
+      %5 = llvm.add %arg2, %1 : i32
+      %6 = llvm.icmp "sgt" %5, %1 : i32
+      llvm.cond_br %6, ^bb1, ^bb2
+    ^bb1:  // pred: ^bb0
+      llvm.store %5, %arg1 : i32, !llvm.ptr
+      %7 = llvm.load %arg0 : !llvm.ptr -> i32
+      llvm.store %7, %3 : i32, !llvm.ptr
+      llvm.br ^bb2
+    ^bb2:  // 2 preds: ^bb0, ^bb1
+      omp.yield
+    }
+  }
+  llvm.return
+}


        


More information about the Mlir-commits mailing list