1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -indvars -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget triple = "aarch64--linux-gnu" 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Provide legal integer types. 5*9880d681SAndroid Build Coastguard Workertarget datalayout = "n8:16:32:64" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; Check the loop exit i32 compare instruction and operand are widened to i64 9*9880d681SAndroid Build Coastguard Worker; instead of truncating IV before its use in the i32 compare instruction. 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker@idx = common global i32 0, align 4 12*9880d681SAndroid Build Coastguard Worker@e = common global i32 0, align 4 13*9880d681SAndroid Build Coastguard Worker@ptr = common global i32* null, align 8 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1 16*9880d681SAndroid Build Coastguard Worker; CHECK: for.body.lr.ph: 17*9880d681SAndroid Build Coastguard Worker; CHECK: sext i32 18*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond: 19*9880d681SAndroid Build Coastguard Worker; CHECK: icmp slt i64 20*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 21*9880d681SAndroid Build Coastguard Worker; CHECK: phi i64 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Workerdefine i32 @test1() { 24*9880d681SAndroid Build Coastguard Workerentry: 25*9880d681SAndroid Build Coastguard Worker store i32 -1, i32* @idx, align 4 26*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @e, align 4 27*9880d681SAndroid Build Coastguard Worker %cmp4 = icmp slt i32 %0, 0 28*9880d681SAndroid Build Coastguard Worker br i1 %cmp4, label %for.end.loopexit, label %for.body.lr.ph 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerfor.body.lr.ph: 31*9880d681SAndroid Build Coastguard Worker %1 = load i32*, i32** @ptr, align 8 32*9880d681SAndroid Build Coastguard Worker %2 = load i32, i32* @e, align 4 33*9880d681SAndroid Build Coastguard Worker br label %for.body 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerfor.cond: 36*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i.05, 1 37*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %i.05, %2 38*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.cond.for.end.loopexit_crit_edge 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerfor.body: 41*9880d681SAndroid Build Coastguard Worker %i.05 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.cond ] 42*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.05 to i64 43*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %1, i64 %idxprom 44*9880d681SAndroid Build Coastguard Worker %3 = load i32, i32* %arrayidx, align 4 45*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %3, 0 46*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.then, label %for.cond 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerif.then: 49*9880d681SAndroid Build Coastguard Worker %i.05.lcssa = phi i32 [ %i.05, %for.body ] 50*9880d681SAndroid Build Coastguard Worker store i32 %i.05.lcssa, i32* @idx, align 4 51*9880d681SAndroid Build Coastguard Worker br label %for.end 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerfor.cond.for.end.loopexit_crit_edge: 54*9880d681SAndroid Build Coastguard Worker br label %for.end.loopexit 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerfor.end.loopexit: 57*9880d681SAndroid Build Coastguard Worker br label %for.end 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerfor.end: 60*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* @idx, align 4 61*9880d681SAndroid Build Coastguard Worker ret i32 %4 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2 65*9880d681SAndroid Build Coastguard Worker; CHECK: for.body4.us 66*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 67*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp2.us = icmp slt i64 68*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %2 = trunc i64 %indvars.iv.next to i32 69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %cmp2.us = icmp slt i32 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine void @test2([8 x i8]* %a, i8* %b, i8 %limit) { 72*9880d681SAndroid Build Coastguard Workerentry: 73*9880d681SAndroid Build Coastguard Worker %conv = zext i8 %limit to i32 74*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.cond1.preheader, label %for.cond1.preheader.us 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader.us: 77*9880d681SAndroid Build Coastguard Worker %storemerge5.us = phi i32 [ 0, %entry ], [ %inc14.us, %for.inc13.us ] 78*9880d681SAndroid Build Coastguard Worker br i1 true, label %for.body4.lr.ph.us, label %for.inc13.us 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerfor.inc13.us: 81*9880d681SAndroid Build Coastguard Worker %inc14.us = add nsw i32 %storemerge5.us, 1 82*9880d681SAndroid Build Coastguard Worker %cmp.us = icmp slt i32 %inc14.us, 4 83*9880d681SAndroid Build Coastguard Worker br i1 %cmp.us, label %for.cond1.preheader.us, label %for.end 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerfor.body4.us: 86*9880d681SAndroid Build Coastguard Worker %storemerge14.us = phi i32 [ 0, %for.body4.lr.ph.us ], [ %inc.us, %for.body4.us ] 87*9880d681SAndroid Build Coastguard Worker %idxprom.us = sext i32 %storemerge14.us to i64 88*9880d681SAndroid Build Coastguard Worker %arrayidx6.us = getelementptr inbounds [8 x i8], [8 x i8]* %a, i64 %idxprom5.us, i64 %idxprom.us 89*9880d681SAndroid Build Coastguard Worker %0 = load i8, i8* %arrayidx6.us, align 1 90*9880d681SAndroid Build Coastguard Worker %idxprom7.us = zext i8 %0 to i64 91*9880d681SAndroid Build Coastguard Worker %arrayidx8.us = getelementptr inbounds i8, i8* %b, i64 %idxprom7.us 92*9880d681SAndroid Build Coastguard Worker %1 = load i8, i8* %arrayidx8.us, align 1 93*9880d681SAndroid Build Coastguard Worker store i8 %1, i8* %arrayidx6.us, align 1 94*9880d681SAndroid Build Coastguard Worker %inc.us = add nsw i32 %storemerge14.us, 1 95*9880d681SAndroid Build Coastguard Worker %cmp2.us = icmp slt i32 %inc.us, %conv 96*9880d681SAndroid Build Coastguard Worker br i1 %cmp2.us, label %for.body4.us, label %for.inc13.us 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerfor.body4.lr.ph.us: 99*9880d681SAndroid Build Coastguard Worker %idxprom5.us = sext i32 %storemerge5.us to i64 100*9880d681SAndroid Build Coastguard Worker br label %for.body4.us 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: 103*9880d681SAndroid Build Coastguard Worker %storemerge5 = phi i32 [ 0, %entry ], [ %inc14, %for.inc13 ] 104*9880d681SAndroid Build Coastguard Worker br i1 false, label %for.inc13, label %for.inc13 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerfor.inc13: 107*9880d681SAndroid Build Coastguard Worker %inc14 = add nsw i32 %storemerge5, 1 108*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %inc14, 4 109*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.cond1.preheader, label %for.end 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerfor.end: 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3 116*9880d681SAndroid Build Coastguard Worker; CHECK: sext i32 %b 117*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond: 118*9880d681SAndroid Build Coastguard Worker; CHECK: phi i64 119*9880d681SAndroid Build Coastguard Worker; CHECK: icmp slt i64 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32* %a, i32 %b) { 122*9880d681SAndroid Build Coastguard Workerentry: 123*9880d681SAndroid Build Coastguard Worker br label %for.cond 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Workerfor.cond: 126*9880d681SAndroid Build Coastguard Worker %sum.0 = phi i32 [ 0, %entry ], [ %add, %for.body ] 127*9880d681SAndroid Build Coastguard Worker %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 128*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %i.0, %b 129*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerfor.body: 132*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.0 to i64 133*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 134*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 135*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %sum.0, %0 136*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i.0, 1 137*9880d681SAndroid Build Coastguard Worker br label %for.cond 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerfor.end: 140*9880d681SAndroid Build Coastguard Worker ret i32 %sum.0 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Workerdeclare i32 @fn1(i8 signext) 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; PR21030 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4 147*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 148*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 149*9880d681SAndroid Build Coastguard Worker; CHECK: icmp sgt i8 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %a) { 152*9880d681SAndroid Build Coastguard Workerentry: 153*9880d681SAndroid Build Coastguard Worker br label %for.body 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerfor.body: 156*9880d681SAndroid Build Coastguard Worker %c.07 = phi i8 [ -3, %entry ], [ %dec, %for.body ] 157*9880d681SAndroid Build Coastguard Worker %conv6 = zext i8 %c.07 to i32 158*9880d681SAndroid Build Coastguard Worker %or = or i32 %a, %conv6 159*9880d681SAndroid Build Coastguard Worker %conv3 = trunc i32 %or to i8 160*9880d681SAndroid Build Coastguard Worker %call = call i32 @fn1(i8 signext %conv3) 161*9880d681SAndroid Build Coastguard Worker %dec = add i8 %c.07, -1 162*9880d681SAndroid Build Coastguard Worker %cmp = icmp sgt i8 %dec, -14 163*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerfor.end: 166*9880d681SAndroid Build Coastguard Worker ret i32 0 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5 170*9880d681SAndroid Build Coastguard Worker; CHECK: zext i32 %b 171*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond: 172*9880d681SAndroid Build Coastguard Worker; CHECK: phi i64 173*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ule i64 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32* %a, i32 %b) { 176*9880d681SAndroid Build Coastguard Workerentry: 177*9880d681SAndroid Build Coastguard Worker br label %for.cond 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerfor.cond: 180*9880d681SAndroid Build Coastguard Worker %sum.0 = phi i32 [ 0, %entry ], [ %add, %for.body ] 181*9880d681SAndroid Build Coastguard Worker %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 182*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule i32 %i.0, %b 183*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerfor.body: 186*9880d681SAndroid Build Coastguard Worker %idxprom = zext i32 %i.0 to i64 187*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 188*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 189*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %sum.0, %0 190*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i.0, 1 191*9880d681SAndroid Build Coastguard Worker br label %for.cond 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Workerfor.end: 194*9880d681SAndroid Build Coastguard Worker ret i32 %sum.0 195*9880d681SAndroid Build Coastguard Worker} 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32* %a, i32 %b) { 198*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6( 199*9880d681SAndroid Build Coastguard Worker; CHECK: [[B_SEXT:%[a-z0-9]+]] = sext i32 %b to i64 200*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond: 201*9880d681SAndroid Build Coastguard Worker; CHECK: icmp sle i64 %indvars.iv, [[B_SEXT]] 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerentry: 204*9880d681SAndroid Build Coastguard Worker br label %for.cond 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerfor.cond: 207*9880d681SAndroid Build Coastguard Worker %sum.0 = phi i32 [ 0, %entry ], [ %add, %for.body ] 208*9880d681SAndroid Build Coastguard Worker %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 209*9880d681SAndroid Build Coastguard Worker %cmp = icmp sle i32 %i.0, %b 210*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workerfor.body: 213*9880d681SAndroid Build Coastguard Worker %idxprom = zext i32 %i.0 to i64 214*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 215*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 216*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %sum.0, %0 217*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i.0, 1 218*9880d681SAndroid Build Coastguard Worker br label %for.cond 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Workerfor.end: 221*9880d681SAndroid Build Coastguard Worker ret i32 %sum.0 222*9880d681SAndroid Build Coastguard Worker} 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32* %a, i32 %b) { 225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7( 226*9880d681SAndroid Build Coastguard Worker; CHECK: [[B_ZEXT:%[a-z0-9]+]] = zext i32 %b to i64 227*9880d681SAndroid Build Coastguard Worker; CHECK: [[B_SEXT:%[a-z0-9]+]] = sext i32 %b to i64 228*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond: 229*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ule i64 %indvars.iv, [[B_ZEXT]] 230*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 231*9880d681SAndroid Build Coastguard Worker; CHECK: icmp sle i64 %indvars.iv, [[B_SEXT]] 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerentry: 234*9880d681SAndroid Build Coastguard Worker br label %for.cond 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerfor.cond: 237*9880d681SAndroid Build Coastguard Worker %sum.0 = phi i32 [ 0, %entry ], [ %add, %for.body ] 238*9880d681SAndroid Build Coastguard Worker %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 239*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule i32 %i.0, %b 240*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Workerfor.body: 243*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.0 to i64 244*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 245*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 246*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %sum.0, %0 247*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i.0, 1 248*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp sle i32 %i.0, %b 249*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %for.cond, label %for.end 250*9880d681SAndroid Build Coastguard Worker 251*9880d681SAndroid Build Coastguard Workerfor.end: 252*9880d681SAndroid Build Coastguard Worker ret i32 %sum.0 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32* %a, i32 %b, i32 %init) { 256*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8( 257*9880d681SAndroid Build Coastguard Worker; CHECK: [[INIT_SEXT:%[a-z0-9]+]] = sext i32 %init to i64 258*9880d681SAndroid Build Coastguard Worker; CHECK: [[B_ZEXT:%[a-z0-9]+]] = zext i32 %b to i64 259*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond: 260*9880d681SAndroid Build Coastguard Worker; Note: %indvars.iv is the sign extension of %i.0 261*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ [[INIT_SEXT]], %for.cond.preheader ], [ %indvars.iv.next, %for.body ] 262*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ule i64 %indvars.iv, [[B_ZEXT]] 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Workerentry: 265*9880d681SAndroid Build Coastguard Worker %e = icmp sgt i32 %init, 0 266*9880d681SAndroid Build Coastguard Worker br i1 %e, label %for.cond, label %leave 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Workerfor.cond: 269*9880d681SAndroid Build Coastguard Worker %sum.0 = phi i32 [ 0, %entry ], [ %add, %for.body ] 270*9880d681SAndroid Build Coastguard Worker %i.0 = phi i32 [ %init, %entry ], [ %inc, %for.body ] 271*9880d681SAndroid Build Coastguard Worker %cmp = icmp ule i32 %i.0, %b 272*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Workerfor.body: 275*9880d681SAndroid Build Coastguard Worker %idxprom = sext i32 %i.0 to i64 276*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 277*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 278*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %sum.0, %0 279*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i.0, 1 280*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp slt i32 0, %inc 281*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %for.cond, label %for.end 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerfor.end: 284*9880d681SAndroid Build Coastguard Worker ret i32 %sum.0 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Workerleave: 287*9880d681SAndroid Build Coastguard Worker ret i32 0 288*9880d681SAndroid Build Coastguard Worker} 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32* %a, i32 %b, i32 %init) { 291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9( 292*9880d681SAndroid Build Coastguard Worker; CHECK: [[INIT_ZEXT:%[a-z0-9]+]] = zext i32 %init to i64 293*9880d681SAndroid Build Coastguard Worker; CHECK: [[B_SEXT:%[a-z0-9]+]] = sext i32 %b to i64 294*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond: 295*9880d681SAndroid Build Coastguard Worker; Note: %indvars.iv is the zero extension of %i.0 296*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ [[INIT_ZEXT]], %for.cond.preheader ], [ %indvars.iv.next, %for.body ] 297*9880d681SAndroid Build Coastguard Worker; CHECK: icmp slt i64 %indvars.iv, [[B_SEXT]] 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerentry: 300*9880d681SAndroid Build Coastguard Worker %e = icmp sgt i32 %init, 0 301*9880d681SAndroid Build Coastguard Worker br i1 %e, label %for.cond, label %leave 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Workerfor.cond: 304*9880d681SAndroid Build Coastguard Worker %sum.0 = phi i32 [ 0, %entry ], [ %add, %for.body ] 305*9880d681SAndroid Build Coastguard Worker %i.0 = phi i32 [ %init, %entry ], [ %inc, %for.body ] 306*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %i.0, %b 307*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Workerfor.body: 310*9880d681SAndroid Build Coastguard Worker %idxprom = zext i32 %i.0 to i64 311*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %idxprom 312*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 313*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %sum.0, %0 314*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i.0, 1 315*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp slt i32 0, %inc 316*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %for.cond, label %for.end 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Workerfor.end: 319*9880d681SAndroid Build Coastguard Worker ret i32 %sum.0 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerleave: 322*9880d681SAndroid Build Coastguard Worker ret i32 0 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Workerdeclare void @consume.i64(i64) 326*9880d681SAndroid Build Coastguard Workerdeclare void @consume.i1(i1) 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %v) { 329*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10( 330*9880d681SAndroid Build Coastguard Worker entry: 331*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: zext 332*9880d681SAndroid Build Coastguard Worker br label %loop 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker loop: 335*9880d681SAndroid Build Coastguard Worker; CHECK: loop: 336*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ 0, %entry ] 337*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 338*9880d681SAndroid Build Coastguard Worker; CHECK: [[MUL:%[a-z0-9]+]] = mul nsw i64 %indvars.iv, -1 339*9880d681SAndroid Build Coastguard Worker; CHECK: [[MUL_TRUNC:%[a-z0-9]+]] = trunc i64 [[MUL]] to i32 340*9880d681SAndroid Build Coastguard Worker; CHECK: [[CMP:%[a-z0-9]+]] = icmp eq i32 [[MUL_TRUNC]], %v 341*9880d681SAndroid Build Coastguard Worker; CHECK: call void @consume.i1(i1 [[CMP]]) 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ 0, %entry ], [ %i.inc, %loop ] 344*9880d681SAndroid Build Coastguard Worker %i.inc = add i32 %i, 1 345*9880d681SAndroid Build Coastguard Worker %iv = mul i32 %i, -1 346*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %iv, %v 347*9880d681SAndroid Build Coastguard Worker call void @consume.i1(i1 %cmp) 348*9880d681SAndroid Build Coastguard Worker %be.cond = icmp slt i32 %i.inc, 11 349*9880d681SAndroid Build Coastguard Worker %ext = sext i32 %iv to i64 350*9880d681SAndroid Build Coastguard Worker call void @consume.i64(i64 %ext) 351*9880d681SAndroid Build Coastguard Worker br i1 %be.cond, label %loop, label %leave 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Worker leave: 354*9880d681SAndroid Build Coastguard Worker ret i32 22 355*9880d681SAndroid Build Coastguard Worker} 356