1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-reroll -S | FileCheck %s 2*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-S128" 3*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; int foo(int a); 6*9880d681SAndroid Build Coastguard Worker; void bar(int *x) { 7*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 500; i += 3) { 8*9880d681SAndroid Build Coastguard Worker; foo(i); 9*9880d681SAndroid Build Coastguard Worker; foo(i+1); 10*9880d681SAndroid Build Coastguard Worker; foo(i+2); 11*9880d681SAndroid Build Coastguard Worker; } 12*9880d681SAndroid Build Coastguard Worker; } 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 15*9880d681SAndroid Build Coastguard Workerdefine void @bar(i32* nocapture readnone %x) #0 { 16*9880d681SAndroid Build Coastguard Workerentry: 17*9880d681SAndroid Build Coastguard Worker br label %for.body 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 20*9880d681SAndroid Build Coastguard Worker %i.08 = phi i32 [ 0, %entry ], [ %add3, %for.body ] 21*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @foo(i32 %i.08) #1 22*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %i.08, 1 23*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 @foo(i32 %add) #1 24*9880d681SAndroid Build Coastguard Worker %add2 = add nsw i32 %i.08, 2 25*9880d681SAndroid Build Coastguard Worker %call3 = tail call i32 @foo(i32 %add2) #1 26*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i32 %i.08, 3 27*9880d681SAndroid Build Coastguard Worker %exitcond = icmp sge i32 %add3, 500 28*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 33*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i32 [ %indvar.next, %for.body ], [ 0, %entry ] 34*9880d681SAndroid Build Coastguard Worker; CHECK: %call = tail call i32 @foo(i32 %indvar) #1 35*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i32 %indvar, 1 36*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond1 = icmp eq i32 %indvar, 500 37*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond1, label %for.end, label %for.body 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker; CHECK: ret 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 42*9880d681SAndroid Build Coastguard Worker ret void 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo(i32) 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; void hi1(int *x) { 48*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 1500; i += 3) { 49*9880d681SAndroid Build Coastguard Worker; x[i] = foo(0); 50*9880d681SAndroid Build Coastguard Worker; x[i+1] = foo(0); 51*9880d681SAndroid Build Coastguard Worker; x[i+2] = foo(0); 52*9880d681SAndroid Build Coastguard Worker; } 53*9880d681SAndroid Build Coastguard Worker; } 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 56*9880d681SAndroid Build Coastguard Workerdefine void @hi1(i32* nocapture %x) #0 { 57*9880d681SAndroid Build Coastguard Workerentry: 58*9880d681SAndroid Build Coastguard Worker br label %for.body 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 61*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 62*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @foo(i32 0) #1 63*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv 64*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx, align 4 65*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 @foo(i32 0) #1 66*9880d681SAndroid Build Coastguard Worker %0 = add nsw i64 %indvars.iv, 1 67*9880d681SAndroid Build Coastguard Worker %arrayidx3 = getelementptr inbounds i32, i32* %x, i64 %0 68*9880d681SAndroid Build Coastguard Worker store i32 %call1, i32* %arrayidx3, align 4 69*9880d681SAndroid Build Coastguard Worker %call4 = tail call i32 @foo(i32 0) #1 70*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %indvars.iv, 2 71*9880d681SAndroid Build Coastguard Worker %arrayidx7 = getelementptr inbounds i32, i32* %x, i64 %1 72*9880d681SAndroid Build Coastguard Worker store i32 %call4, i32* %arrayidx7, align 4 73*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 3 74*9880d681SAndroid Build Coastguard Worker %2 = trunc i64 %indvars.iv.next to i32 75*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %2, 1500 76*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @hi1 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 81*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ] 82*9880d681SAndroid Build Coastguard Worker; CHECK: %call = tail call i32 @foo(i32 0) #1 83*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvar 84*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx, align 4 85*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i64 %indvar, 1 86*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvar, 1499 87*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.end, label %for.body 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; CHECK: ret 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; void hi2(int *x) { 96*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 500; ++i) { 97*9880d681SAndroid Build Coastguard Worker; x[3*i] = foo(0); 98*9880d681SAndroid Build Coastguard Worker; x[3*i+1] = foo(0); 99*9880d681SAndroid Build Coastguard Worker; x[3*i+2] = foo(0); 100*9880d681SAndroid Build Coastguard Worker; } 101*9880d681SAndroid Build Coastguard Worker; } 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 104*9880d681SAndroid Build Coastguard Workerdefine void @hi2(i32* nocapture %x) #0 { 105*9880d681SAndroid Build Coastguard Workerentry: 106*9880d681SAndroid Build Coastguard Worker br label %for.body 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 109*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 110*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @foo(i32 0) #1 111*9880d681SAndroid Build Coastguard Worker %0 = mul nsw i64 %indvars.iv, 3 112*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %x, i64 %0 113*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx, align 4 114*9880d681SAndroid Build Coastguard Worker %call1 = tail call i32 @foo(i32 0) #1 115*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %0, 1 116*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds i32, i32* %x, i64 %1 117*9880d681SAndroid Build Coastguard Worker store i32 %call1, i32* %arrayidx4, align 4 118*9880d681SAndroid Build Coastguard Worker %call5 = tail call i32 @foo(i32 0) #1 119*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %0, 2 120*9880d681SAndroid Build Coastguard Worker %arrayidx9 = getelementptr inbounds i32, i32* %x, i64 %2 121*9880d681SAndroid Build Coastguard Worker store i32 %call5, i32* %arrayidx9, align 4 122*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 123*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 500 124*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @hi2 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 129*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 130*9880d681SAndroid Build Coastguard Worker; CHECK: %call = tail call i32 @foo(i32 0) #1 131*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv 132*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx, align 4 133*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 134*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond1 = icmp eq i64 %indvars.iv, 1499 135*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond1, label %for.end, label %for.body 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; CHECK: ret 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 140*9880d681SAndroid Build Coastguard Worker ret void 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker; void goo(float alpha, float *a, float *b) { 144*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 3200; i += 5) { 145*9880d681SAndroid Build Coastguard Worker; a[i] += alpha * b[i]; 146*9880d681SAndroid Build Coastguard Worker; a[i + 1] += alpha * b[i + 1]; 147*9880d681SAndroid Build Coastguard Worker; a[i + 2] += alpha * b[i + 2]; 148*9880d681SAndroid Build Coastguard Worker; a[i + 3] += alpha * b[i + 3]; 149*9880d681SAndroid Build Coastguard Worker; a[i + 4] += alpha * b[i + 4]; 150*9880d681SAndroid Build Coastguard Worker; } 151*9880d681SAndroid Build Coastguard Worker; } 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 154*9880d681SAndroid Build Coastguard Workerdefine void @goo(float %alpha, float* nocapture %a, float* nocapture readonly %b) #0 { 155*9880d681SAndroid Build Coastguard Workerentry: 156*9880d681SAndroid Build Coastguard Worker br label %for.body 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 159*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 160*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds float, float* %b, i64 %indvars.iv 161*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %arrayidx, align 4 162*9880d681SAndroid Build Coastguard Worker %mul = fmul float %0, %alpha 163*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds float, float* %a, i64 %indvars.iv 164*9880d681SAndroid Build Coastguard Worker %1 = load float, float* %arrayidx2, align 4 165*9880d681SAndroid Build Coastguard Worker %add = fadd float %1, %mul 166*9880d681SAndroid Build Coastguard Worker store float %add, float* %arrayidx2, align 4 167*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %indvars.iv, 1 168*9880d681SAndroid Build Coastguard Worker %arrayidx5 = getelementptr inbounds float, float* %b, i64 %2 169*9880d681SAndroid Build Coastguard Worker %3 = load float, float* %arrayidx5, align 4 170*9880d681SAndroid Build Coastguard Worker %mul6 = fmul float %3, %alpha 171*9880d681SAndroid Build Coastguard Worker %arrayidx9 = getelementptr inbounds float, float* %a, i64 %2 172*9880d681SAndroid Build Coastguard Worker %4 = load float, float* %arrayidx9, align 4 173*9880d681SAndroid Build Coastguard Worker %add10 = fadd float %4, %mul6 174*9880d681SAndroid Build Coastguard Worker store float %add10, float* %arrayidx9, align 4 175*9880d681SAndroid Build Coastguard Worker %5 = add nsw i64 %indvars.iv, 2 176*9880d681SAndroid Build Coastguard Worker %arrayidx13 = getelementptr inbounds float, float* %b, i64 %5 177*9880d681SAndroid Build Coastguard Worker %6 = load float, float* %arrayidx13, align 4 178*9880d681SAndroid Build Coastguard Worker %mul14 = fmul float %6, %alpha 179*9880d681SAndroid Build Coastguard Worker %arrayidx17 = getelementptr inbounds float, float* %a, i64 %5 180*9880d681SAndroid Build Coastguard Worker %7 = load float, float* %arrayidx17, align 4 181*9880d681SAndroid Build Coastguard Worker %add18 = fadd float %7, %mul14 182*9880d681SAndroid Build Coastguard Worker store float %add18, float* %arrayidx17, align 4 183*9880d681SAndroid Build Coastguard Worker %8 = add nsw i64 %indvars.iv, 3 184*9880d681SAndroid Build Coastguard Worker %arrayidx21 = getelementptr inbounds float, float* %b, i64 %8 185*9880d681SAndroid Build Coastguard Worker %9 = load float, float* %arrayidx21, align 4 186*9880d681SAndroid Build Coastguard Worker %mul22 = fmul float %9, %alpha 187*9880d681SAndroid Build Coastguard Worker %arrayidx25 = getelementptr inbounds float, float* %a, i64 %8 188*9880d681SAndroid Build Coastguard Worker %10 = load float, float* %arrayidx25, align 4 189*9880d681SAndroid Build Coastguard Worker %add26 = fadd float %10, %mul22 190*9880d681SAndroid Build Coastguard Worker store float %add26, float* %arrayidx25, align 4 191*9880d681SAndroid Build Coastguard Worker %11 = add nsw i64 %indvars.iv, 4 192*9880d681SAndroid Build Coastguard Worker %arrayidx29 = getelementptr inbounds float, float* %b, i64 %11 193*9880d681SAndroid Build Coastguard Worker %12 = load float, float* %arrayidx29, align 4 194*9880d681SAndroid Build Coastguard Worker %mul30 = fmul float %12, %alpha 195*9880d681SAndroid Build Coastguard Worker %arrayidx33 = getelementptr inbounds float, float* %a, i64 %11 196*9880d681SAndroid Build Coastguard Worker %13 = load float, float* %arrayidx33, align 4 197*9880d681SAndroid Build Coastguard Worker %add34 = fadd float %13, %mul30 198*9880d681SAndroid Build Coastguard Worker store float %add34, float* %arrayidx33, align 4 199*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 5 200*9880d681SAndroid Build Coastguard Worker %14 = trunc i64 %indvars.iv.next to i32 201*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %14, 3200 202*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @goo 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 207*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ] 208*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds float, float* %b, i64 %indvar 209*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = load float, float* %arrayidx, align 4 210*9880d681SAndroid Build Coastguard Worker; CHECK: %mul = fmul float %0, %alpha 211*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx2 = getelementptr inbounds float, float* %a, i64 %indvar 212*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = load float, float* %arrayidx2, align 4 213*9880d681SAndroid Build Coastguard Worker; CHECK: %add = fadd float %1, %mul 214*9880d681SAndroid Build Coastguard Worker; CHECK: store float %add, float* %arrayidx2, align 4 215*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i64 %indvar, 1 216*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvar, 3199 217*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.end, label %for.body 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Worker; CHECK: ret 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 222*9880d681SAndroid Build Coastguard Worker ret void 223*9880d681SAndroid Build Coastguard Worker} 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker; void hoo(float alpha, float *a, float *b, int *ip) { 226*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 3200; i += 5) { 227*9880d681SAndroid Build Coastguard Worker; a[i] += alpha * b[ip[i]]; 228*9880d681SAndroid Build Coastguard Worker; a[i + 1] += alpha * b[ip[i + 1]]; 229*9880d681SAndroid Build Coastguard Worker; a[i + 2] += alpha * b[ip[i + 2]]; 230*9880d681SAndroid Build Coastguard Worker; a[i + 3] += alpha * b[ip[i + 3]]; 231*9880d681SAndroid Build Coastguard Worker; a[i + 4] += alpha * b[ip[i + 4]]; 232*9880d681SAndroid Build Coastguard Worker; } 233*9880d681SAndroid Build Coastguard Worker; } 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 236*9880d681SAndroid Build Coastguard Workerdefine void @hoo(float %alpha, float* nocapture %a, float* nocapture readonly %b, i32* nocapture readonly %ip) #0 { 237*9880d681SAndroid Build Coastguard Workerentry: 238*9880d681SAndroid Build Coastguard Worker br label %for.body 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 241*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 242*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %ip, i64 %indvars.iv 243*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 244*9880d681SAndroid Build Coastguard Worker %idxprom1 = sext i32 %0 to i64 245*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds float, float* %b, i64 %idxprom1 246*9880d681SAndroid Build Coastguard Worker %1 = load float, float* %arrayidx2, align 4 247*9880d681SAndroid Build Coastguard Worker %mul = fmul float %1, %alpha 248*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds float, float* %a, i64 %indvars.iv 249*9880d681SAndroid Build Coastguard Worker %2 = load float, float* %arrayidx4, align 4 250*9880d681SAndroid Build Coastguard Worker %add = fadd float %2, %mul 251*9880d681SAndroid Build Coastguard Worker store float %add, float* %arrayidx4, align 4 252*9880d681SAndroid Build Coastguard Worker %3 = add nsw i64 %indvars.iv, 1 253*9880d681SAndroid Build Coastguard Worker %arrayidx7 = getelementptr inbounds i32, i32* %ip, i64 %3 254*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* %arrayidx7, align 4 255*9880d681SAndroid Build Coastguard Worker %idxprom8 = sext i32 %4 to i64 256*9880d681SAndroid Build Coastguard Worker %arrayidx9 = getelementptr inbounds float, float* %b, i64 %idxprom8 257*9880d681SAndroid Build Coastguard Worker %5 = load float, float* %arrayidx9, align 4 258*9880d681SAndroid Build Coastguard Worker %mul10 = fmul float %5, %alpha 259*9880d681SAndroid Build Coastguard Worker %arrayidx13 = getelementptr inbounds float, float* %a, i64 %3 260*9880d681SAndroid Build Coastguard Worker %6 = load float, float* %arrayidx13, align 4 261*9880d681SAndroid Build Coastguard Worker %add14 = fadd float %6, %mul10 262*9880d681SAndroid Build Coastguard Worker store float %add14, float* %arrayidx13, align 4 263*9880d681SAndroid Build Coastguard Worker %7 = add nsw i64 %indvars.iv, 2 264*9880d681SAndroid Build Coastguard Worker %arrayidx17 = getelementptr inbounds i32, i32* %ip, i64 %7 265*9880d681SAndroid Build Coastguard Worker %8 = load i32, i32* %arrayidx17, align 4 266*9880d681SAndroid Build Coastguard Worker %idxprom18 = sext i32 %8 to i64 267*9880d681SAndroid Build Coastguard Worker %arrayidx19 = getelementptr inbounds float, float* %b, i64 %idxprom18 268*9880d681SAndroid Build Coastguard Worker %9 = load float, float* %arrayidx19, align 4 269*9880d681SAndroid Build Coastguard Worker %mul20 = fmul float %9, %alpha 270*9880d681SAndroid Build Coastguard Worker %arrayidx23 = getelementptr inbounds float, float* %a, i64 %7 271*9880d681SAndroid Build Coastguard Worker %10 = load float, float* %arrayidx23, align 4 272*9880d681SAndroid Build Coastguard Worker %add24 = fadd float %10, %mul20 273*9880d681SAndroid Build Coastguard Worker store float %add24, float* %arrayidx23, align 4 274*9880d681SAndroid Build Coastguard Worker %11 = add nsw i64 %indvars.iv, 3 275*9880d681SAndroid Build Coastguard Worker %arrayidx27 = getelementptr inbounds i32, i32* %ip, i64 %11 276*9880d681SAndroid Build Coastguard Worker %12 = load i32, i32* %arrayidx27, align 4 277*9880d681SAndroid Build Coastguard Worker %idxprom28 = sext i32 %12 to i64 278*9880d681SAndroid Build Coastguard Worker %arrayidx29 = getelementptr inbounds float, float* %b, i64 %idxprom28 279*9880d681SAndroid Build Coastguard Worker %13 = load float, float* %arrayidx29, align 4 280*9880d681SAndroid Build Coastguard Worker %mul30 = fmul float %13, %alpha 281*9880d681SAndroid Build Coastguard Worker %arrayidx33 = getelementptr inbounds float, float* %a, i64 %11 282*9880d681SAndroid Build Coastguard Worker %14 = load float, float* %arrayidx33, align 4 283*9880d681SAndroid Build Coastguard Worker %add34 = fadd float %14, %mul30 284*9880d681SAndroid Build Coastguard Worker store float %add34, float* %arrayidx33, align 4 285*9880d681SAndroid Build Coastguard Worker %15 = add nsw i64 %indvars.iv, 4 286*9880d681SAndroid Build Coastguard Worker %arrayidx37 = getelementptr inbounds i32, i32* %ip, i64 %15 287*9880d681SAndroid Build Coastguard Worker %16 = load i32, i32* %arrayidx37, align 4 288*9880d681SAndroid Build Coastguard Worker %idxprom38 = sext i32 %16 to i64 289*9880d681SAndroid Build Coastguard Worker %arrayidx39 = getelementptr inbounds float, float* %b, i64 %idxprom38 290*9880d681SAndroid Build Coastguard Worker %17 = load float, float* %arrayidx39, align 4 291*9880d681SAndroid Build Coastguard Worker %mul40 = fmul float %17, %alpha 292*9880d681SAndroid Build Coastguard Worker %arrayidx43 = getelementptr inbounds float, float* %a, i64 %15 293*9880d681SAndroid Build Coastguard Worker %18 = load float, float* %arrayidx43, align 4 294*9880d681SAndroid Build Coastguard Worker %add44 = fadd float %18, %mul40 295*9880d681SAndroid Build Coastguard Worker store float %add44, float* %arrayidx43, align 4 296*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 5 297*9880d681SAndroid Build Coastguard Worker %19 = trunc i64 %indvars.iv.next to i32 298*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i32 %19, 3200 299*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.body, label %for.end 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @hoo 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 304*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ] 305*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %ip, i64 %indvar 306*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = load i32, i32* %arrayidx, align 4 307*9880d681SAndroid Build Coastguard Worker; CHECK: %idxprom1 = sext i32 %0 to i64 308*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx2 = getelementptr inbounds float, float* %b, i64 %idxprom1 309*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = load float, float* %arrayidx2, align 4 310*9880d681SAndroid Build Coastguard Worker; CHECK: %mul = fmul float %1, %alpha 311*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx4 = getelementptr inbounds float, float* %a, i64 %indvar 312*9880d681SAndroid Build Coastguard Worker; CHECK: %2 = load float, float* %arrayidx4, align 4 313*9880d681SAndroid Build Coastguard Worker; CHECK: %add = fadd float %2, %mul 314*9880d681SAndroid Build Coastguard Worker; CHECK: store float %add, float* %arrayidx4, align 4 315*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i64 %indvar, 1 316*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvar, 3199 317*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.end, label %for.body 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker; CHECK: ret 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 322*9880d681SAndroid Build Coastguard Worker ret void 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker; void multi1(int *x) { 326*9880d681SAndroid Build Coastguard Worker; y = foo(0) 327*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 500; ++i) { 328*9880d681SAndroid Build Coastguard Worker; x[3*i] = y; 329*9880d681SAndroid Build Coastguard Worker; x[3*i+1] = y; 330*9880d681SAndroid Build Coastguard Worker; x[3*i+2] = y; 331*9880d681SAndroid Build Coastguard Worker; x[3*i+6] = y; 332*9880d681SAndroid Build Coastguard Worker; x[3*i+7] = y; 333*9880d681SAndroid Build Coastguard Worker; x[3*i+8] = y; 334*9880d681SAndroid Build Coastguard Worker; } 335*9880d681SAndroid Build Coastguard Worker; } 336*9880d681SAndroid Build Coastguard Worker 337*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 338*9880d681SAndroid Build Coastguard Workerdefine void @multi1(i32* nocapture %x) #0 { 339*9880d681SAndroid Build Coastguard Workerentry: 340*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @foo(i32 0) #1 341*9880d681SAndroid Build Coastguard Worker br label %for.body 342*9880d681SAndroid Build Coastguard Worker 343*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 344*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 345*9880d681SAndroid Build Coastguard Worker %0 = mul nsw i64 %indvars.iv, 3 346*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %x, i64 %0 347*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx, align 4 348*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %0, 1 349*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds i32, i32* %x, i64 %1 350*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx4, align 4 351*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %0, 2 352*9880d681SAndroid Build Coastguard Worker %arrayidx9 = getelementptr inbounds i32, i32* %x, i64 %2 353*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx9, align 4 354*9880d681SAndroid Build Coastguard Worker %3 = add nsw i64 %0, 6 355*9880d681SAndroid Build Coastguard Worker %arrayidx6 = getelementptr inbounds i32, i32* %x, i64 %3 356*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx6, align 4 357*9880d681SAndroid Build Coastguard Worker %4 = add nsw i64 %0, 7 358*9880d681SAndroid Build Coastguard Worker %arrayidx7 = getelementptr inbounds i32, i32* %x, i64 %4 359*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx7, align 4 360*9880d681SAndroid Build Coastguard Worker %5 = add nsw i64 %0, 8 361*9880d681SAndroid Build Coastguard Worker %arrayidx8 = getelementptr inbounds i32, i32* %x, i64 %5 362*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx8, align 4 363*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 364*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 500 365*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @multi1 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker; CHECK:for.body: 370*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 371*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = add i64 %indvars.iv, 6 372*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv 373*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx, align 4 374*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx6 = getelementptr inbounds i32, i32* %x, i64 %0 375*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx6, align 4 376*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 377*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond2 = icmp eq i64 %0, 1505 378*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond2, label %for.end, label %for.body 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 381*9880d681SAndroid Build Coastguard Worker ret void 382*9880d681SAndroid Build Coastguard Worker} 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker; void multi2(int *x) { 385*9880d681SAndroid Build Coastguard Worker; y = foo(0) 386*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 500; ++i) { 387*9880d681SAndroid Build Coastguard Worker; x[3*i] = y; 388*9880d681SAndroid Build Coastguard Worker; x[3*i+1] = y; 389*9880d681SAndroid Build Coastguard Worker; x[3*i+2] = y; 390*9880d681SAndroid Build Coastguard Worker; x[3*(i+1)] = y; 391*9880d681SAndroid Build Coastguard Worker; x[3*(i+1)+1] = y; 392*9880d681SAndroid Build Coastguard Worker; x[3*(i+1)+2] = y; 393*9880d681SAndroid Build Coastguard Worker; } 394*9880d681SAndroid Build Coastguard Worker; } 395*9880d681SAndroid Build Coastguard Worker 396*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 397*9880d681SAndroid Build Coastguard Workerdefine void @multi2(i32* nocapture %x) #0 { 398*9880d681SAndroid Build Coastguard Workerentry: 399*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @foo(i32 0) #1 400*9880d681SAndroid Build Coastguard Worker br label %for.body 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 403*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 404*9880d681SAndroid Build Coastguard Worker %0 = mul nsw i64 %indvars.iv, 3 405*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %indvars.iv, 1 406*9880d681SAndroid Build Coastguard Worker %newmul = mul nsw i64 %add, 3 407*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %x, i64 %0 408*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx, align 4 409*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %0, 1 410*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds i32, i32* %x, i64 %1 411*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx4, align 4 412*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %0, 2 413*9880d681SAndroid Build Coastguard Worker %arrayidx9 = getelementptr inbounds i32, i32* %x, i64 %2 414*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx9, align 4 415*9880d681SAndroid Build Coastguard Worker %arrayidx6 = getelementptr inbounds i32, i32* %x, i64 %newmul 416*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx6, align 4 417*9880d681SAndroid Build Coastguard Worker %3 = add nsw i64 %newmul, 1 418*9880d681SAndroid Build Coastguard Worker %arrayidx7 = getelementptr inbounds i32, i32* %x, i64 %3 419*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx7, align 4 420*9880d681SAndroid Build Coastguard Worker %4 = add nsw i64 %newmul, 2 421*9880d681SAndroid Build Coastguard Worker %arrayidx8 = getelementptr inbounds i32, i32* %x, i64 %4 422*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx8, align 4 423*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 424*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 500 425*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @multi2 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Worker; CHECK:for.body: 430*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 431*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = add i64 %indvars.iv, 3 432*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv 433*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx, align 4 434*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx6 = getelementptr inbounds i32, i32* %x, i64 %0 435*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx6, align 4 436*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 437*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond2 = icmp eq i64 %indvars.iv, 1499 438*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond2, label %for.end, label %for.body 439*9880d681SAndroid Build Coastguard Worker 440*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 441*9880d681SAndroid Build Coastguard Worker ret void 442*9880d681SAndroid Build Coastguard Worker} 443*9880d681SAndroid Build Coastguard Worker 444*9880d681SAndroid Build Coastguard Worker; void multi3(int *x) { 445*9880d681SAndroid Build Coastguard Worker; y = foo(0) 446*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 500; ++i) { 447*9880d681SAndroid Build Coastguard Worker; // Note: No zero index 448*9880d681SAndroid Build Coastguard Worker; x[3*i+3] = y; 449*9880d681SAndroid Build Coastguard Worker; x[3*i+4] = y; 450*9880d681SAndroid Build Coastguard Worker; x[3*i+5] = y; 451*9880d681SAndroid Build Coastguard Worker; } 452*9880d681SAndroid Build Coastguard Worker; } 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 455*9880d681SAndroid Build Coastguard Workerdefine void @multi3(i32* nocapture %x) #0 { 456*9880d681SAndroid Build Coastguard Workerentry: 457*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @foo(i32 0) #1 458*9880d681SAndroid Build Coastguard Worker br label %for.body 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 461*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 462*9880d681SAndroid Build Coastguard Worker %0 = mul nsw i64 %indvars.iv, 3 463*9880d681SAndroid Build Coastguard Worker %x0 = add nsw i64 %0, 3 464*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %indvars.iv, 1 465*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %x, i64 %x0 466*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx, align 4 467*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %0, 4 468*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds i32, i32* %x, i64 %1 469*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx4, align 4 470*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %0, 5 471*9880d681SAndroid Build Coastguard Worker %arrayidx9 = getelementptr inbounds i32, i32* %x, i64 %2 472*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx9, align 4 473*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 474*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 500 475*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 476*9880d681SAndroid Build Coastguard Worker 477*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @multi3 478*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 479*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 480*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = add i64 %indvars.iv, 3 481*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %x, i64 %0 482*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx, align 4 483*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 484*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond1 = icmp eq i64 %0, 1502 485*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond1, label %for.end, label %for.body 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 488*9880d681SAndroid Build Coastguard Worker ret void 489*9880d681SAndroid Build Coastguard Worker} 490*9880d681SAndroid Build Coastguard Worker 491*9880d681SAndroid Build Coastguard Worker; int foo(int a); 492*9880d681SAndroid Build Coastguard Worker; void bar2(int *x, int y, int z) { 493*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < 500; i += 3) { 494*9880d681SAndroid Build Coastguard Worker; foo(i+y+i*z); // Slightly reordered instruction order 495*9880d681SAndroid Build Coastguard Worker; foo(i+1+y+(i+1)*z); 496*9880d681SAndroid Build Coastguard Worker; foo(i+2+y+(i+2)*z); 497*9880d681SAndroid Build Coastguard Worker; } 498*9880d681SAndroid Build Coastguard Worker; } 499*9880d681SAndroid Build Coastguard Worker 500*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 501*9880d681SAndroid Build Coastguard Workerdefine void @bar2(i32* nocapture readnone %x, i32 %y, i32 %z) #0 { 502*9880d681SAndroid Build Coastguard Workerentry: 503*9880d681SAndroid Build Coastguard Worker br label %for.body 504*9880d681SAndroid Build Coastguard Worker 505*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 506*9880d681SAndroid Build Coastguard Worker %i.08 = phi i32 [ 0, %entry ], [ %add3, %for.body ] 507*9880d681SAndroid Build Coastguard Worker 508*9880d681SAndroid Build Coastguard Worker %tmp1 = add i32 %i.08, %y 509*9880d681SAndroid Build Coastguard Worker %tmp2 = mul i32 %i.08, %z 510*9880d681SAndroid Build Coastguard Worker %tmp3 = add i32 %tmp2, %tmp1 511*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @foo(i32 %tmp3) #1 512*9880d681SAndroid Build Coastguard Worker 513*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %i.08, 1 514*9880d681SAndroid Build Coastguard Worker %tmp2a = mul i32 %add, %z 515*9880d681SAndroid Build Coastguard Worker %tmp1a = add i32 %add, %y 516*9880d681SAndroid Build Coastguard Worker %tmp3a = add i32 %tmp2a, %tmp1a 517*9880d681SAndroid Build Coastguard Worker %calla = tail call i32 @foo(i32 %tmp3a) #1 518*9880d681SAndroid Build Coastguard Worker 519*9880d681SAndroid Build Coastguard Worker %add2 = add nsw i32 %i.08, 2 520*9880d681SAndroid Build Coastguard Worker %tmp2b = mul i32 %add2, %z 521*9880d681SAndroid Build Coastguard Worker %tmp1b = add i32 %add2, %y 522*9880d681SAndroid Build Coastguard Worker %tmp3b = add i32 %tmp2b, %tmp1b 523*9880d681SAndroid Build Coastguard Worker %callb = tail call i32 @foo(i32 %tmp3b) #1 524*9880d681SAndroid Build Coastguard Worker 525*9880d681SAndroid Build Coastguard Worker %add3 = add nsw i32 %i.08, 3 526*9880d681SAndroid Build Coastguard Worker 527*9880d681SAndroid Build Coastguard Worker %exitcond = icmp sge i32 %add3, 500 528*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 529*9880d681SAndroid Build Coastguard Worker 530*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar2 531*9880d681SAndroid Build Coastguard Worker 532*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 533*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i32 [ %indvar.next, %for.body ], [ 0, %entry ] 534*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp1 = add i32 %indvar, %y 535*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp2 = mul i32 %indvar, %z 536*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp3 = add i32 %tmp2, %tmp1 537*9880d681SAndroid Build Coastguard Worker; CHECK: %call = tail call i32 @foo(i32 %tmp3) #1 538*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i32 %indvar, 1 539*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond1 = icmp eq i32 %indvar, 500 540*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond1, label %for.end, label %for.body 541*9880d681SAndroid Build Coastguard Worker 542*9880d681SAndroid Build Coastguard Worker; CHECK: ret 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 545*9880d681SAndroid Build Coastguard Worker ret void 546*9880d681SAndroid Build Coastguard Worker} 547*9880d681SAndroid Build Coastguard Worker 548*9880d681SAndroid Build Coastguard Worker%struct.s = type { i32, i32 } 549*9880d681SAndroid Build Coastguard Worker 550*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable 551*9880d681SAndroid Build Coastguard Workerdefine void @gep1(%struct.s* nocapture %x) #0 { 552*9880d681SAndroid Build Coastguard Workerentry: 553*9880d681SAndroid Build Coastguard Worker %call = tail call i32 @foo(i32 0) #1 554*9880d681SAndroid Build Coastguard Worker br label %for.body 555*9880d681SAndroid Build Coastguard Worker 556*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 557*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 558*9880d681SAndroid Build Coastguard Worker %0 = mul nsw i64 %indvars.iv, 3 559*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds %struct.s, %struct.s* %x, i64 %0, i32 0 560*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx, align 4 561*9880d681SAndroid Build Coastguard Worker %1 = add nsw i64 %0, 1 562*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds %struct.s, %struct.s* %x, i64 %1, i32 0 563*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx4, align 4 564*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %0, 2 565*9880d681SAndroid Build Coastguard Worker %arrayidx9 = getelementptr inbounds %struct.s, %struct.s* %x, i64 %2, i32 0 566*9880d681SAndroid Build Coastguard Worker store i32 %call, i32* %arrayidx9, align 4 567*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 568*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 500 569*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @gep1 572*9880d681SAndroid Build Coastguard Worker; This test is a crash test only. 573*9880d681SAndroid Build Coastguard Worker; CHECK: ret 574*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 575*9880d681SAndroid Build Coastguard Worker ret void 576*9880d681SAndroid Build Coastguard Worker} 577*9880d681SAndroid Build Coastguard Worker 578*9880d681SAndroid Build Coastguard Worker 579*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind uwtable } 580*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind } 581*9880d681SAndroid Build Coastguard Worker 582