1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -loop-unroll -unroll-runtime -unroll-runtime-multi-exit < %s | FileCheck %s 3 4; This loop has a known trip count on the non-latch exit. When performing 5; runtime unrolling (at least when using a prologue rather than epilogue) we 6; should not fold that exit based on known trip count information prior to 7; prologue insertion, as that may change the trip count for the modified loop. 8 9define void @test(i32 %s, i32 %n) { 10; CHECK-LABEL: @test( 11; CHECK-NEXT: entry: 12; CHECK-NEXT: [[N2:%.*]] = add i32 [[S:%.*]], 123 13; CHECK-NEXT: br label [[LOOP:%.*]] 14; CHECK: loop: 15; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[S]], [[ENTRY:%.*]] ], [ [[I_INC:%.*]], [[LATCH:%.*]] ] 16; CHECK-NEXT: [[C1:%.*]] = icmp eq i32 [[I]], [[N2]] 17; CHECK-NEXT: br i1 [[C1]], label [[EXIT1:%.*]], label [[LATCH]] 18; CHECK: latch: 19; CHECK-NEXT: [[C2:%.*]] = icmp eq i32 [[I]], [[N:%.*]] 20; CHECK-NEXT: [[I_INC]] = add i32 [[I]], 1 21; CHECK-NEXT: br i1 [[C2]], label [[EXIT2:%.*]], label [[LOOP]] 22; CHECK: exit1: 23; CHECK-NEXT: ret void 24; CHECK: exit2: 25; CHECK-NEXT: ret void 26; 27entry: 28 %n2 = add i32 %s, 123 29 br label %loop 30 31loop: 32 %i = phi i32 [ %s, %entry], [ %i.inc, %latch ] 33 %c1 = icmp eq i32 %i, %n2 34 br i1 %c1, label %exit1, label %latch 35 36latch: 37 %c2 = icmp eq i32 %i, %n 38 %i.inc = add i32 %i, 1 39 br i1 %c2, label %exit2, label %loop 40 41exit1: 42 ret void 43 44exit2: 45 ret void 46} 47