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 define hidden void @test.shl.exact.equal() { 108 ; CHECK-LABEL: @test.shl.exact.equal 109 entry: 110 br label %for.body 111 112 for.body: 113 ; CHECK-LABEL: for.body 114 %k.021 = phi i32 [ 1, %entry ], [ %inc, %for.body ] 115 %shl = shl i32 1, %k.021 116 %shr1 = ashr i32 %shl, 1 117 ; CHECK: %shr1 = ashr exact i32 %shl, 1 118 %shr2 = lshr i32 %shl, 1 119 ; CHECK: %shr2 = lshr exact i32 %shl, 1 120 %inc = add nuw nsw i32 %k.021, 1 121 %exitcond = icmp eq i32 %inc, 9 122 br i1 %exitcond, label %for.end, label %for.body 123 124 for.end: 125 ret void 126 } 127 128 define hidden void @test.shl.exact.greater() { 129 ; CHECK-LABEL: @test.shl.exact.greater 130 entry: 131 br label %for.body 132 133 for.body: 134 ; CHECK-LABEL: for.body 135 %k.021 = phi i32 [ 3, %entry ], [ %inc, %for.body ] 136 %shl = shl i32 1, %k.021 137 %shr1 = ashr i32 %shl, 2 138 ; CHECK: %shr1 = ashr exact i32 %shl, 2 139 %shr2 = lshr i32 %shl, 2 140 ; CHECK: %shr2 = lshr exact i32 %shl, 2 141 %inc = add nuw nsw i32 %k.021, 1 142 %exitcond = icmp eq i32 %inc, 9 143 br i1 %exitcond, label %for.end, label %for.body 144 145 for.end: 146 ret void 147 } 148 149 define hidden void @test.shl.exact.unbound(i32 %arg) { 150 ; CHECK-LABEL: @test.shl.exact.unbound 151 entry: 152 br label %for.body 153 154 for.body: 155 ; CHECK-LABEL: for.body 156 %k.021 = phi i32 [ 2, %entry ], [ %inc, %for.body ] 157 %shl = shl i32 1, %k.021 158 %shr1 = ashr i32 %shl, 2 159 ; CHECK: %shr1 = ashr exact i32 %shl, 2 160 %shr2 = lshr i32 %shl, 2 161 ; CHECK: %shr2 = lshr exact i32 %shl, 2 162 %inc = add nuw nsw i32 %k.021, 1 163 %exitcond = icmp eq i32 %inc, %arg 164 br i1 %exitcond, label %for.end, label %for.body 165 166 for.end: 167 ret void 168 } 169 170 define hidden void @test.shl.nonexact() { 171 ; CHECK-LABEL: @test.shl.nonexact 172 entry: 173 br label %for.body 174 175 for.body: 176 ; CHECK-LABEL: for.body 177 %k.021 = phi i32 [ 2, %entry ], [ %inc, %for.body ] 178 %shl = shl i32 1, %k.021 179 %shr1 = ashr i32 %shl, 3 180 ; CHECK: %shr1 = ashr i32 %shl, 3 181 %shr2 = lshr i32 %shl, 3 182 ; CHECK: %shr2 = lshr i32 %shl, 3 183 %inc = add nuw nsw i32 %k.021, 1 184 %exitcond = icmp eq i32 %inc, 9 185 br i1 %exitcond, label %for.end, label %for.body 186 187 for.end: 188 ret void 189 } 190 191 !0 = !{i32 0, i32 2} 192 !1 = !{i32 0, i32 42} 193