[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