1 ; RUN: opt < %s -indvars -S | FileCheck %s 2 3 define i32 @test.signed.add.0(i32* %array, i32 %length, i32 %init) { 4 ; CHECK-LABEL: @test.signed.add.0 5 entry: 6 %upper = icmp slt i32 %init, %length 7 br i1 %upper, label %loop, label %exit 8 9 loop: 10 ; CHECK-LABEL: loop 11 %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ] 12 %civ.inc = add i32 %civ, 1 13 ; CHECK: %civ.inc = add nsw i32 %civ, 1 14 %cmp = icmp slt i32 %civ.inc, %length 15 br i1 %cmp, label %latch, label %break 16 17 latch: 18 store i32 0, i32* %array 19 %check = icmp slt i32 %civ.inc, %length 20 br i1 %check, label %loop, label %break 21 22 break: 23 ret i32 %civ.inc 24 25 exit: 26 ret i32 42 27 } 28 29 define i32 @test.signed.add.1(i32* %array, i32 %length, i32 %init) { 30 ; CHECK-LABEL: @test.signed.add.1 31 entry: 32 %upper = icmp sle i32 %init, %length 33 br i1 %upper, label %loop, label %exit 34 35 loop: 36 ; CHECK-LABEL: loop 37 %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ] 38 %civ.inc = add i32 %civ, 1 39 ; CHECK: %civ.inc = add i32 %civ, 1 40 %cmp = icmp slt i32 %civ.inc, %length 41 br i1 %cmp, label %latch, label %break 42 43 latch: 44 store i32 0, i32* %array 45 %check = icmp slt i32 %civ.inc, %length 46 br i1 %check, label %loop, label %break 47 48 break: 49 ret i32 %civ.inc 50 51 exit: 52 ret i32 42 53 } 54 55 define i32 @test.unsigned.add.0(i32* %array, i32 %length, i32 %init) { 56 ; CHECK-LABEL: @test.unsigned.add.0 57 entry: 58 %upper = icmp ult i32 %init, %length 59 br i1 %upper, label %loop, label %exit 60 61 loop: 62 ; CHECK-LABEL: loop 63 %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ] 64 %civ.inc = add i32 %civ, 1 65 ; CHECK: %civ.inc = add nuw i32 %civ, 1 66 %cmp = icmp slt i32 %civ.inc, %length 67 br i1 %cmp, label %latch, label %break 68 69 latch: 70 store i32 0, i32* %array 71 %check = icmp ult i32 %civ.inc, %length 72 br i1 %check, label %loop, label %break 73 74 break: 75 ret i32 %civ.inc 76 77 exit: 78 ret i32 42 79 } 80 81 define i32 @test.unsigned.add.1(i32* %array, i32 %length, i32 %init) { 82 ; CHECK-LABEL: @test.unsigned.add.1 83 entry: 84 %upper = icmp ule i32 %init, %length 85 br i1 %upper, label %loop, label %exit 86 87 loop: 88 ; CHECK-LABEL: loop 89 %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ] 90 %civ.inc = add i32 %civ, 1 91 ; CHECK: %civ.inc = add i32 %civ, 1 92 %cmp = icmp slt i32 %civ.inc, %length 93 br i1 %cmp, label %latch, label %break 94 95 latch: 96 store i32 0, i32* %array 97 %check = icmp ult i32 %civ.inc, %length 98 br i1 %check, label %loop, label %break 99 100 break: 101 ret i32 %civ.inc 102 103 exit: 104 ret i32 42 105 } 106 107 !0 = !{i32 0, i32 2} 108 !1 = !{i32 0, i32 42} 109