Skip to content

Commit b03081e

Browse files
authored
[mlir][OpenMP] set correct insert point after creating a barrier (#142997)
Fixes #138436
1 parent 052d588 commit b03081e

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5737,7 +5737,13 @@ convertHostOrTargetOperation(Operation *op, llvm::IRBuilderBase &builder,
57375737
llvm::OpenMPIRBuilder::InsertPointOrErrorTy afterIP =
57385738
ompBuilder->createBarrier(builder.saveIP(),
57395739
llvm::omp::OMPD_barrier);
5740-
return handleError(afterIP, *op);
5740+
LogicalResult res = handleError(afterIP, *op);
5741+
if (res.succeeded()) {
5742+
// If the barrier generated a cancellation check, the insertion
5743+
// point might now need to be changed to a new continuation block
5744+
builder.restoreIP(*afterIP);
5745+
}
5746+
return res;
57415747
})
57425748
.Case([&](omp::TaskyieldOp op) {
57435749
if (failed(checkImplementationStatus(*op)))
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// RUN: mlir-translate --mlir-to-llvmir %s | FileCheck %s
2+
3+
// Regression test for a compiler crash. Ensure that the insertion point is set
4+
// correctly after the barrier's cancel check
5+
6+
llvm.func @test() {
7+
omp.parallel {
8+
omp.cancel cancellation_construct_type(parallel)
9+
omp.barrier
10+
omp.terminator
11+
}
12+
llvm.return
13+
}
14+
15+
// CHECK-LABEL: define internal void @test..omp_par
16+
// CHECK: omp.par.entry:
17+
// CHECK: %[[VAL_4:.*]] = alloca i32, align 4
18+
// CHECK: %[[VAL_5:.*]] = load i32, ptr %[[VAL_6:.*]], align 4
19+
// CHECK: store i32 %[[VAL_5]], ptr %[[VAL_4]], align 4
20+
// CHECK: %[[VAL_7:.*]] = load i32, ptr %[[VAL_4]], align 4
21+
// CHECK: br label %[[VAL_8:.*]]
22+
// CHECK: omp.region.after_alloca: ; preds = %[[VAL_9:.*]]
23+
// CHECK: br label %[[VAL_10:.*]]
24+
// CHECK: omp.par.region: ; preds = %[[VAL_8]]
25+
// CHECK: br label %[[VAL_11:.*]]
26+
// CHECK: omp.par.region1: ; preds = %[[VAL_10]]
27+
// CHECK: %[[VAL_12:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
28+
// CHECK: %[[VAL_13:.*]] = call i32 @__kmpc_cancel(ptr @1, i32 %[[VAL_12]], i32 1)
29+
// CHECK: %[[VAL_14:.*]] = icmp eq i32 %[[VAL_13]], 0
30+
// CHECK: br i1 %[[VAL_14]], label %[[VAL_15:.*]], label %[[VAL_16:.*]]
31+
// CHECK: omp.par.region1.cncl: ; preds = %[[VAL_11]]
32+
// CHECK: %[[VAL_17:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
33+
// CHECK: %[[VAL_18:.*]] = call i32 @__kmpc_cancel_barrier(ptr @2, i32 %[[VAL_17]])
34+
// CHECK: br label %[[VAL_19:.*]]
35+
// CHECK: omp.par.region1.split: ; preds = %[[VAL_11]]
36+
// CHECK: %[[VAL_20:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
37+
// CHECK: %[[VAL_21:.*]] = call i32 @__kmpc_cancel_barrier(ptr @3, i32 %[[VAL_20]])
38+
// CHECK: %[[VAL_22:.*]] = icmp eq i32 %[[VAL_21]], 0
39+
// CHECK: br i1 %[[VAL_22]], label %[[VAL_23:.*]], label %[[VAL_24:.*]]
40+
// CHECK: omp.par.region1.split.cncl: ; preds = %[[VAL_15]]
41+
// CHECK: br label %[[VAL_19]]
42+
// CHECK: omp.par.region1.split.cont: ; preds = %[[VAL_15]]
43+
// CHECK: br label %[[VAL_25:.*]]
44+
// CHECK: omp.region.cont: ; preds = %[[VAL_23]]
45+
// CHECK: br label %[[VAL_26:.*]]
46+
// CHECK: omp.par.pre_finalize: ; preds = %[[VAL_25]]
47+
// CHECK: br label %[[VAL_19]]
48+
// CHECK: omp.par.exit.exitStub: ; preds = %[[VAL_26]], %[[VAL_24]], %[[VAL_16]]
49+
// CHECK: ret void
50+

0 commit comments

Comments
 (0)