1*9880d681SAndroid Build Coastguard Worker; RUN: opt -indvars -S < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker@X = external global [0 x double] 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Indvars should be able to simplify simple comparisons involving 8*9880d681SAndroid Build Coastguard Worker; induction variables. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo( 11*9880d681SAndroid Build Coastguard Worker; CHECK: %cond = and i1 %tobool.not, true 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workerdefine void @foo(i64 %n, i32* nocapture %p) nounwind { 14*9880d681SAndroid Build Coastguard Workerentry: 15*9880d681SAndroid Build Coastguard Worker %cmp9 = icmp sgt i64 %n, 0 16*9880d681SAndroid Build Coastguard Worker br i1 %cmp9, label %pre, label %return 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerpre: 19*9880d681SAndroid Build Coastguard Worker %t3 = load i32, i32* %p 20*9880d681SAndroid Build Coastguard Worker %tobool.not = icmp ne i32 %t3, 0 21*9880d681SAndroid Build Coastguard Worker br label %loop 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerloop: 24*9880d681SAndroid Build Coastguard Worker %i = phi i64 [ 0, %pre ], [ %inc, %for.inc ] 25*9880d681SAndroid Build Coastguard Worker %cmp6 = icmp slt i64 %i, %n 26*9880d681SAndroid Build Coastguard Worker %cond = and i1 %tobool.not, %cmp6 27*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %if.then, label %for.inc 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerif.then: 30*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr [0 x double], [0 x double]* @X, i64 0, i64 %i 31*9880d681SAndroid Build Coastguard Worker store double 3.200000e+00, double* %arrayidx 32*9880d681SAndroid Build Coastguard Worker br label %for.inc 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerfor.inc: 35*9880d681SAndroid Build Coastguard Worker %inc = add nsw i64 %i, 1 36*9880d681SAndroid Build Coastguard Worker %exitcond = icmp sge i64 %inc, %n 37*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %return, label %loop 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerreturn: 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; Don't eliminate an icmp that's contributing to the loop exit test though. 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_ZNK4llvm5APInt3ultERKS0_( 46*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp99 = icmp sgt i32 %i, -1 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine i32 @_ZNK4llvm5APInt3ultERKS0_(i32 %tmp2.i1, i64** %tmp65, i64** %tmp73, i64** %tmp82, i64** %tmp90) { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker br label %bb18 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerbb13: 53*9880d681SAndroid Build Coastguard Worker %tmp66 = load i64*, i64** %tmp65, align 4 54*9880d681SAndroid Build Coastguard Worker %tmp68 = getelementptr inbounds i64, i64* %tmp66, i32 %i 55*9880d681SAndroid Build Coastguard Worker %tmp69 = load i64, i64* %tmp68, align 4 56*9880d681SAndroid Build Coastguard Worker %tmp74 = load i64*, i64** %tmp73, align 4 57*9880d681SAndroid Build Coastguard Worker %tmp76 = getelementptr inbounds i64, i64* %tmp74, i32 %i 58*9880d681SAndroid Build Coastguard Worker %tmp77 = load i64, i64* %tmp76, align 4 59*9880d681SAndroid Build Coastguard Worker %tmp78 = icmp ugt i64 %tmp69, %tmp77 60*9880d681SAndroid Build Coastguard Worker br i1 %tmp78, label %bb20.loopexit, label %bb15 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerbb15: 63*9880d681SAndroid Build Coastguard Worker %tmp83 = load i64*, i64** %tmp82, align 4 64*9880d681SAndroid Build Coastguard Worker %tmp85 = getelementptr inbounds i64, i64* %tmp83, i32 %i 65*9880d681SAndroid Build Coastguard Worker %tmp86 = load i64, i64* %tmp85, align 4 66*9880d681SAndroid Build Coastguard Worker %tmp91 = load i64*, i64** %tmp90, align 4 67*9880d681SAndroid Build Coastguard Worker %tmp93 = getelementptr inbounds i64, i64* %tmp91, i32 %i 68*9880d681SAndroid Build Coastguard Worker %tmp94 = load i64, i64* %tmp93, align 4 69*9880d681SAndroid Build Coastguard Worker %tmp95 = icmp ult i64 %tmp86, %tmp94 70*9880d681SAndroid Build Coastguard Worker br i1 %tmp95, label %bb20.loopexit, label %bb17 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerbb17: 73*9880d681SAndroid Build Coastguard Worker %tmp97 = add nsw i32 %i, -1 74*9880d681SAndroid Build Coastguard Worker br label %bb18 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerbb18: 77*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ %tmp2.i1, %entry ], [ %tmp97, %bb17 ] 78*9880d681SAndroid Build Coastguard Worker %tmp99 = icmp sgt i32 %i, -1 79*9880d681SAndroid Build Coastguard Worker br i1 %tmp99, label %bb13, label %bb20.loopexit 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerbb20.loopexit: 82*9880d681SAndroid Build Coastguard Worker %tmp.0.ph = phi i32 [ 0, %bb18 ], [ 1, %bb15 ], [ 0, %bb13 ] 83*9880d681SAndroid Build Coastguard Worker ret i32 %tmp.0.ph 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; Indvars should eliminate the icmp here. 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_10( 89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp 90*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine void @func_10() nounwind { 93*9880d681SAndroid Build Coastguard Workerentry: 94*9880d681SAndroid Build Coastguard Worker br label %loop 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerloop: 97*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ %i.next, %loop ], [ 0, %entry ] 98*9880d681SAndroid Build Coastguard Worker %t0 = icmp slt i32 %i, 0 99*9880d681SAndroid Build Coastguard Worker %t1 = zext i1 %t0 to i32 100*9880d681SAndroid Build Coastguard Worker %t2 = add i32 %t1, %i 101*9880d681SAndroid Build Coastguard Worker %u3 = zext i32 %t2 to i64 102*9880d681SAndroid Build Coastguard Worker store i64 %u3, i64* null 103*9880d681SAndroid Build Coastguard Worker %i.next = add i32 %i, 1 104*9880d681SAndroid Build Coastguard Worker br i1 undef, label %loop, label %return 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerreturn: 107*9880d681SAndroid Build Coastguard Worker ret void 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; PR14432 111*9880d681SAndroid Build Coastguard Worker; Indvars should not turn the second loop into an infinite one. 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_11( 114*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp5 = icmp slt i32 %__key6.0, 10 115*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 true, label %noassert68, label %unrolledend 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine i32 @func_11() nounwind uwtable { 118*9880d681SAndroid Build Coastguard Workerentry: 119*9880d681SAndroid Build Coastguard Worker br label %forcond 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerforcond: ; preds = %noassert, %entry 122*9880d681SAndroid Build Coastguard Worker %__key6.0 = phi i32 [ 2, %entry ], [ %tmp37, %noassert ] 123*9880d681SAndroid Build Coastguard Worker %tmp5 = icmp slt i32 %__key6.0, 10 124*9880d681SAndroid Build Coastguard Worker br i1 %tmp5, label %noassert, label %forcond38.preheader 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerforcond38.preheader: ; preds = %forcond 127*9880d681SAndroid Build Coastguard Worker br label %forcond38 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Workernoassert: ; preds = %forbody 130*9880d681SAndroid Build Coastguard Worker %tmp13 = sdiv i32 -32768, %__key6.0 131*9880d681SAndroid Build Coastguard Worker %tmp2936 = shl i32 %tmp13, 24 132*9880d681SAndroid Build Coastguard Worker %sext23 = shl i32 %tmp13, 24 133*9880d681SAndroid Build Coastguard Worker %tmp32 = icmp eq i32 %tmp2936, %sext23 134*9880d681SAndroid Build Coastguard Worker %tmp37 = add i32 %__key6.0, 1 135*9880d681SAndroid Build Coastguard Worker br i1 %tmp32, label %forcond, label %assert33 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Workerassert33: ; preds = %noassert 138*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() 139*9880d681SAndroid Build Coastguard Worker unreachable 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workerforcond38: ; preds = %noassert68, %forcond38.preheader 142*9880d681SAndroid Build Coastguard Worker %__key8.0 = phi i32 [ %tmp81, %noassert68 ], [ 2, %forcond38.preheader ] 143*9880d681SAndroid Build Coastguard Worker %tmp46 = icmp slt i32 %__key8.0, 10 144*9880d681SAndroid Build Coastguard Worker br i1 %tmp46, label %noassert68, label %unrolledend 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Workernoassert68: ; preds = %forbody39 147*9880d681SAndroid Build Coastguard Worker %tmp57 = sdiv i32 -32768, %__key8.0 148*9880d681SAndroid Build Coastguard Worker %sext34 = shl i32 %tmp57, 16 149*9880d681SAndroid Build Coastguard Worker %sext21 = shl i32 %tmp57, 16 150*9880d681SAndroid Build Coastguard Worker %tmp76 = icmp eq i32 %sext34, %sext21 151*9880d681SAndroid Build Coastguard Worker %tmp81 = add i32 %__key8.0, 1 152*9880d681SAndroid Build Coastguard Worker br i1 %tmp76, label %forcond38, label %assert77 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerassert77: ; preds = %noassert68 155*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() 156*9880d681SAndroid Build Coastguard Worker unreachable 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerunrolledend: ; preds = %forcond38 159*9880d681SAndroid Build Coastguard Worker ret i32 0 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.trap() noreturn nounwind 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker; In this case the second loop only has a single iteration, fold the header away 165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_12( 166*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp5 = icmp slt i32 %__key6.0, 10 167*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %noassert68, label %unrolledend 168*9880d681SAndroid Build Coastguard Workerdefine i32 @func_12() nounwind uwtable { 169*9880d681SAndroid Build Coastguard Workerentry: 170*9880d681SAndroid Build Coastguard Worker br label %forcond 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerforcond: ; preds = %noassert, %entry 173*9880d681SAndroid Build Coastguard Worker %__key6.0 = phi i32 [ 2, %entry ], [ %tmp37, %noassert ] 174*9880d681SAndroid Build Coastguard Worker %tmp5 = icmp slt i32 %__key6.0, 10 175*9880d681SAndroid Build Coastguard Worker br i1 %tmp5, label %noassert, label %forcond38.preheader 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerforcond38.preheader: ; preds = %forcond 178*9880d681SAndroid Build Coastguard Worker br label %forcond38 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workernoassert: ; preds = %forbody 181*9880d681SAndroid Build Coastguard Worker %tmp13 = sdiv i32 -32768, %__key6.0 182*9880d681SAndroid Build Coastguard Worker %tmp2936 = shl i32 %tmp13, 24 183*9880d681SAndroid Build Coastguard Worker %sext23 = shl i32 %tmp13, 24 184*9880d681SAndroid Build Coastguard Worker %tmp32 = icmp eq i32 %tmp2936, %sext23 185*9880d681SAndroid Build Coastguard Worker %tmp37 = add i32 %__key6.0, 1 186*9880d681SAndroid Build Coastguard Worker br i1 %tmp32, label %forcond, label %assert33 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerassert33: ; preds = %noassert 189*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() 190*9880d681SAndroid Build Coastguard Worker unreachable 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Workerforcond38: ; preds = %noassert68, %forcond38.preheader 193*9880d681SAndroid Build Coastguard Worker %__key8.0 = phi i32 [ %tmp81, %noassert68 ], [ 2, %forcond38.preheader ] 194*9880d681SAndroid Build Coastguard Worker %tmp46 = icmp slt i32 %__key8.0, 10 195*9880d681SAndroid Build Coastguard Worker br i1 %tmp46, label %noassert68, label %unrolledend 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workernoassert68: ; preds = %forbody39 198*9880d681SAndroid Build Coastguard Worker %tmp57 = sdiv i32 -32768, %__key8.0 199*9880d681SAndroid Build Coastguard Worker %sext34 = shl i32 %tmp57, 16 200*9880d681SAndroid Build Coastguard Worker %sext21 = shl i32 %tmp57, 16 201*9880d681SAndroid Build Coastguard Worker %tmp76 = icmp ne i32 %sext34, %sext21 202*9880d681SAndroid Build Coastguard Worker %tmp81 = add i32 %__key8.0, 1 203*9880d681SAndroid Build Coastguard Worker br i1 %tmp76, label %forcond38, label %assert77 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerassert77: ; preds = %noassert68 206*9880d681SAndroid Build Coastguard Worker tail call void @llvm.trap() 207*9880d681SAndroid Build Coastguard Worker unreachable 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerunrolledend: ; preds = %forcond38 210*9880d681SAndroid Build Coastguard Worker ret i32 0 211*9880d681SAndroid Build Coastguard Worker} 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdeclare void @side_effect() 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerdefine void @func_13(i32* %len.ptr) { 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_13( 217*9880d681SAndroid Build Coastguard Worker entry: 218*9880d681SAndroid Build Coastguard Worker %len = load i32, i32* %len.ptr, !range !0 219*9880d681SAndroid Build Coastguard Worker %len.sub.1 = add i32 %len, -1 220*9880d681SAndroid Build Coastguard Worker %len.is.zero = icmp eq i32 %len, 0 221*9880d681SAndroid Build Coastguard Worker br i1 %len.is.zero, label %leave, label %loop 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker loop: 224*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 225*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] 226*9880d681SAndroid Build Coastguard Worker call void @side_effect() 227*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 228*9880d681SAndroid Build Coastguard Worker %iv.cmp = icmp ult i32 %iv, %len 229*9880d681SAndroid Build Coastguard Worker br i1 %iv.cmp, label %be, label %leave 230*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Worker be: 233*9880d681SAndroid Build Coastguard Worker call void @side_effect() 234*9880d681SAndroid Build Coastguard Worker %be.cond = icmp ult i32 %iv, %len.sub.1 235*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Worker leave: 238*9880d681SAndroid Build Coastguard Worker ret void 239*9880d681SAndroid Build Coastguard Worker} 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Workerdefine void @func_14(i32* %len.ptr) { 242*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_14( 243*9880d681SAndroid Build Coastguard Worker entry: 244*9880d681SAndroid Build Coastguard Worker %len = load i32, i32* %len.ptr, !range !0 245*9880d681SAndroid Build Coastguard Worker %len.sub.1 = add i32 %len, -1 246*9880d681SAndroid Build Coastguard Worker %len.is.zero = icmp eq i32 %len, 0 247*9880d681SAndroid Build Coastguard Worker %len.is.int_min = icmp eq i32 %len, 2147483648 248*9880d681SAndroid Build Coastguard Worker %no.entry = or i1 %len.is.zero, %len.is.int_min 249*9880d681SAndroid Build Coastguard Worker br i1 %no.entry, label %leave, label %loop 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Worker loop: 252*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 253*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] 254*9880d681SAndroid Build Coastguard Worker call void @side_effect() 255*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 256*9880d681SAndroid Build Coastguard Worker %iv.cmp = icmp slt i32 %iv, %len 257*9880d681SAndroid Build Coastguard Worker br i1 %iv.cmp, label %be, label %leave 258*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker be: 261*9880d681SAndroid Build Coastguard Worker call void @side_effect() 262*9880d681SAndroid Build Coastguard Worker %be.cond = icmp slt i32 %iv, %len.sub.1 263*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker leave: 266*9880d681SAndroid Build Coastguard Worker ret void 267*9880d681SAndroid Build Coastguard Worker} 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerdefine void @func_15(i32* %len.ptr) { 270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_15( 271*9880d681SAndroid Build Coastguard Worker entry: 272*9880d681SAndroid Build Coastguard Worker %len = load i32, i32* %len.ptr, !range !0 273*9880d681SAndroid Build Coastguard Worker %len.add.1 = add i32 %len, 1 274*9880d681SAndroid Build Coastguard Worker %len.add.1.is.zero = icmp eq i32 %len.add.1, 0 275*9880d681SAndroid Build Coastguard Worker br i1 %len.add.1.is.zero, label %leave, label %loop 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker loop: 278*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 279*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] 280*9880d681SAndroid Build Coastguard Worker call void @side_effect() 281*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 282*9880d681SAndroid Build Coastguard Worker %iv.cmp = icmp ult i32 %iv, %len.add.1 283*9880d681SAndroid Build Coastguard Worker br i1 %iv.cmp, label %be, label %leave 284*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker be: 287*9880d681SAndroid Build Coastguard Worker call void @side_effect() 288*9880d681SAndroid Build Coastguard Worker %be.cond = icmp ult i32 %iv, %len 289*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Worker leave: 292*9880d681SAndroid Build Coastguard Worker ret void 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Workerdefine void @func_16(i32* %len.ptr) { 296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_16( 297*9880d681SAndroid Build Coastguard Worker entry: 298*9880d681SAndroid Build Coastguard Worker %len = load i32, i32* %len.ptr, !range !0 299*9880d681SAndroid Build Coastguard Worker %len.add.5 = add i32 %len, 5 300*9880d681SAndroid Build Coastguard Worker %entry.cond.0 = icmp slt i32 %len, 2147483643 301*9880d681SAndroid Build Coastguard Worker %entry.cond.1 = icmp slt i32 4, %len.add.5 302*9880d681SAndroid Build Coastguard Worker %entry.cond = and i1 %entry.cond.0, %entry.cond.1 303*9880d681SAndroid Build Coastguard Worker br i1 %entry.cond, label %loop, label %leave 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Worker loop: 306*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 307*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] 308*9880d681SAndroid Build Coastguard Worker call void @side_effect() 309*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 310*9880d681SAndroid Build Coastguard Worker %iv.add.4 = add i32 %iv, 4 311*9880d681SAndroid Build Coastguard Worker %iv.cmp = icmp slt i32 %iv.add.4, %len.add.5 312*9880d681SAndroid Build Coastguard Worker br i1 %iv.cmp, label %be, label %leave 313*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Worker be: 316*9880d681SAndroid Build Coastguard Worker call void @side_effect() 317*9880d681SAndroid Build Coastguard Worker %be.cond = icmp slt i32 %iv, %len 318*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker leave: 321*9880d681SAndroid Build Coastguard Worker ret void 322*9880d681SAndroid Build Coastguard Worker} 323*9880d681SAndroid Build Coastguard Worker 324*9880d681SAndroid Build Coastguard Workerdefine void @func_17(i32* %len.ptr) { 325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_17( 326*9880d681SAndroid Build Coastguard Worker entry: 327*9880d681SAndroid Build Coastguard Worker %len = load i32, i32* %len.ptr 328*9880d681SAndroid Build Coastguard Worker %len.add.5 = add i32 %len, -5 329*9880d681SAndroid Build Coastguard Worker %entry.cond.0 = icmp slt i32 %len, 2147483653 ;; 2147483653 == INT_MIN - (-5) 330*9880d681SAndroid Build Coastguard Worker %entry.cond.1 = icmp slt i32 -6, %len.add.5 331*9880d681SAndroid Build Coastguard Worker %entry.cond = and i1 %entry.cond.0, %entry.cond.1 332*9880d681SAndroid Build Coastguard Worker br i1 %entry.cond, label %loop, label %leave 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker loop: 335*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 336*9880d681SAndroid Build Coastguard Worker %iv.2 = phi i32 [ 0, %entry ], [ %iv.2.inc, %be ] 337*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ -6, %entry ], [ %iv.inc, %be ] 338*9880d681SAndroid Build Coastguard Worker call void @side_effect() 339*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 340*9880d681SAndroid Build Coastguard Worker %iv.2.inc = add i32 %iv.2, 1 341*9880d681SAndroid Build Coastguard Worker %iv.cmp = icmp slt i32 %iv, %len.add.5 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Worker; Deduces {-5,+,1} s< (-5 + %len) from {0,+,1} < %len 344*9880d681SAndroid Build Coastguard Worker; since %len s< INT_MIN - (-5) from the entry condition 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave 347*9880d681SAndroid Build Coastguard Worker br i1 %iv.cmp, label %be, label %leave 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Worker be: 350*9880d681SAndroid Build Coastguard Worker; CHECK: be: 351*9880d681SAndroid Build Coastguard Worker call void @side_effect() 352*9880d681SAndroid Build Coastguard Worker %be.cond = icmp slt i32 %iv.2, %len 353*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker leave: 356*9880d681SAndroid Build Coastguard Worker ret void 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Workerdefine i1 @func_18(i16* %tmp20, i32* %len.addr) { 360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_18( 361*9880d681SAndroid Build Coastguard Workerentry: 362*9880d681SAndroid Build Coastguard Worker %len = load i32, i32* %len.addr, !range !0 363*9880d681SAndroid Build Coastguard Worker %tmp18 = icmp eq i32 %len, 0 364*9880d681SAndroid Build Coastguard Worker br i1 %tmp18, label %bb2, label %bb0.preheader 365*9880d681SAndroid Build Coastguard Worker 366*9880d681SAndroid Build Coastguard Workerbb0.preheader: 367*9880d681SAndroid Build Coastguard Worker br label %bb0 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerbb0: 370*9880d681SAndroid Build Coastguard Worker; CHECK: bb0: 371*9880d681SAndroid Build Coastguard Worker %var_0.in = phi i32 [ %var_0, %bb1 ], [ %len, %bb0.preheader ] 372*9880d681SAndroid Build Coastguard Worker %var_1 = phi i32 [ %tmp30, %bb1 ], [ 0, %bb0.preheader ] 373*9880d681SAndroid Build Coastguard Worker %var_0 = add nsw i32 %var_0.in, -1 374*9880d681SAndroid Build Coastguard Worker %tmp23 = icmp ult i32 %var_1, %len 375*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %stay, label %bb2.loopexit 376*9880d681SAndroid Build Coastguard Worker br i1 %tmp23, label %stay, label %bb2 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Workerstay: 379*9880d681SAndroid Build Coastguard Worker; CHECK: stay: 380*9880d681SAndroid Build Coastguard Worker %tmp25 = getelementptr inbounds i16, i16* %tmp20, i32 %var_1 381*9880d681SAndroid Build Coastguard Worker %tmp26 = load i16, i16* %tmp25 382*9880d681SAndroid Build Coastguard Worker %tmp29 = icmp eq i16 %tmp26, 0 383*9880d681SAndroid Build Coastguard Worker br i1 %tmp29, label %bb1, label %bb2 384*9880d681SAndroid Build Coastguard Worker 385*9880d681SAndroid Build Coastguard Workerbb1: 386*9880d681SAndroid Build Coastguard Worker %tmp30 = add i32 %var_1, 1 387*9880d681SAndroid Build Coastguard Worker %tmp31 = icmp eq i32 %var_0, 0 388*9880d681SAndroid Build Coastguard Worker br i1 %tmp31, label %bb3, label %bb0 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Workerbb2: 391*9880d681SAndroid Build Coastguard Worker ret i1 false 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Workerbb3: 394*9880d681SAndroid Build Coastguard Worker ret i1 true 395*9880d681SAndroid Build Coastguard Worker} 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Workerdefine void @func_19(i32* %length.ptr) { 398*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_19( 399*9880d681SAndroid Build Coastguard Worker entry: 400*9880d681SAndroid Build Coastguard Worker %length = load i32, i32* %length.ptr, !range !0 401*9880d681SAndroid Build Coastguard Worker %length.is.nonzero = icmp ne i32 %length, 0 402*9880d681SAndroid Build Coastguard Worker br i1 %length.is.nonzero, label %loop, label %leave 403*9880d681SAndroid Build Coastguard Worker 404*9880d681SAndroid Build Coastguard Worker loop: 405*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 406*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] 407*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 408*9880d681SAndroid Build Coastguard Worker %range.check = icmp ult i32 %iv, %length 409*9880d681SAndroid Build Coastguard Worker br i1 %range.check, label %be, label %leave 410*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave.loopexit 411*9880d681SAndroid Build Coastguard Worker; CHECK: be: 412*9880d681SAndroid Build Coastguard Worker 413*9880d681SAndroid Build Coastguard Worker be: 414*9880d681SAndroid Build Coastguard Worker call void @side_effect() 415*9880d681SAndroid Build Coastguard Worker %be.cond = icmp slt i32 %iv.inc, %length 416*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Worker leave: 419*9880d681SAndroid Build Coastguard Worker ret void 420*9880d681SAndroid Build Coastguard Worker} 421*9880d681SAndroid Build Coastguard Worker 422*9880d681SAndroid Build Coastguard Workerdefine void @func_20(i32* %length.ptr) { 423*9880d681SAndroid Build Coastguard Worker; Like @func_19, but %length is no longer provably positive, so 424*9880d681SAndroid Build Coastguard Worker; %range.check cannot be proved to be always true. 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_20( 427*9880d681SAndroid Build Coastguard Worker entry: 428*9880d681SAndroid Build Coastguard Worker %length = load i32, i32* %length.ptr 429*9880d681SAndroid Build Coastguard Worker %length.is.nonzero = icmp ne i32 %length, 0 430*9880d681SAndroid Build Coastguard Worker br i1 %length.is.nonzero, label %loop, label %leave 431*9880d681SAndroid Build Coastguard Worker 432*9880d681SAndroid Build Coastguard Worker loop: 433*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 434*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] 435*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 436*9880d681SAndroid Build Coastguard Worker %range.check = icmp ult i32 %iv, %length 437*9880d681SAndroid Build Coastguard Worker br i1 %range.check, label %be, label %leave 438*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %range.check, label %be, label %leave.loopexit 439*9880d681SAndroid Build Coastguard Worker; CHECK: be: 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Worker be: 442*9880d681SAndroid Build Coastguard Worker call void @side_effect() 443*9880d681SAndroid Build Coastguard Worker %be.cond = icmp slt i32 %iv.inc, %length 444*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 445*9880d681SAndroid Build Coastguard Worker 446*9880d681SAndroid Build Coastguard Worker leave: 447*9880d681SAndroid Build Coastguard Worker ret void 448*9880d681SAndroid Build Coastguard Worker} 449*9880d681SAndroid Build Coastguard Worker 450*9880d681SAndroid Build Coastguard Workerdefine void @func_21(i32* %length.ptr) { 451*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_21( 452*9880d681SAndroid Build Coastguard Worker 453*9880d681SAndroid Build Coastguard Worker; This checks that the backedge condition, (I + 1) < Length - 1 implies 454*9880d681SAndroid Build Coastguard Worker; (I + 1) < Length 455*9880d681SAndroid Build Coastguard Worker entry: 456*9880d681SAndroid Build Coastguard Worker %length = load i32, i32* %length.ptr, !range !0 457*9880d681SAndroid Build Coastguard Worker %lim = sub i32 %length, 1 458*9880d681SAndroid Build Coastguard Worker %entry.cond = icmp sgt i32 %length, 1 459*9880d681SAndroid Build Coastguard Worker br i1 %entry.cond, label %loop, label %leave 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker loop: 462*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 463*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] 464*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 465*9880d681SAndroid Build Coastguard Worker %range.check = icmp slt i32 %iv, %length 466*9880d681SAndroid Build Coastguard Worker br i1 %range.check, label %be, label %leave 467*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave.loopexit 468*9880d681SAndroid Build Coastguard Worker; CHECK: be: 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Worker be: 471*9880d681SAndroid Build Coastguard Worker call void @side_effect() 472*9880d681SAndroid Build Coastguard Worker %be.cond = icmp slt i32 %iv.inc, %lim 473*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 474*9880d681SAndroid Build Coastguard Worker 475*9880d681SAndroid Build Coastguard Worker leave: 476*9880d681SAndroid Build Coastguard Worker ret void 477*9880d681SAndroid Build Coastguard Worker} 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Workerdefine void @func_22(i32* %length.ptr) { 480*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_22( 481*9880d681SAndroid Build Coastguard Worker 482*9880d681SAndroid Build Coastguard Worker; This checks that the backedge condition, (I + 1) < Length - 1 implies 483*9880d681SAndroid Build Coastguard Worker; (I + 1) < Length 484*9880d681SAndroid Build Coastguard Worker entry: 485*9880d681SAndroid Build Coastguard Worker %length = load i32, i32* %length.ptr, !range !0 486*9880d681SAndroid Build Coastguard Worker %lim = sub i32 %length, 1 487*9880d681SAndroid Build Coastguard Worker %entry.cond = icmp sgt i32 %length, 1 488*9880d681SAndroid Build Coastguard Worker br i1 %entry.cond, label %loop, label %leave 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Worker loop: 491*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 492*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ] 493*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 494*9880d681SAndroid Build Coastguard Worker %range.check = icmp sle i32 %iv, %length 495*9880d681SAndroid Build Coastguard Worker br i1 %range.check, label %be, label %leave 496*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave.loopexit 497*9880d681SAndroid Build Coastguard Worker; CHECK: be: 498*9880d681SAndroid Build Coastguard Worker 499*9880d681SAndroid Build Coastguard Worker be: 500*9880d681SAndroid Build Coastguard Worker call void @side_effect() 501*9880d681SAndroid Build Coastguard Worker %be.cond = icmp sle i32 %iv.inc, %lim 502*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 503*9880d681SAndroid Build Coastguard Worker 504*9880d681SAndroid Build Coastguard Worker leave: 505*9880d681SAndroid Build Coastguard Worker ret void 506*9880d681SAndroid Build Coastguard Worker} 507*9880d681SAndroid Build Coastguard Worker 508*9880d681SAndroid Build Coastguard Workerdefine void @func_23(i32* %length.ptr) { 509*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_23( 510*9880d681SAndroid Build Coastguard Worker entry: 511*9880d681SAndroid Build Coastguard Worker %length = load i32, i32* %length.ptr, !range !0 512*9880d681SAndroid Build Coastguard Worker %entry.cond = icmp ult i32 4, %length 513*9880d681SAndroid Build Coastguard Worker br i1 %entry.cond, label %loop, label %leave 514*9880d681SAndroid Build Coastguard Worker 515*9880d681SAndroid Build Coastguard Worker loop: 516*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 517*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 4, %entry ], [ %iv.inc, %be ] 518*9880d681SAndroid Build Coastguard Worker %iv.inc = add i32 %iv, 1 519*9880d681SAndroid Build Coastguard Worker %range.check = icmp slt i32 %iv, %length 520*9880d681SAndroid Build Coastguard Worker br i1 %range.check, label %be, label %leave 521*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave.loopexit 522*9880d681SAndroid Build Coastguard Worker; CHECK: be: 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Worker be: 525*9880d681SAndroid Build Coastguard Worker call void @side_effect() 526*9880d681SAndroid Build Coastguard Worker %be.cond = icmp slt i32 %iv.inc, %length 527*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Worker leave: 530*9880d681SAndroid Build Coastguard Worker ret void 531*9880d681SAndroid Build Coastguard Worker} 532*9880d681SAndroid Build Coastguard Worker 533*9880d681SAndroid Build Coastguard Workerdefine void @func_24(i32* %init.ptr) { 534*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_24( 535*9880d681SAndroid Build Coastguard Worker entry: 536*9880d681SAndroid Build Coastguard Worker %init = load i32, i32* %init.ptr, !range !0 537*9880d681SAndroid Build Coastguard Worker %entry.cond = icmp ugt i32 %init, 4 538*9880d681SAndroid Build Coastguard Worker br i1 %entry.cond, label %loop, label %leave 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Worker loop: 541*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 542*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ %init, %entry ], [ %iv.dec, %be ] 543*9880d681SAndroid Build Coastguard Worker %iv.dec = add i32 %iv, -1 544*9880d681SAndroid Build Coastguard Worker %range.check = icmp sgt i32 %iv, 4 545*9880d681SAndroid Build Coastguard Worker br i1 %range.check, label %be, label %leave 546*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave.loopexit 547*9880d681SAndroid Build Coastguard Worker; CHECK: be: 548*9880d681SAndroid Build Coastguard Worker 549*9880d681SAndroid Build Coastguard Worker be: 550*9880d681SAndroid Build Coastguard Worker call void @side_effect() 551*9880d681SAndroid Build Coastguard Worker %be.cond = icmp sgt i32 %iv.dec, 4 552*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 553*9880d681SAndroid Build Coastguard Worker 554*9880d681SAndroid Build Coastguard Worker leave: 555*9880d681SAndroid Build Coastguard Worker ret void 556*9880d681SAndroid Build Coastguard Worker} 557*9880d681SAndroid Build Coastguard Worker 558*9880d681SAndroid Build Coastguard Worker 559*9880d681SAndroid Build Coastguard Worker!0 = !{i32 0, i32 2147483647} 560