@@ -176,32 +176,18 @@ define i32 @func_11() nounwind uwtable {
176
176
; CHECK-NEXT: entry:
177
177
; CHECK-NEXT: br label [[FORCOND:%.*]]
178
178
; CHECK: forcond:
179
- ; CHECK-NEXT: [[__KEY6_0:%.*]] = phi i32 [ 2, [[ENTRY:%.*]] ], [ [[TMP37:%.*]], [[NOASSERT:%.*]] ]
180
- ; CHECK-NEXT: [[EXITCOND1:%.*]] = icmp ne i32 [[__KEY6_0]], 10
181
- ; CHECK-NEXT: br i1 [[EXITCOND1]], label [[NOASSERT]], label [[FORCOND38_PREHEADER:%.*]]
179
+ ; CHECK-NEXT: br i1 false, label [[NOASSERT:%.*]], label [[FORCOND38_PREHEADER:%.*]]
182
180
; CHECK: forcond38.preheader:
183
181
; CHECK-NEXT: br label [[FORCOND38:%.*]]
184
182
; CHECK: noassert:
185
- ; CHECK-NEXT: [[TMP13:%.*]] = sdiv i32 -32768, [[__KEY6_0]]
186
- ; CHECK-NEXT: [[TMP2936:%.*]] = shl i32 [[TMP13]], 24
187
- ; CHECK-NEXT: [[SEXT23:%.*]] = shl i32 [[TMP13]], 24
188
- ; CHECK-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP2936]], [[SEXT23]]
189
- ; CHECK-NEXT: [[TMP37]] = add nuw nsw i32 [[__KEY6_0]], 1
190
- ; CHECK-NEXT: br i1 [[TMP32]], label [[FORCOND]], label [[ASSERT33:%.*]]
183
+ ; CHECK-NEXT: br i1 true, label [[FORCOND]], label [[ASSERT33:%.*]]
191
184
; CHECK: assert33:
192
185
; CHECK-NEXT: tail call void @llvm.trap()
193
186
; CHECK-NEXT: unreachable
194
187
; CHECK: forcond38:
195
- ; CHECK-NEXT: [[__KEY8_0:%.*]] = phi i32 [ [[TMP81:%.*]], [[NOASSERT68:%.*]] ], [ 2, [[FORCOND38_PREHEADER]] ]
196
- ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[__KEY8_0]], 10
197
- ; CHECK-NEXT: br i1 [[EXITCOND]], label [[NOASSERT68]], label [[UNROLLEDEND:%.*]]
188
+ ; CHECK-NEXT: br i1 false, label [[NOASSERT68:%.*]], label [[UNROLLEDEND:%.*]]
198
189
; CHECK: noassert68:
199
- ; CHECK-NEXT: [[TMP57:%.*]] = sdiv i32 -32768, [[__KEY8_0]]
200
- ; CHECK-NEXT: [[SEXT34:%.*]] = shl i32 [[TMP57]], 16
201
- ; CHECK-NEXT: [[SEXT21:%.*]] = shl i32 [[TMP57]], 16
202
- ; CHECK-NEXT: [[TMP76:%.*]] = icmp eq i32 [[SEXT34]], [[SEXT21]]
203
- ; CHECK-NEXT: [[TMP81]] = add nuw nsw i32 [[__KEY8_0]], 1
204
- ; CHECK-NEXT: br i1 [[TMP76]], label [[FORCOND38]], label [[ASSERT77:%.*]]
190
+ ; CHECK-NEXT: br i1 true, label [[FORCOND38]], label [[ASSERT77:%.*]]
205
191
; CHECK: assert77:
206
192
; CHECK-NEXT: tail call void @llvm.trap()
207
193
; CHECK-NEXT: unreachable
@@ -252,6 +238,73 @@ unrolledend: ; preds = %forcond38
252
238
ret i32 0
253
239
}
254
240
241
+ define i32 @func_11_flipped () nounwind uwtable {
242
+ ; CHECK-LABEL: @func_11_flipped(
243
+ ; CHECK-NEXT: entry:
244
+ ; CHECK-NEXT: br label [[FORCOND:%.*]]
245
+ ; CHECK: forcond:
246
+ ; CHECK-NEXT: br i1 true, label [[FORCOND38_PREHEADER:%.*]], label [[NOASSERT:%.*]]
247
+ ; CHECK: forcond38.preheader:
248
+ ; CHECK-NEXT: br label [[FORCOND38:%.*]]
249
+ ; CHECK: noassert:
250
+ ; CHECK-NEXT: br i1 true, label [[FORCOND]], label [[ASSERT33:%.*]]
251
+ ; CHECK: assert33:
252
+ ; CHECK-NEXT: tail call void @llvm.trap()
253
+ ; CHECK-NEXT: unreachable
254
+ ; CHECK: forcond38:
255
+ ; CHECK-NEXT: br i1 false, label [[NOASSERT68:%.*]], label [[UNROLLEDEND:%.*]]
256
+ ; CHECK: noassert68:
257
+ ; CHECK-NEXT: br i1 true, label [[FORCOND38]], label [[ASSERT77:%.*]]
258
+ ; CHECK: assert77:
259
+ ; CHECK-NEXT: tail call void @llvm.trap()
260
+ ; CHECK-NEXT: unreachable
261
+ ; CHECK: unrolledend:
262
+ ; CHECK-NEXT: ret i32 0
263
+ ;
264
+ entry:
265
+ br label %forcond
266
+
267
+ forcond: ; preds = %noassert, %entry
268
+ %__key6.0 = phi i32 [ 2 , %entry ], [ %tmp37 , %noassert ]
269
+ %tmp5 = icmp sge i32 %__key6.0 , 10
270
+ br i1 %tmp5 , label %forcond38.preheader , label %noassert
271
+
272
+ forcond38.preheader: ; preds = %forcond
273
+ br label %forcond38
274
+
275
+ noassert: ; preds = %forbody
276
+ %tmp13 = sdiv i32 -32768 , %__key6.0
277
+ %tmp2936 = shl i32 %tmp13 , 24
278
+ %sext23 = shl i32 %tmp13 , 24
279
+ %tmp32 = icmp eq i32 %tmp2936 , %sext23
280
+ %tmp37 = add i32 %__key6.0 , 1
281
+ br i1 %tmp32 , label %forcond , label %assert33
282
+
283
+ assert33: ; preds = %noassert
284
+ tail call void @llvm.trap ()
285
+ unreachable
286
+
287
+ forcond38: ; preds = %noassert68, %forcond38.preheader
288
+ %__key8.0 = phi i32 [ %tmp81 , %noassert68 ], [ 2 , %forcond38.preheader ]
289
+ %tmp46 = icmp slt i32 %__key8.0 , 10
290
+ br i1 %tmp46 , label %noassert68 , label %unrolledend
291
+
292
+ noassert68: ; preds = %forbody39
293
+ %tmp57 = sdiv i32 -32768 , %__key8.0
294
+ %sext34 = shl i32 %tmp57 , 16
295
+ %sext21 = shl i32 %tmp57 , 16
296
+ %tmp76 = icmp eq i32 %sext34 , %sext21
297
+ %tmp81 = add i32 %__key8.0 , 1
298
+ br i1 %tmp76 , label %forcond38 , label %assert77
299
+
300
+ assert77: ; preds = %noassert68
301
+ tail call void @llvm.trap ()
302
+ unreachable
303
+
304
+ unrolledend: ; preds = %forcond38
305
+ ret i32 0
306
+ }
307
+
255
308
declare void @llvm.trap () noreturn nounwind
256
309
257
310
; In this case the second loop only has a single iteration, fold the header away
@@ -260,18 +313,11 @@ define i32 @func_12() nounwind uwtable {
260
313
; CHECK-NEXT: entry:
261
314
; CHECK-NEXT: br label [[FORCOND:%.*]]
262
315
; CHECK: forcond:
263
- ; CHECK-NEXT: [[__KEY6_0:%.*]] = phi i32 [ 2, [[ENTRY:%.*]] ], [ [[TMP37:%.*]], [[NOASSERT:%.*]] ]
264
- ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i32 [[__KEY6_0]], 10
265
- ; CHECK-NEXT: br i1 [[EXITCOND]], label [[NOASSERT]], label [[FORCOND38_PREHEADER:%.*]]
316
+ ; CHECK-NEXT: br i1 false, label [[NOASSERT:%.*]], label [[FORCOND38_PREHEADER:%.*]]
266
317
; CHECK: forcond38.preheader:
267
318
; CHECK-NEXT: br label [[FORCOND38:%.*]]
268
319
; CHECK: noassert:
269
- ; CHECK-NEXT: [[TMP13:%.*]] = sdiv i32 -32768, [[__KEY6_0]]
270
- ; CHECK-NEXT: [[TMP2936:%.*]] = shl i32 [[TMP13]], 24
271
- ; CHECK-NEXT: [[SEXT23:%.*]] = shl i32 [[TMP13]], 24
272
- ; CHECK-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP2936]], [[SEXT23]]
273
- ; CHECK-NEXT: [[TMP37]] = add nuw nsw i32 [[__KEY6_0]], 1
274
- ; CHECK-NEXT: br i1 [[TMP32]], label [[FORCOND]], label [[ASSERT33:%.*]]
320
+ ; CHECK-NEXT: br i1 true, label [[FORCOND]], label [[ASSERT33:%.*]]
275
321
; CHECK: assert33:
276
322
; CHECK-NEXT: tail call void @llvm.trap()
277
323
; CHECK-NEXT: unreachable
0 commit comments