1; RUN: opt < %s -loop-reroll -S | FileCheck %s 2 3; Check whether rerolling is rejected if values of the base and root 4; instruction are used outside the loop block. 5 6; Only the base/root instructions except a loop increment instruction 7define void @test1() { 8entry: 9 br label %loop1 10 11loop1: 12;CHECK-LABEL: loop1: 13;CHECK-NEXT: %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop1 ] 14;CHECK-NEXT: %indvar.1 = add nsw i64 %indvar, 1 15 16 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %loop1 ] 17 %indvar.1 = add nsw i64 %indvar, 1 18 %indvar.next = add nsw i64 %indvar, 2 19 %cmp = icmp slt i64 %indvar.next, 200 20 br i1 %cmp, label %loop1, label %exit 21 22exit: 23 %var1 = phi i64 [ %indvar.1, %loop1 ] 24 %var2 = phi i64 [ %indvar, %loop1 ] 25 ret void 26} 27 28; Both the base/root instructions and reduction instructions 29define void @test2() { 30entry: 31 br label %loop2 32 33loop2: 34;CHECK-LABEL: loop2: 35;CHECK-NEXT: %indvar = phi i32 [ 0, %entry ], [ %indvar.next, %loop2 ] 36;CHECK-NEXT: %redvar = phi i32 [ 0, %entry ], [ %add.2, %loop2 ] 37;CHECK-NEXT: %indvar.1 = add nuw nsw i32 %indvar, 1 38;CHECK-NEXT: %indvar.2 = add nuw nsw i32 %indvar, 2 39 40 %indvar = phi i32 [ 0, %entry ], [ %indvar.next, %loop2 ] 41 %redvar = phi i32 [ 0, %entry ], [ %add.2, %loop2 ] 42 %indvar.1 = add nuw nsw i32 %indvar, 1 43 %indvar.2 = add nuw nsw i32 %indvar, 2 44 %mul.0 = mul nsw i32 %indvar, %indvar 45 %mul.1 = mul nsw i32 %indvar.1, %indvar.1 46 %mul.2 = mul nsw i32 %indvar.2, %indvar.2 47 %add.0 = add nsw i32 %redvar, %mul.0 48 %add.1 = add nsw i32 %add.0, %mul.1 49 %add.2 = add nsw i32 %add.1, %mul.2 50 %indvar.next = add nuw nsw i32 %indvar, 3 51 %cmp = icmp slt i32 %indvar.next, 300 52 br i1 %cmp, label %loop2, label %exit 53 54exit: 55 %a = phi i32 [ %indvar, %loop2 ] 56 %b = phi i32 [ %indvar.1, %loop2 ] 57 %c = phi i32 [ %indvar.2, %loop2 ] 58 %x = phi i32 [ %add.2, %loop2 ] 59 ret void 60} 61