Skip to content

Commit 89f3657

Browse files
tblahkcloudy0717
authored andcommitted
[OMPIRBuilder] CANCEL IF(FALSE) is still a cancellation point (llvm#170095)
From OpenMP 4.0: > When an if clause is present on a cancel construct and the if expression > evaluates to false, the cancel construct does not activate cancellation. > The cancellation point associated with the cancel construct is always > encountered regardless of the value of the if expression. This wording is retained unmodified in OpenMP 6.0. This re-opens the already approved PR llvm#164587, which was closed by accident. The only changes are a rebase.
1 parent f79ab42 commit 89f3657

File tree

4 files changed

+116
-74
lines changed

4 files changed

+116
-74
lines changed

clang/test/OpenMP/cancel_codegen.cpp

Lines changed: 55 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -774,8 +774,8 @@ for (int i = 0; i < argc; ++i) {
774774
// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM12]])
775775
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_AFTER:%.*]]
776776
// CHECK3: omp_section_loop.after:
777-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER13:%.*]]
778-
// CHECK3: omp_section_loop.preheader13:
777+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_PREHEADER16:%.*]]
778+
// CHECK3: omp_section_loop.preheader16:
779779
// CHECK3-NEXT: store i32 0, ptr [[P_LOWERBOUND29]], align 4
780780
// CHECK3-NEXT: store i32 1, ptr [[P_UPPERBOUND30]], align 4
781781
// CHECK3-NEXT: store i32 1, ptr [[P_STRIDE31]], align 4
@@ -785,52 +785,52 @@ for (int i = 0; i < argc; ++i) {
785785
// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[P_UPPERBOUND30]], align 4
786786
// CHECK3-NEXT: [[TMP11:%.*]] = sub i32 [[TMP10]], [[TMP9]]
787787
// CHECK3-NEXT: [[TMP12:%.*]] = add i32 [[TMP11]], 1
788-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_HEADER14:%.*]]
789-
// CHECK3: omp_section_loop.header14:
790-
// CHECK3-NEXT: [[OMP_SECTION_LOOP_IV20:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER13]] ], [ [[OMP_SECTION_LOOP_NEXT22:%.*]], [[OMP_SECTION_LOOP_INC17:%.*]] ]
791-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_COND15:%.*]]
792-
// CHECK3: omp_section_loop.cond15:
788+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_HEADER17:%.*]]
789+
// CHECK3: omp_section_loop.header17:
790+
// CHECK3-NEXT: [[OMP_SECTION_LOOP_IV20:%.*]] = phi i32 [ 0, [[OMP_SECTION_LOOP_PREHEADER16]] ], [ [[OMP_SECTION_LOOP_NEXT22:%.*]], [[OMP_SECTION_LOOP_INC17:%.*]] ]
791+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_COND18:%.*]]
792+
// CHECK3: omp_section_loop.cond18:
793793
// CHECK3-NEXT: [[OMP_SECTION_LOOP_CMP21:%.*]] = icmp ult i32 [[OMP_SECTION_LOOP_IV20]], [[TMP12]]
794-
// CHECK3-NEXT: br i1 [[OMP_SECTION_LOOP_CMP21]], label [[OMP_SECTION_LOOP_BODY16:%.*]], label [[OMP_SECTION_LOOP_EXIT18:%.*]]
795-
// CHECK3: omp_section_loop.body16:
794+
// CHECK3-NEXT: br i1 [[OMP_SECTION_LOOP_CMP21]], label [[OMP_SECTION_LOOP_BODY19:%.*]], label [[OMP_SECTION_LOOP_EXIT21:%.*]]
795+
// CHECK3: omp_section_loop.body19:
796796
// CHECK3-NEXT: [[TMP13:%.*]] = add i32 [[OMP_SECTION_LOOP_IV20]], [[TMP9]]
797797
// CHECK3-NEXT: [[TMP14:%.*]] = mul i32 [[TMP13]], 1
798798
// CHECK3-NEXT: [[TMP15:%.*]] = add i32 [[TMP14]], 0
799799
// CHECK3-NEXT: switch i32 [[TMP15]], label [[OMP_SECTION_LOOP_BODY16_SECTIONS_AFTER:%.*]] [
800-
// CHECK3-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE23:%.*]]
801-
// CHECK3-NEXT: i32 1, label [[OMP_SECTION_LOOP_BODY_CASE25:%.*]]
800+
// CHECK3-NEXT: i32 0, label [[OMP_SECTION_LOOP_BODY_CASE26:%.*]]
801+
// CHECK3-NEXT: i32 1, label [[OMP_SECTION_LOOP_BODY_CASE29:%.*]]
802802
// CHECK3-NEXT: ]
803-
// CHECK3: omp_section_loop.body.case23:
803+
// CHECK3: omp_section_loop.body.case26:
804804
// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM24:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
805805
// CHECK3-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM24]], i32 3)
806806
// CHECK3-NEXT: [[TMP17:%.*]] = icmp eq i32 [[TMP16]], 0
807-
// CHECK3-NEXT: br i1 [[TMP17]], label [[OMP_SECTION_LOOP_BODY_CASE23_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE23_CNCL:%.*]]
808-
// CHECK3: omp_section_loop.body.case23.split:
809-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY_CASE23_SECTION_AFTER:%.*]]
810-
// CHECK3: omp_section_loop.body.case23.section.after:
807+
// CHECK3-NEXT: br i1 [[TMP17]], label [[OMP_SECTION_LOOP_BODY_CASE26_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE26_CNCL:%.*]]
808+
// CHECK3: omp_section_loop.body.case26.split:
809+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY_CASE26_SECTION_AFTER:%.*]]
810+
// CHECK3: omp_section_loop.body.case26.section.after:
811811
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY16_SECTIONS_AFTER]]
812-
// CHECK3: omp_section_loop.body.case26:
812+
// CHECK3: omp_section_loop.body.case29:
813813
// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM27:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
814814
// CHECK3-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM27]], i32 3)
815815
// CHECK3-NEXT: [[TMP19:%.*]] = icmp eq i32 [[TMP18]], 0
816-
// CHECK3-NEXT: br i1 [[TMP19]], label [[OMP_SECTION_LOOP_BODY_CASE25_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE25_CNCL:%.*]]
817-
// CHECK3: omp_section_loop.body.case26.split:
818-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY_CASE25_SECTION_AFTER26:%.*]]
819-
// CHECK3: omp_section_loop.body.case26.section.after27:
820-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY_CASE25_SECTION_AFTER:%.*]]
821-
// CHECK3: omp_section_loop.body.case26.section.after:
822-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY16_SECTIONS_AFTER]]
823-
// CHECK3: omp_section_loop.body16.sections.after:
824-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_INC17]]
825-
// CHECK3: omp_section_loop.inc17:
816+
// CHECK3-NEXT: br i1 [[TMP19]], label [[OMP_SECTION_LOOP_BODY_CASE29_SPLIT:%.*]], label [[OMP_SECTION_LOOP_BODY_CASE29_CNCL:%.*]]
817+
// CHECK3: omp_section_loop.body.case29.split:
818+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY_CASE25_SECTION_AFTER29:%.*]]
819+
// CHECK3: omp_section_loop.body.case29.section.after30:
820+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY_CASE29_SECTION_AFTER:%.*]]
821+
// CHECK3: omp_section_loop.body.case29.section.after:
822+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_BODY19_SECTIONS_AFTER:.*]]
823+
// CHECK3: omp_section_loop.body19.sections.after:
824+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_INC20:.*]]
825+
// CHECK3: omp_section_loop.inc20:
826826
// CHECK3-NEXT: [[OMP_SECTION_LOOP_NEXT22]] = add nuw i32 [[OMP_SECTION_LOOP_IV20]], 1
827-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_HEADER14]]
828-
// CHECK3: omp_section_loop.exit18:
827+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_HEADER17]]
828+
// CHECK3: omp_section_loop.exit21:
829829
// CHECK3-NEXT: call void @__kmpc_for_static_fini(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM32]])
830830
// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM33:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
831831
// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[OMP_GLOBAL_THREAD_NUM33]])
832-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_AFTER19:%.*]]
833-
// CHECK3: omp_section_loop.after19:
832+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_AFTER22:%.*]]
833+
// CHECK3: omp_section_loop.after22:
834834
// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4
835835
// CHECK3-NEXT: store i32 [[TMP20]], ptr [[DOTCAPTURE_EXPR_]], align 4
836836
// CHECK3-NEXT: [[TMP21:%.*]] = load i32, ptr [[DOTCAPTURE_EXPR_]], align 4
@@ -887,11 +887,11 @@ for (int i = 0; i < argc; ++i) {
887887
// CHECK3: .cancel.exit:
888888
// CHECK3-NEXT: br label [[CANCEL_EXIT:%.*]]
889889
// CHECK3: omp_section_loop.body.case.cncl:
890-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT]]
891-
// CHECK3: omp_section_loop.body.case23.cncl:
892-
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT18]]
890+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT:.*]]
893891
// CHECK3: omp_section_loop.body.case26.cncl:
894-
// CHECK3-NEXT: br label [[OMP_REGION_FINALIZE:.*]]
892+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT18:.*]]
893+
// CHECK3: omp_section_loop.body.case29.cncl:
894+
// CHECK3-NEXT: br label [[OMP_SECTION_LOOP_EXIT21:.*]]
895895
// CHECK3: .cancel.continue:
896896
// CHECK3-NEXT: br label [[OMP_IF_END:%.*]]
897897
// CHECK3: omp_if.else:
@@ -950,8 +950,17 @@ for (int i = 0; i < argc; ++i) {
950950
// CHECK3-NEXT: [[TOBOOL:%.*]] = fcmp une float [[TMP2]], 0.000000e+00
951951
// CHECK3-NEXT: br i1 [[TOBOOL]], label [[TMP14:%.*]], label [[TMP3:%.*]]
952952
// CHECK3: 3:
953-
// CHECK3-NEXT: br label [[TMP4:%.*]]
954-
// CHECK3: 4:
953+
// CHECK3-NEXT: %[[GTN:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
954+
// CHECK3-NEXT: %[[CANCEL_POINT:.*]] = call i32 @__kmpc_cancellationpoint(ptr @1, i32 %[[GTN]], i32 1)
955+
// CHECK3-NEXT: %[[COND:.*]] = icmp eq i32 %[[CANCEL_POINT]], 0
956+
// CHECK3-NEXT: br i1 %[[COND]], label %[[SPLIT:.*]], label %[[CNCL:.*]]
957+
// CHECK3: .cncl:
958+
// CHECK3-NEXT: br label %[[FINI:.*]]
959+
// CHECK3: .fini:
960+
// CHECK3-NEXT: br label %[[EXIT_STUB:omp.par.exit.exitStub]]
961+
// CHECK3: .split:
962+
// CHECK3-NEXT: br label [[TMP6:%.*]]
963+
// CHECK3: 6:
955964
// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[LOADGEP_ARGC_ADDR]], align 4
956965
// CHECK3-NEXT: [[CONV:%.*]] = trunc i32 [[TMP5]] to i8
957966
// CHECK3-NEXT: [[TMP6:%.*]] = load ptr, ptr [[LOADGEP_ARGV_ADDR]], align 8
@@ -963,10 +972,8 @@ for (int i = 0; i < argc; ++i) {
963972
// CHECK3-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_cancel_barrier(ptr @[[GLOB3:[0-9]+]], i32 [[OMP_GLOBAL_THREAD_NUM4]])
964973
// CHECK3-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 0
965974
// CHECK3-NEXT: br i1 [[TMP9]], label [[DOTCONT:%.*]], label [[DOTCNCL5:%.*]]
966-
// CHECK3: .cncl4:
967-
// CHECK3-NEXT: br label [[FINI:%.*]]
968-
// CHECK3: .fini
969-
// CHECK3-NEXT: br label %[[EXIT_STUB:omp.par.exit.exitStub]]
975+
// CHECK3: .cncl7:
976+
// CHECK3-NEXT: br label %[[FINI]]
970977
// CHECK3: .cont:
971978
// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[LOADGEP_ARGC_ADDR]], align 4
972979
// CHECK3-NEXT: [[TMP11:%.*]] = load ptr, ptr [[LOADGEP_ARGV_ADDR]], align 8
@@ -982,16 +989,16 @@ for (int i = 0; i < argc; ++i) {
982989
// CHECK3: omp.par.region.parallel.after:
983990
// CHECK3-NEXT: br label [[OMP_PAR_PRE_FINALIZE:%.*]]
984991
// CHECK3: omp.par.pre_finalize:
985-
// CHECK3-NEXT: br label [[FINI]]
986-
// CHECK3: 14:
992+
// CHECK3-NEXT: br label %[[FINI]]
993+
// CHECK3: 16:
987994
// CHECK3-NEXT: [[OMP_GLOBAL_THREAD_NUM1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])
988995
// CHECK3-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_cancel(ptr @[[GLOB1]], i32 [[OMP_GLOBAL_THREAD_NUM1]], i32 1)
989996
// CHECK3-NEXT: [[TMP16:%.*]] = icmp eq i32 [[TMP15]], 0
990997
// CHECK3-NEXT: br i1 [[TMP16]], label [[DOTSPLIT:%.*]], label [[DOTCNCL:%.*]]
991-
// CHECK3: .cncl:
992-
// CHECK3-NEXT: br label [[FINI]]
993-
// CHECK3: .split:
994-
// CHECK3-NEXT: br label [[TMP4]]
998+
// CHECK3: .cncl4:
999+
// CHECK3-NEXT: br label %[[FINI]]
1000+
// CHECK3: .split3:
1001+
// CHECK3-NEXT: br label {{.+}}
9951002
// CHECK3: omp.par.exit.exitStub:
9961003
// CHECK3-NEXT: ret void
9971004
//
@@ -1160,7 +1167,7 @@ for (int i = 0; i < argc; ++i) {
11601167
// CHECK3: .omp.sections.case2.split:
11611168
// CHECK3-NEXT: br label [[DOTOMP_SECTIONS_CASE2_SECTION_AFTER:%.*]]
11621169
// CHECK3: .omp.sections.case2.section.after:
1163-
// CHECK3-NEXT: br label [[OMP_REGION_FINALIZE]]
1170+
// CHECK3-NEXT: br label [[OMP_REGION_FINALIZE:.*]]
11641171
// CHECK3: omp_region.finalize:
11651172
// CHECK3-NEXT: br label [[OMP_SECTIONS_EXIT:.*]]
11661173
// CHECK3: .omp.sections.case2.cncl:

llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1149,8 +1149,20 @@ OpenMPIRBuilder::createCancel(const LocationDescription &Loc,
11491149
auto *UI = Builder.CreateUnreachable();
11501150

11511151
Instruction *ThenTI = UI, *ElseTI = nullptr;
1152-
if (IfCondition)
1152+
if (IfCondition) {
11531153
SplitBlockAndInsertIfThenElse(IfCondition, UI, &ThenTI, &ElseTI);
1154+
1155+
// Even if the if condition evaluates to false, this should count as a
1156+
// cancellation point
1157+
Builder.SetInsertPoint(ElseTI);
1158+
auto ElseIP = Builder.saveIP();
1159+
1160+
InsertPointOrErrorTy IPOrErr = createCancellationPoint(
1161+
LocationDescription{ElseIP, Loc.DL}, CanceledDirective);
1162+
if (!IPOrErr)
1163+
return IPOrErr;
1164+
}
1165+
11541166
Builder.SetInsertPoint(ThenTI);
11551167

11561168
Value *CancelKind = nullptr;

llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -490,8 +490,8 @@ TEST_F(OpenMPIRBuilderTest, CreateCancelIfCond) {
490490
OMPBuilder.createCancel(Loc, Builder.getTrue(), OMPD_parallel));
491491
Builder.restoreIP(NewIP);
492492
EXPECT_FALSE(M->global_empty());
493-
EXPECT_EQ(M->size(), 3U);
494-
EXPECT_EQ(F->size(), 8U);
493+
EXPECT_EQ(M->size(), 4U);
494+
EXPECT_EQ(F->size(), 10U);
495495
EXPECT_EQ(BB->size(), 1U);
496496
ASSERT_TRUE(isa<BranchInst>(BB->getTerminator()));
497497
ASSERT_EQ(BB->getTerminator()->getNumSuccessors(), 2U);

mlir/test/Target/LLVMIR/openmp-cancel.mlir

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -60,28 +60,35 @@ llvm.func @cancel_parallel_if(%arg0 : i1) {
6060
// CHECK: omp.par.region: ; preds = %[[VAL_17]]
6161
// CHECK: br label %[[VAL_20:.*]]
6262
// CHECK: omp.par.region1: ; preds = %[[VAL_19]]
63-
// CHECK: br i1 %[[VAL_16]], label %[[VAL_21:.*]], label %[[VAL_22:.*]]
63+
// CHECK: br i1 %[[VAL_16]], label %[[SPLIT:.*]], label %[[VAL_22:.*]]
6464
// CHECK: 3: ; preds = %[[VAL_20]]
65-
// CHECK: br label %[[VAL_23:.*]]
66-
// CHECK: 4: ; preds = %[[VAL_22]], %[[VAL_24:.*]]
67-
// CHECK: br label %[[VAL_25:.*]]
68-
// CHECK: omp.region.cont: ; preds = %[[VAL_23]]
69-
// CHECK: br label %[[VAL_26:.*]]
70-
// CHECK: omp.par.pre_finalize: ; preds = %[[VAL_25]]
71-
// CHECK: br label %[[VAL_27:.*]]
65+
// CHECK: %[[GTN:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
66+
// CHECK: %[[NOT_CANCELLED:.*]] = call i32 @__kmpc_cancellationpoint(ptr @1, i32 %[[GTN]], i32 1)
67+
// CHECK: %[[COND:.*]] = icmp eq i32 %[[NOT_CANCELLED]], 0
68+
// CHECK: br i1 %[[COND]], label %[[VAL_23:.*]], label %[[CNCL:.*]]
69+
// CHECK: .cncl:
70+
// CHECK: br label %[[FINI:.*]]
7271
// CHECK: .fini:
7372
// CHECK: %[[VAL_32:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
7473
// CHECK: %[[VAL_33:.*]] = call i32 @__kmpc_cancel_barrier(ptr @2, i32 %[[VAL_32]])
7574
// CHECK: br label %[[EXIT_STUB:.*]]
76-
// CHECK: 6: ; preds = %[[VAL_20]]
75+
// CHECK: .split:
76+
// CHECK: br label %[[SEVEN:.*]]
77+
// CHECK: 7:
78+
// CHECK: br label %[[VAL_25:.*]]
79+
// CHECK: omp.region.cont:
80+
// CHECK: br label %[[VAL_26:.*]]
81+
// CHECK: omp.par.pre_finalize: ; preds = %[[VAL_25]]
82+
// CHECK: br label %[[VAL_27:.*]]
83+
// CHECK: 8: ; preds = %[[VAL_20]]
7784
// CHECK: %[[VAL_28:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
7885
// CHECK: %[[VAL_29:.*]] = call i32 @__kmpc_cancel(ptr @1, i32 %[[VAL_28]], i32 1)
7986
// CHECK: %[[VAL_30:.*]] = icmp eq i32 %[[VAL_29]], 0
80-
// CHECK: br i1 %[[VAL_30]], label %[[VAL_24]], label %[[VAL_31:.*]]
81-
// CHECK: .cncl: ; preds = %[[VAL_21]]
82-
// CHECK: br label %[[VAL_27]]
83-
// CHECK: .split: ; preds = %[[VAL_21]]
84-
// CHECK: br label %[[VAL_23]]
87+
// CHECK: br i1 %[[VAL_30]], label %[[SPLIT5:.*]], label %[[VAL_31:.*]]
88+
// CHECK: .cncl{{.*}}:
89+
// CHECK: br label %[[FINI]]
90+
// CHECK: .split{{.*}}:
91+
// CHECK: br label %[[SEVEN]]
8592
// CHECK: omp.par.exit.exitStub:
8693
// CHECK: ret void
8794

@@ -136,11 +143,16 @@ llvm.func @cancel_sections_if(%cond : i1) {
136143
// CHECK: %[[VAL_30:.*]] = call i32 @__kmpc_cancel(ptr @1, i32 %[[VAL_29]], i32 3)
137144
// CHECK: %[[VAL_31:.*]] = icmp eq i32 %[[VAL_30]], 0
138145
// CHECK: br i1 %[[VAL_31]], label %[[VAL_32:.*]], label %[[VAL_33:.*]]
139-
// CHECK: .split: ; preds = %[[VAL_27]]
146+
// CHECK: .split{{.*}}: ; preds = %[[VAL_27]]
140147
// CHECK: br label %[[VAL_34:.*]]
141148
// CHECK: 12: ; preds = %[[VAL_25]]
149+
// CHECK: %[[GTN:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
150+
// CHECK: %[[CANCEL_POINT:.*]] = call i32 @__kmpc_cancellationpoint(ptr @1, i32 %[[GTN]], i32 3)
151+
// CHECK: %[[COND:.*]] = icmp eq i32 %13, 0
152+
// CHECK: br i1 %[[COND]], label %[[SPLIT:.*]], label %[[CNCL:.*]]
153+
// CHECK: .split{{.*}}:
142154
// CHECK: br label %[[VAL_34]]
143-
// CHECK: 13: ; preds = %[[VAL_28]], %[[VAL_32]]
155+
// CHECK: 15:
144156
// CHECK: br label %[[VAL_35:.*]]
145157
// CHECK: omp.region.cont: ; preds = %[[VAL_34]]
146158
// CHECK: br label %[[VAL_23]]
@@ -156,8 +168,10 @@ llvm.func @cancel_sections_if(%cond : i1) {
156168
// CHECK: br label %[[VAL_37:.*]]
157169
// CHECK: omp_section_loop.after: ; preds = %[[VAL_19]]
158170
// CHECK: ret void
159-
// CHECK: .cncl: ; preds = %[[VAL_27]]
160-
// CHECK: br label %[[VAL_19]]
171+
// CHECK: .cncl:
172+
// CHECK: br label %[[OMP_SECTION_LOOP_EXIT:.*]]
173+
// CHECK: .cncl{{.*}}:
174+
// CHECK: br label %[[OMP_SECTION_LOOP_EXIT:.*]]
161175

162176
llvm.func @cancel_wsloop_if(%lb : i32, %ub : i32, %step : i32, %cond : i1) {
163177
omp.wsloop {
@@ -223,11 +237,16 @@ llvm.func @cancel_wsloop_if(%lb : i32, %ub : i32, %step : i32, %cond : i1) {
223237
// CHECK: %[[VAL_47:.*]] = call i32 @__kmpc_cancel(ptr @1, i32 %[[VAL_46]], i32 2)
224238
// CHECK: %[[VAL_48:.*]] = icmp eq i32 %[[VAL_47]], 0
225239
// CHECK: br i1 %[[VAL_48]], label %[[VAL_49:.*]], label %[[VAL_50:.*]]
226-
// CHECK: .split: ; preds = %[[VAL_44]]
240+
// CHECK: .split{{.*}}:
227241
// CHECK: br label %[[VAL_51:.*]]
228-
// CHECK: 28: ; preds = %[[VAL_42]]
242+
// CHECK: 28:
243+
// CHECK: %[[GTN:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
244+
// CHECK: %[[CANCEL_POINT:.*]] = call i32 @__kmpc_cancellationpoint(ptr @1, i32 %[[GTN]], i32 2)
245+
// CHECK: %[[COND:.*]] = icmp eq i32 %[[CANCEL_POINT]], 0
246+
// CHECK: br i1 %[[COND]], label %[[SPLIT3:.*]], label %[[CNCL4:.*]]
247+
// CHECK: .split{{.*}}:
229248
// CHECK: br label %[[VAL_51]]
230-
// CHECK: 29: ; preds = %[[VAL_45]], %[[VAL_49]]
249+
// CHECK: 31:
231250
// CHECK: br label %[[VAL_52:.*]]
232251
// CHECK: omp.region.cont1: ; preds = %[[VAL_51]]
233252
// CHECK: br label %[[VAL_32]]
@@ -243,8 +262,12 @@ llvm.func @cancel_wsloop_if(%lb : i32, %ub : i32, %step : i32, %cond : i1) {
243262
// CHECK: br label %[[VAL_55:.*]]
244263
// CHECK: omp.region.cont: ; preds = %[[VAL_54]]
245264
// CHECK: ret void
246-
// CHECK: .cncl: ; preds = %[[VAL_44]]
247-
// CHECK: br label %[[VAL_38]]
265+
// CHECK: .cncl{{.*}}:
266+
// CHECK: br label %[[FINI:.*]]
267+
// CHECK: .fini:
268+
// CHECK: br label %[[OMP_LOOP_EXIT:.*]]
269+
// CHECK: .cncl{{.*}}:
270+
// CHECK: br label %[[FINI:.*]]
248271

249272
omp.private {type = firstprivate} @i32_priv : i32 copy {
250273
^bb0(%arg0: !llvm.ptr, %arg1: !llvm.ptr):

0 commit comments

Comments
 (0)