@@ -156,3 +156,90 @@ llvm.func @cancel_sections_if(%cond : i1) {
156
156
// CHECK: ret void
157
157
// CHECK: .cncl: ; preds = %[[VAL_27]]
158
158
// CHECK: br label %[[VAL_19]]
159
+
160
+ llvm.func @cancel_wsloop_if (%lb : i32 , %ub : i32 , %step : i32 , %cond : i1 ) {
161
+ omp.wsloop {
162
+ omp.loop_nest (%iv ) : i32 = (%lb ) to (%ub ) step (%step ) {
163
+ omp.cancel cancellation_construct_type (loop ) if (%cond )
164
+ omp.yield
165
+ }
166
+ }
167
+ llvm.return
168
+ }
169
+ // CHECK-LABEL: define void @cancel_wsloop_if
170
+ // CHECK: %[[VAL_0:.*]] = alloca i32, align 4
171
+ // CHECK: %[[VAL_1:.*]] = alloca i32, align 4
172
+ // CHECK: %[[VAL_2:.*]] = alloca i32, align 4
173
+ // CHECK: %[[VAL_3:.*]] = alloca i32, align 4
174
+ // CHECK: br label %[[VAL_4:.*]]
175
+ // CHECK: omp.region.after_alloca: ; preds = %[[VAL_5:.*]]
176
+ // CHECK: br label %[[VAL_6:.*]]
177
+ // CHECK: entry: ; preds = %[[VAL_4]]
178
+ // CHECK: br label %[[VAL_7:.*]]
179
+ // CHECK: omp.wsloop.region: ; preds = %[[VAL_6]]
180
+ // CHECK: %[[VAL_8:.*]] = icmp slt i32 %[[VAL_9:.*]], 0
181
+ // CHECK: %[[VAL_10:.*]] = sub i32 0, %[[VAL_9]]
182
+ // CHECK: %[[VAL_11:.*]] = select i1 %[[VAL_8]], i32 %[[VAL_10]], i32 %[[VAL_9]]
183
+ // CHECK: %[[VAL_12:.*]] = select i1 %[[VAL_8]], i32 %[[VAL_13:.*]], i32 %[[VAL_14:.*]]
184
+ // CHECK: %[[VAL_15:.*]] = select i1 %[[VAL_8]], i32 %[[VAL_14]], i32 %[[VAL_13]]
185
+ // CHECK: %[[VAL_16:.*]] = sub nsw i32 %[[VAL_15]], %[[VAL_12]]
186
+ // CHECK: %[[VAL_17:.*]] = icmp sle i32 %[[VAL_15]], %[[VAL_12]]
187
+ // CHECK: %[[VAL_18:.*]] = sub i32 %[[VAL_16]], 1
188
+ // CHECK: %[[VAL_19:.*]] = udiv i32 %[[VAL_18]], %[[VAL_11]]
189
+ // CHECK: %[[VAL_20:.*]] = add i32 %[[VAL_19]], 1
190
+ // CHECK: %[[VAL_21:.*]] = icmp ule i32 %[[VAL_16]], %[[VAL_11]]
191
+ // CHECK: %[[VAL_22:.*]] = select i1 %[[VAL_21]], i32 1, i32 %[[VAL_20]]
192
+ // CHECK: %[[VAL_23:.*]] = select i1 %[[VAL_17]], i32 0, i32 %[[VAL_22]]
193
+ // CHECK: br label %[[VAL_24:.*]]
194
+ // CHECK: omp_loop.preheader: ; preds = %[[VAL_7]]
195
+ // CHECK: store i32 0, ptr %[[VAL_1]], align 4
196
+ // CHECK: %[[VAL_25:.*]] = sub i32 %[[VAL_23]], 1
197
+ // CHECK: store i32 %[[VAL_25]], ptr %[[VAL_2]], align 4
198
+ // CHECK: store i32 1, ptr %[[VAL_3]], align 4
199
+ // CHECK: %[[VAL_26:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
200
+ // CHECK: call void @__kmpc_for_static_init_4u(ptr @1, i32 %[[VAL_26]], i32 34, ptr %[[VAL_0]], ptr %[[VAL_1]], ptr %[[VAL_2]], ptr %[[VAL_3]], i32 1, i32 0)
201
+ // CHECK: %[[VAL_27:.*]] = load i32, ptr %[[VAL_1]], align 4
202
+ // CHECK: %[[VAL_28:.*]] = load i32, ptr %[[VAL_2]], align 4
203
+ // CHECK: %[[VAL_29:.*]] = sub i32 %[[VAL_28]], %[[VAL_27]]
204
+ // CHECK: %[[VAL_30:.*]] = add i32 %[[VAL_29]], 1
205
+ // CHECK: br label %[[VAL_31:.*]]
206
+ // CHECK: omp_loop.header: ; preds = %[[VAL_32:.*]], %[[VAL_24]]
207
+ // CHECK: %[[VAL_33:.*]] = phi i32 [ 0, %[[VAL_24]] ], [ %[[VAL_34:.*]], %[[VAL_32]] ]
208
+ // CHECK: br label %[[VAL_35:.*]]
209
+ // CHECK: omp_loop.cond: ; preds = %[[VAL_31]]
210
+ // CHECK: %[[VAL_36:.*]] = icmp ult i32 %[[VAL_33]], %[[VAL_30]]
211
+ // CHECK: br i1 %[[VAL_36]], label %[[VAL_37:.*]], label %[[VAL_38:.*]]
212
+ // CHECK: omp_loop.body: ; preds = %[[VAL_35]]
213
+ // CHECK: %[[VAL_39:.*]] = add i32 %[[VAL_33]], %[[VAL_27]]
214
+ // CHECK: %[[VAL_40:.*]] = mul i32 %[[VAL_39]], %[[VAL_9]]
215
+ // CHECK: %[[VAL_41:.*]] = add i32 %[[VAL_40]], %[[VAL_14]]
216
+ // CHECK: br label %[[VAL_42:.*]]
217
+ // CHECK: omp.loop_nest.region: ; preds = %[[VAL_37]]
218
+ // CHECK: br i1 %[[VAL_43:.*]], label %[[VAL_44:.*]], label %[[VAL_45:.*]]
219
+ // CHECK: 25: ; preds = %[[VAL_42]]
220
+ // CHECK: %[[VAL_46:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
221
+ // CHECK: %[[VAL_47:.*]] = call i32 @__kmpc_cancel(ptr @1, i32 %[[VAL_46]], i32 2)
222
+ // CHECK: %[[VAL_48:.*]] = icmp eq i32 %[[VAL_47]], 0
223
+ // CHECK: br i1 %[[VAL_48]], label %[[VAL_49:.*]], label %[[VAL_50:.*]]
224
+ // CHECK: .split: ; preds = %[[VAL_44]]
225
+ // CHECK: br label %[[VAL_51:.*]]
226
+ // CHECK: 28: ; preds = %[[VAL_42]]
227
+ // CHECK: br label %[[VAL_51]]
228
+ // CHECK: 29: ; preds = %[[VAL_45]], %[[VAL_49]]
229
+ // CHECK: br label %[[VAL_52:.*]]
230
+ // CHECK: omp.region.cont1: ; preds = %[[VAL_51]]
231
+ // CHECK: br label %[[VAL_32]]
232
+ // CHECK: omp_loop.inc: ; preds = %[[VAL_52]]
233
+ // CHECK: %[[VAL_34]] = add nuw i32 %[[VAL_33]], 1
234
+ // CHECK: br label %[[VAL_31]]
235
+ // CHECK: omp_loop.exit: ; preds = %[[VAL_50]], %[[VAL_35]]
236
+ // CHECK: call void @__kmpc_for_static_fini(ptr @1, i32 %[[VAL_26]])
237
+ // CHECK: %[[VAL_53:.*]] = call i32 @__kmpc_global_thread_num(ptr @1)
238
+ // CHECK: call void @__kmpc_barrier(ptr @2, i32 %[[VAL_53]])
239
+ // CHECK: br label %[[VAL_54:.*]]
240
+ // CHECK: omp_loop.after: ; preds = %[[VAL_38]]
241
+ // CHECK: br label %[[VAL_55:.*]]
242
+ // CHECK: omp.region.cont: ; preds = %[[VAL_54]]
243
+ // CHECK: ret void
244
+ // CHECK: .cncl: ; preds = %[[VAL_44]]
245
+ // CHECK: br label %[[VAL_38]]
0 commit comments