@@ -272,3 +272,69 @@ loop.latch:
272
272
exit:
273
273
ret void
274
274
}
275
+
276
+ declare void @foo ()
277
+
278
+ define i32 @test_latch_exiting1 (i32 %N ) {
279
+ ; CHECK-LABEL: @test_latch_exiting1(
280
+ ; CHECK-NEXT: entry:
281
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
282
+ ; CHECK: loop:
283
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
284
+ ; CHECK-NEXT: call void @foo()
285
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
286
+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], [[N:%.*]]
287
+ ; CHECK-NEXT: br i1 [[EC]], label [[EXIT_1:%.*]], label [[LOOP]]
288
+ ; CHECK: exit.1:
289
+ ; CHECK-NEXT: ret i32 10
290
+ ;
291
+ entry:
292
+ br label %loop
293
+
294
+ loop:
295
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
296
+ call void @foo ()
297
+ %iv.next = add i32 %iv , 1
298
+ %ec = icmp eq i32 %iv , %N
299
+ br i1 %ec , label %exit.1 , label %loop
300
+
301
+ exit.1 :
302
+ ret i32 10
303
+ }
304
+
305
+ define i32 @test_latch_exiting2 (i1 %c , i32 %N ) {
306
+ ; CHECK-LABEL: @test_latch_exiting2(
307
+ ; CHECK-NEXT: entry:
308
+ ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
309
+ ; CHECK: loop.header:
310
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
311
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP_LATCH]], label [[EXIT_1:%.*]]
312
+ ; CHECK: loop.latch:
313
+ ; CHECK-NEXT: call void @foo()
314
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
315
+ ; CHECK-NEXT: [[EC:%.*]] = icmp eq i32 [[IV]], [[N:%.*]]
316
+ ; CHECK-NEXT: br i1 [[EC]], label [[EXIT_2:%.*]], label [[LOOP_HEADER]]
317
+ ; CHECK: exit.1:
318
+ ; CHECK-NEXT: ret i32 10
319
+ ; CHECK: exit.2:
320
+ ; CHECK-NEXT: ret i32 0
321
+ ;
322
+ entry:
323
+ br label %loop.header
324
+
325
+ loop.header:
326
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
327
+ br i1 %c , label %loop.latch , label %exit.1
328
+
329
+ loop.latch:
330
+ call void @foo ()
331
+ %iv.next = add i32 %iv , 1
332
+ %ec = icmp eq i32 %iv , %N
333
+ br i1 %ec , label %exit.2 , label %loop.header
334
+
335
+ exit.1 :
336
+ ret i32 10
337
+
338
+ exit.2 :
339
+ ret i32 0
340
+ }
0 commit comments