1; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s 2 3declare void @llvm.experimental.guard(i1, ...) 4 5define void @test_1(i32 %n) nounwind { 6; Prove that (n > 1) ===> (n / 2 > 0). 7; CHECK: Determining loop execution counts for: @test_1 8; CHECK: Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw> 9entry: 10 %cmp1 = icmp sgt i32 %n, 1 11 %n.div.2 = sdiv i32 %n, 2 12 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 13 br label %header 14 15header: 16 %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ] 17 %indvar.next = add i32 %indvar, 1 18 %exitcond = icmp sgt i32 %n.div.2, %indvar.next 19 br i1 %exitcond, label %header, label %exit 20 21exit: 22 ret void 23} 24 25define void @test_1neg(i32 %n) nounwind { 26; Prove that (n > 0) =\=> (n / 2 > 0). 27; CHECK: Determining loop execution counts for: @test_1neg 28; CHECK: Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw> 29entry: 30 %cmp1 = icmp sgt i32 %n, 0 31 %n.div.2 = sdiv i32 %n, 2 32 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 33 br label %header 34 35header: 36 %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ] 37 %indvar.next = add i32 %indvar, 1 38 %exitcond = icmp sgt i32 %n.div.2, %indvar.next 39 br i1 %exitcond, label %header, label %exit 40 41exit: 42 ret void 43} 44 45define void @test_2(i32 %n) nounwind { 46; Prove that (n >= 2) ===> (n / 2 > 0). 47; CHECK: Determining loop execution counts for: @test_2 48; CHECK: Loop %header: backedge-taken count is (-1 + %n.div.2)<nsw> 49entry: 50 %cmp1 = icmp sge i32 %n, 2 51 %n.div.2 = sdiv i32 %n, 2 52 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 53 br label %header 54 55header: 56 %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ] 57 %indvar.next = add i32 %indvar, 1 58 %exitcond = icmp sgt i32 %n.div.2, %indvar.next 59 br i1 %exitcond, label %header, label %exit 60 61exit: 62 ret void 63} 64 65define void @test_2neg(i32 %n) nounwind { 66; Prove that (n >= 1) =\=> (n / 2 > 0). 67; CHECK: Determining loop execution counts for: @test_2neg 68; CHECK: Loop %header: backedge-taken count is (-1 + (1 smax %n.div.2))<nsw> 69entry: 70 %cmp1 = icmp sge i32 %n, 1 71 %n.div.2 = sdiv i32 %n, 2 72 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 73 br label %header 74 75header: 76 %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ] 77 %indvar.next = add i32 %indvar, 1 78 %exitcond = icmp sgt i32 %n.div.2, %indvar.next 79 br i1 %exitcond, label %header, label %exit 80 81exit: 82 ret void 83} 84 85define void @test_3(i32 %n) nounwind { 86; Prove that (n > -2) ===> (n / 2 >= 0). 87; CHECK: Determining loop execution counts for: @test_3 88; CHECK: Loop %header: backedge-taken count is (1 + %n.div.2)<nsw> 89entry: 90 %cmp1 = icmp sgt i32 %n, -2 91 %n.div.2 = sdiv i32 %n, 2 92 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 93 br label %header 94 95header: 96 %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ] 97 %indvar.next = add i32 %indvar, 1 98 %exitcond = icmp sge i32 %n.div.2, %indvar 99 br i1 %exitcond, label %header, label %exit 100 101exit: 102 ret void 103} 104 105define void @test_3neg(i32 %n) nounwind { 106; Prove that (n > -3) =\=> (n / 2 >= 0). 107; CHECK: Determining loop execution counts for: @test_3neg 108; CHECK: Loop %header: backedge-taken count is (0 smax (1 + %n.div.2)<nsw>) 109entry: 110 %cmp1 = icmp sgt i32 %n, -3 111 %n.div.2 = sdiv i32 %n, 2 112 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 113 br label %header 114 115header: 116 %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ] 117 %indvar.next = add i32 %indvar, 1 118 %exitcond = icmp sge i32 %n.div.2, %indvar 119 br i1 %exitcond, label %header, label %exit 120 121exit: 122 ret void 123} 124 125define void @test_4(i32 %n) nounwind { 126; Prove that (n >= -1) ===> (n / 2 >= 0). 127; CHECK: Determining loop execution counts for: @test_4 128; CHECK: Loop %header: backedge-taken count is (1 + %n.div.2)<nsw> 129entry: 130 %cmp1 = icmp sge i32 %n, -1 131 %n.div.2 = sdiv i32 %n, 2 132 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 133 br label %header 134 135header: 136 %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ] 137 %indvar.next = add i32 %indvar, 1 138 %exitcond = icmp sge i32 %n.div.2, %indvar 139 br i1 %exitcond, label %header, label %exit 140 141exit: 142 ret void 143} 144 145define void @test_4neg(i32 %n) nounwind { 146; Prove that (n >= -2) =\=> (n / 2 >= 0). 147; CHECK: Determining loop execution counts for: @test_4neg 148; CHECK: Loop %header: backedge-taken count is (0 smax (1 + %n.div.2)<nsw>) 149entry: 150 %cmp1 = icmp sge i32 %n, -2 151 %n.div.2 = sdiv i32 %n, 2 152 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 153 br label %header 154 155header: 156 %indvar = phi i32 [ %indvar.next, %header ], [ 0, %entry ] 157 %indvar.next = add i32 %indvar, 1 158 %exitcond = icmp sge i32 %n.div.2, %indvar 159 br i1 %exitcond, label %header, label %exit 160 161exit: 162 ret void 163} 164 165define void @test_ext_01(i32 %n) nounwind { 166; Prove that (n > 1) ===> (n / 2 > 0). 167; CHECK: Determining loop execution counts for: @test_ext_01 168; CHECK: Loop %header: backedge-taken count is (-1 + (sext i32 %n.div.2 to i64))<nsw> 169entry: 170 %cmp1 = icmp sgt i32 %n, 1 171 %n.div.2 = sdiv i32 %n, 2 172 %n.div.2.ext = sext i32 %n.div.2 to i64 173 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 174 br label %header 175 176header: 177 %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ] 178 %indvar.next = add i64 %indvar, 1 179 %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next 180 br i1 %exitcond, label %header, label %exit 181 182exit: 183 ret void 184} 185 186define void @test_ext_01neg(i32 %n) nounwind { 187; Prove that (n > 0) =\=> (n / 2 > 0). 188; CHECK: Determining loop execution counts for: @test_ext_01neg 189; CHECK: Loop %header: backedge-taken count is (-1 + (1 smax (sext i32 %n.div.2 to i64)))<nsw> 190entry: 191 %cmp1 = icmp sgt i32 %n, 0 192 %n.div.2 = sdiv i32 %n, 2 193 %n.div.2.ext = sext i32 %n.div.2 to i64 194 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 195 br label %header 196 197header: 198 %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ] 199 %indvar.next = add i64 %indvar, 1 200 %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next 201 br i1 %exitcond, label %header, label %exit 202 203exit: 204 ret void 205} 206 207define void @test_ext_02(i32 %n) nounwind { 208; Prove that (n >= 2) ===> (n / 2 > 0). 209; CHECK: Determining loop execution counts for: @test_ext_02 210; CHECK: Loop %header: backedge-taken count is (-1 + (sext i32 %n.div.2 to i64))<nsw> 211entry: 212 %cmp1 = icmp sge i32 %n, 2 213 %n.div.2 = sdiv i32 %n, 2 214 %n.div.2.ext = sext i32 %n.div.2 to i64 215 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 216 br label %header 217 218header: 219 %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ] 220 %indvar.next = add i64 %indvar, 1 221 %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next 222 br i1 %exitcond, label %header, label %exit 223 224exit: 225 ret void 226} 227 228define void @test_ext_02neg(i32 %n) nounwind { 229; Prove that (n >= 1) =\=> (n / 2 > 0). 230; CHECK: Determining loop execution counts for: @test_ext_02neg 231; CHECK: Loop %header: backedge-taken count is (-1 + (1 smax (sext i32 %n.div.2 to i64)))<nsw> 232entry: 233 %cmp1 = icmp sge i32 %n, 1 234 %n.div.2 = sdiv i32 %n, 2 235 %n.div.2.ext = sext i32 %n.div.2 to i64 236 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 237 br label %header 238 239header: 240 %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ] 241 %indvar.next = add i64 %indvar, 1 242 %exitcond = icmp sgt i64 %n.div.2.ext, %indvar.next 243 br i1 %exitcond, label %header, label %exit 244 245exit: 246 ret void 247} 248 249define void @test_ext_03(i32 %n) nounwind { 250; Prove that (n > -2) ===> (n / 2 >= 0). 251; CHECK: Determining loop execution counts for: @test_ext_03 252; CHECK: Loop %header: backedge-taken count is (1 + (sext i32 %n.div.2 to i64))<nsw> 253entry: 254 %cmp1 = icmp sgt i32 %n, -2 255 %n.div.2 = sdiv i32 %n, 2 256 %n.div.2.ext = sext i32 %n.div.2 to i64 257 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 258 br label %header 259 260header: 261 %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ] 262 %indvar.next = add i64 %indvar, 1 263 %exitcond = icmp sge i64 %n.div.2.ext, %indvar 264 br i1 %exitcond, label %header, label %exit 265 266exit: 267 ret void 268} 269 270define void @test_ext_03neg(i32 %n) nounwind { 271; Prove that (n > -3) =\=> (n / 2 >= 0). 272; CHECK: Determining loop execution counts for: @test_ext_03neg 273; CHECK: Loop %header: backedge-taken count is (0 smax (1 + (sext i32 %n.div.2 to i64))<nsw>) 274entry: 275 %cmp1 = icmp sgt i32 %n, -3 276 %n.div.2 = sdiv i32 %n, 2 277 %n.div.2.ext = sext i32 %n.div.2 to i64 278 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 279 br label %header 280 281header: 282 %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ] 283 %indvar.next = add i64 %indvar, 1 284 %exitcond = icmp sge i64 %n.div.2.ext, %indvar 285 br i1 %exitcond, label %header, label %exit 286 287exit: 288 ret void 289} 290 291define void @test_ext_04(i32 %n) nounwind { 292; Prove that (n >= -1) ===> (n / 2 >= 0). 293; CHECK: Determining loop execution counts for: @test_ext_04 294; CHECK: Loop %header: backedge-taken count is (1 + (sext i32 %n.div.2 to i64))<nsw> 295entry: 296 %cmp1 = icmp sge i32 %n, -1 297 %n.div.2 = sdiv i32 %n, 2 298 %n.div.2.ext = sext i32 %n.div.2 to i64 299 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 300 br label %header 301 302header: 303 %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ] 304 %indvar.next = add i64 %indvar, 1 305 %exitcond = icmp sge i64 %n.div.2.ext, %indvar 306 br i1 %exitcond, label %header, label %exit 307 308exit: 309 ret void 310} 311 312define void @test_ext_04neg(i32 %n) nounwind { 313; Prove that (n >= -2) =\=> (n / 2 >= 0). 314; CHECK: Determining loop execution counts for: @test_ext_04neg 315; CHECK: Loop %header: backedge-taken count is (0 smax (1 + (sext i32 %n.div.2 to i64))<nsw>) 316entry: 317 %cmp1 = icmp sge i32 %n, -2 318 %n.div.2 = sdiv i32 %n, 2 319 %n.div.2.ext = sext i32 %n.div.2 to i64 320 call void(i1, ...) @llvm.experimental.guard(i1 %cmp1) [ "deopt"() ] 321 br label %header 322 323header: 324 %indvar = phi i64 [ %indvar.next, %header ], [ 0, %entry ] 325 %indvar.next = add i64 %indvar, 1 326 %exitcond = icmp sge i64 %n.div.2.ext, %indvar 327 br i1 %exitcond, label %header, label %exit 328 329exit: 330 ret void 331} 332