1*9880d681SAndroid Build Coastguard Worker; RUN: llc -asm-verbose=false -disable-branch-fold -disable-block-placement -disable-tail-duplicate -march=x86-64 -mcpu=nehalem -no-integrated-as < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; rdar://7236213 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; The scheduler's 2-address hack has been disabled, so there is 5*9880d681SAndroid Build Coastguard Worker; currently no good guarantee that this test will pass until the 6*9880d681SAndroid Build Coastguard Worker; machine scheduler develops an equivalent heuristic. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker; CodeGen shouldn't require any lea instructions inside the marked loop. 9*9880d681SAndroid Build Coastguard Worker; It should properly set up post-increment uses and do coalescing for 10*9880d681SAndroid Build Coastguard Worker; the induction variables. 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; CHECK: # Start 13*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: lea 14*9880d681SAndroid Build Coastguard Worker; CHECK: # Stop 15*9880d681SAndroid Build Coastguard Worker 16*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" 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine void @foo(float* %I, i64 %IS, float* nocapture %Start, float* nocapture %Step, float* %O, i64 %OS, i64 %N) nounwind { 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker %times4 = alloca float, align 4 ; <float*> [#uses=3] 21*9880d681SAndroid Build Coastguard Worker %timesN = alloca float, align 4 ; <float*> [#uses=2] 22*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %Step, align 4 ; <float> [#uses=8] 23*9880d681SAndroid Build Coastguard Worker %1 = ptrtoint float* %I to i64 ; <i64> [#uses=1] 24*9880d681SAndroid Build Coastguard Worker %2 = ptrtoint float* %O to i64 ; <i64> [#uses=1] 25*9880d681SAndroid Build Coastguard Worker %tmp = xor i64 %2, %1 ; <i64> [#uses=1] 26*9880d681SAndroid Build Coastguard Worker %tmp16 = and i64 %tmp, 15 ; <i64> [#uses=1] 27*9880d681SAndroid Build Coastguard Worker %3 = icmp eq i64 %tmp16, 0 ; <i1> [#uses=1] 28*9880d681SAndroid Build Coastguard Worker %4 = trunc i64 %IS to i32 ; <i32> [#uses=1] 29*9880d681SAndroid Build Coastguard Worker %5 = xor i32 %4, 1 ; <i32> [#uses=1] 30*9880d681SAndroid Build Coastguard Worker %6 = trunc i64 %OS to i32 ; <i32> [#uses=1] 31*9880d681SAndroid Build Coastguard Worker %7 = xor i32 %6, 1 ; <i32> [#uses=1] 32*9880d681SAndroid Build Coastguard Worker %8 = or i32 %7, %5 ; <i32> [#uses=1] 33*9880d681SAndroid Build Coastguard Worker %9 = icmp eq i32 %8, 0 ; <i1> [#uses=1] 34*9880d681SAndroid Build Coastguard Worker br i1 %9, label %bb, label %return 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerbb: ; preds = %entry 37*9880d681SAndroid Build Coastguard Worker %10 = load float, float* %Start, align 4 ; <float> [#uses=1] 38*9880d681SAndroid Build Coastguard Worker br label %bb2 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb3 41*9880d681SAndroid Build Coastguard Worker %11 = load float, float* %I_addr.0, align 4 ; <float> [#uses=1] 42*9880d681SAndroid Build Coastguard Worker %12 = fmul float %11, %x.0 ; <float> [#uses=1] 43*9880d681SAndroid Build Coastguard Worker store float %12, float* %O_addr.0, align 4 44*9880d681SAndroid Build Coastguard Worker %13 = fadd float %x.0, %0 ; <float> [#uses=1] 45*9880d681SAndroid Build Coastguard Worker %indvar.next53 = add i64 %14, 1 ; <i64> [#uses=1] 46*9880d681SAndroid Build Coastguard Worker br label %bb2 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerbb2: ; preds = %bb1, %bb 49*9880d681SAndroid Build Coastguard Worker %14 = phi i64 [ %indvar.next53, %bb1 ], [ 0, %bb ] ; <i64> [#uses=21] 50*9880d681SAndroid Build Coastguard Worker %x.0 = phi float [ %13, %bb1 ], [ %10, %bb ] ; <float> [#uses=6] 51*9880d681SAndroid Build Coastguard Worker %N_addr.0 = sub i64 %N, %14 ; <i64> [#uses=4] 52*9880d681SAndroid Build Coastguard Worker %O_addr.0 = getelementptr float, float* %O, i64 %14 ; <float*> [#uses=4] 53*9880d681SAndroid Build Coastguard Worker %I_addr.0 = getelementptr float, float* %I, i64 %14 ; <float*> [#uses=3] 54*9880d681SAndroid Build Coastguard Worker %15 = icmp slt i64 %N_addr.0, 1 ; <i1> [#uses=1] 55*9880d681SAndroid Build Coastguard Worker br i1 %15, label %bb4, label %bb3 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb2 58*9880d681SAndroid Build Coastguard Worker %16 = ptrtoint float* %O_addr.0 to i64 ; <i64> [#uses=1] 59*9880d681SAndroid Build Coastguard Worker %17 = and i64 %16, 15 ; <i64> [#uses=1] 60*9880d681SAndroid Build Coastguard Worker %18 = icmp eq i64 %17, 0 ; <i1> [#uses=1] 61*9880d681SAndroid Build Coastguard Worker br i1 %18, label %bb4, label %bb1 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerbb4: ; preds = %bb3, %bb2 64*9880d681SAndroid Build Coastguard Worker %19 = fmul float %0, 4.000000e+00 ; <float> [#uses=1] 65*9880d681SAndroid Build Coastguard Worker store float %19, float* %times4, align 4 66*9880d681SAndroid Build Coastguard Worker %20 = fmul float %0, 1.600000e+01 ; <float> [#uses=1] 67*9880d681SAndroid Build Coastguard Worker store float %20, float* %timesN, align 4 68*9880d681SAndroid Build Coastguard Worker %21 = fmul float %0, 0.000000e+00 ; <float> [#uses=1] 69*9880d681SAndroid Build Coastguard Worker %22 = fadd float %21, %x.0 ; <float> [#uses=1] 70*9880d681SAndroid Build Coastguard Worker %23 = fadd float %x.0, %0 ; <float> [#uses=1] 71*9880d681SAndroid Build Coastguard Worker %24 = fmul float %0, 2.000000e+00 ; <float> [#uses=1] 72*9880d681SAndroid Build Coastguard Worker %25 = fadd float %24, %x.0 ; <float> [#uses=1] 73*9880d681SAndroid Build Coastguard Worker %26 = fmul float %0, 3.000000e+00 ; <float> [#uses=1] 74*9880d681SAndroid Build Coastguard Worker %27 = fadd float %26, %x.0 ; <float> [#uses=1] 75*9880d681SAndroid Build Coastguard Worker %28 = insertelement <4 x float> undef, float %22, i32 0 ; <<4 x float>> [#uses=1] 76*9880d681SAndroid Build Coastguard Worker %29 = insertelement <4 x float> %28, float %23, i32 1 ; <<4 x float>> [#uses=1] 77*9880d681SAndroid Build Coastguard Worker %30 = insertelement <4 x float> %29, float %25, i32 2 ; <<4 x float>> [#uses=1] 78*9880d681SAndroid Build Coastguard Worker %31 = insertelement <4 x float> %30, float %27, i32 3 ; <<4 x float>> [#uses=5] 79*9880d681SAndroid Build Coastguard Worker %asmtmp.i = call <4 x float> asm "movss $1, $0\09\0Apshufd $$0, $0, $0", "=x,*m,~{dirflag},~{fpsr},~{flags}"(float* %times4) nounwind ; <<4 x float>> [#uses=3] 80*9880d681SAndroid Build Coastguard Worker %32 = fadd <4 x float> %31, %asmtmp.i ; <<4 x float>> [#uses=3] 81*9880d681SAndroid Build Coastguard Worker %33 = fadd <4 x float> %32, %asmtmp.i ; <<4 x float>> [#uses=3] 82*9880d681SAndroid Build Coastguard Worker %34 = fadd <4 x float> %33, %asmtmp.i ; <<4 x float>> [#uses=2] 83*9880d681SAndroid Build Coastguard Worker %asmtmp.i18 = call <4 x float> asm "movss $1, $0\09\0Apshufd $$0, $0, $0", "=x,*m,~{dirflag},~{fpsr},~{flags}"(float* %timesN) nounwind ; <<4 x float>> [#uses=8] 84*9880d681SAndroid Build Coastguard Worker %35 = icmp sgt i64 %N_addr.0, 15 ; <i1> [#uses=2] 85*9880d681SAndroid Build Coastguard Worker br i1 %3, label %bb6.preheader, label %bb8 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerbb6.preheader: ; preds = %bb4 88*9880d681SAndroid Build Coastguard Worker br i1 %35, label %bb.nph43, label %bb7 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerbb.nph43: ; preds = %bb6.preheader 91*9880d681SAndroid Build Coastguard Worker %tmp108 = add i64 %14, 16 ; <i64> [#uses=1] 92*9880d681SAndroid Build Coastguard Worker %tmp111 = add i64 %14, 4 ; <i64> [#uses=1] 93*9880d681SAndroid Build Coastguard Worker %tmp115 = add i64 %14, 8 ; <i64> [#uses=1] 94*9880d681SAndroid Build Coastguard Worker %tmp119 = add i64 %14, 12 ; <i64> [#uses=1] 95*9880d681SAndroid Build Coastguard Worker %tmp134 = add i64 %N, -16 ; <i64> [#uses=1] 96*9880d681SAndroid Build Coastguard Worker %tmp135 = sub i64 %tmp134, %14 ; <i64> [#uses=1] 97*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "# Start.", "~{dirflag},~{fpsr},~{flags}"() nounwind 98*9880d681SAndroid Build Coastguard Worker br label %bb5 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerbb5: ; preds = %bb.nph43, %bb5 101*9880d681SAndroid Build Coastguard Worker %indvar102 = phi i64 [ 0, %bb.nph43 ], [ %indvar.next103, %bb5 ] ; <i64> [#uses=3] 102*9880d681SAndroid Build Coastguard Worker %vX3.041 = phi <4 x float> [ %34, %bb.nph43 ], [ %45, %bb5 ] ; <<4 x float>> [#uses=2] 103*9880d681SAndroid Build Coastguard Worker %vX0.039 = phi <4 x float> [ %31, %bb.nph43 ], [ %41, %bb5 ] ; <<4 x float>> [#uses=2] 104*9880d681SAndroid Build Coastguard Worker %vX2.037 = phi <4 x float> [ %33, %bb.nph43 ], [ %46, %bb5 ] ; <<4 x float>> [#uses=2] 105*9880d681SAndroid Build Coastguard Worker %vX1.036 = phi <4 x float> [ %32, %bb.nph43 ], [ %47, %bb5 ] ; <<4 x float>> [#uses=2] 106*9880d681SAndroid Build Coastguard Worker %tmp104 = shl i64 %indvar102, 4 ; <i64> [#uses=5] 107*9880d681SAndroid Build Coastguard Worker %tmp105 = add i64 %14, %tmp104 ; <i64> [#uses=2] 108*9880d681SAndroid Build Coastguard Worker %scevgep106 = getelementptr float, float* %I, i64 %tmp105 ; <float*> [#uses=1] 109*9880d681SAndroid Build Coastguard Worker %scevgep106107 = bitcast float* %scevgep106 to <4 x float>* ; <<4 x float>*> [#uses=1] 110*9880d681SAndroid Build Coastguard Worker %tmp109 = add i64 %tmp108, %tmp104 ; <i64> [#uses=2] 111*9880d681SAndroid Build Coastguard Worker %tmp112 = add i64 %tmp111, %tmp104 ; <i64> [#uses=2] 112*9880d681SAndroid Build Coastguard Worker %scevgep113 = getelementptr float, float* %I, i64 %tmp112 ; <float*> [#uses=1] 113*9880d681SAndroid Build Coastguard Worker %scevgep113114 = bitcast float* %scevgep113 to <4 x float>* ; <<4 x float>*> [#uses=1] 114*9880d681SAndroid Build Coastguard Worker %tmp116 = add i64 %tmp115, %tmp104 ; <i64> [#uses=2] 115*9880d681SAndroid Build Coastguard Worker %scevgep117 = getelementptr float, float* %I, i64 %tmp116 ; <float*> [#uses=1] 116*9880d681SAndroid Build Coastguard Worker %scevgep117118 = bitcast float* %scevgep117 to <4 x float>* ; <<4 x float>*> [#uses=1] 117*9880d681SAndroid Build Coastguard Worker %tmp120 = add i64 %tmp119, %tmp104 ; <i64> [#uses=2] 118*9880d681SAndroid Build Coastguard Worker %scevgep121 = getelementptr float, float* %I, i64 %tmp120 ; <float*> [#uses=1] 119*9880d681SAndroid Build Coastguard Worker %scevgep121122 = bitcast float* %scevgep121 to <4 x float>* ; <<4 x float>*> [#uses=1] 120*9880d681SAndroid Build Coastguard Worker %scevgep123 = getelementptr float, float* %O, i64 %tmp105 ; <float*> [#uses=1] 121*9880d681SAndroid Build Coastguard Worker %scevgep123124 = bitcast float* %scevgep123 to <4 x float>* ; <<4 x float>*> [#uses=1] 122*9880d681SAndroid Build Coastguard Worker %scevgep126 = getelementptr float, float* %O, i64 %tmp112 ; <float*> [#uses=1] 123*9880d681SAndroid Build Coastguard Worker %scevgep126127 = bitcast float* %scevgep126 to <4 x float>* ; <<4 x float>*> [#uses=1] 124*9880d681SAndroid Build Coastguard Worker %scevgep128 = getelementptr float, float* %O, i64 %tmp116 ; <float*> [#uses=1] 125*9880d681SAndroid Build Coastguard Worker %scevgep128129 = bitcast float* %scevgep128 to <4 x float>* ; <<4 x float>*> [#uses=1] 126*9880d681SAndroid Build Coastguard Worker %scevgep130 = getelementptr float, float* %O, i64 %tmp120 ; <float*> [#uses=1] 127*9880d681SAndroid Build Coastguard Worker %scevgep130131 = bitcast float* %scevgep130 to <4 x float>* ; <<4 x float>*> [#uses=1] 128*9880d681SAndroid Build Coastguard Worker %tmp132 = mul i64 %indvar102, -16 ; <i64> [#uses=1] 129*9880d681SAndroid Build Coastguard Worker %tmp136 = add i64 %tmp135, %tmp132 ; <i64> [#uses=2] 130*9880d681SAndroid Build Coastguard Worker %36 = load <4 x float>, <4 x float>* %scevgep106107, align 16 ; <<4 x float>> [#uses=1] 131*9880d681SAndroid Build Coastguard Worker %37 = load <4 x float>, <4 x float>* %scevgep113114, align 16 ; <<4 x float>> [#uses=1] 132*9880d681SAndroid Build Coastguard Worker %38 = load <4 x float>, <4 x float>* %scevgep117118, align 16 ; <<4 x float>> [#uses=1] 133*9880d681SAndroid Build Coastguard Worker %39 = load <4 x float>, <4 x float>* %scevgep121122, align 16 ; <<4 x float>> [#uses=1] 134*9880d681SAndroid Build Coastguard Worker %40 = fmul <4 x float> %36, %vX0.039 ; <<4 x float>> [#uses=1] 135*9880d681SAndroid Build Coastguard Worker %41 = fadd <4 x float> %vX0.039, %asmtmp.i18 ; <<4 x float>> [#uses=2] 136*9880d681SAndroid Build Coastguard Worker %42 = fmul <4 x float> %37, %vX1.036 ; <<4 x float>> [#uses=1] 137*9880d681SAndroid Build Coastguard Worker %43 = fmul <4 x float> %38, %vX2.037 ; <<4 x float>> [#uses=1] 138*9880d681SAndroid Build Coastguard Worker %44 = fmul <4 x float> %39, %vX3.041 ; <<4 x float>> [#uses=1] 139*9880d681SAndroid Build Coastguard Worker store <4 x float> %40, <4 x float>* %scevgep123124, align 16 140*9880d681SAndroid Build Coastguard Worker store <4 x float> %42, <4 x float>* %scevgep126127, align 16 141*9880d681SAndroid Build Coastguard Worker store <4 x float> %43, <4 x float>* %scevgep128129, align 16 142*9880d681SAndroid Build Coastguard Worker store <4 x float> %44, <4 x float>* %scevgep130131, align 16 143*9880d681SAndroid Build Coastguard Worker %45 = fadd <4 x float> %vX3.041, %asmtmp.i18 ; <<4 x float>> [#uses=1] 144*9880d681SAndroid Build Coastguard Worker %46 = fadd <4 x float> %vX2.037, %asmtmp.i18 ; <<4 x float>> [#uses=1] 145*9880d681SAndroid Build Coastguard Worker %47 = fadd <4 x float> %vX1.036, %asmtmp.i18 ; <<4 x float>> [#uses=1] 146*9880d681SAndroid Build Coastguard Worker %48 = icmp sgt i64 %tmp136, 15 ; <i1> [#uses=1] 147*9880d681SAndroid Build Coastguard Worker %indvar.next103 = add i64 %indvar102, 1 ; <i64> [#uses=1] 148*9880d681SAndroid Build Coastguard Worker br i1 %48, label %bb5, label %bb6.bb7_crit_edge 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerbb6.bb7_crit_edge: ; preds = %bb5 151*9880d681SAndroid Build Coastguard Worker call void asm sideeffect "# Stop.", "~{dirflag},~{fpsr},~{flags}"() nounwind 152*9880d681SAndroid Build Coastguard Worker %scevgep110 = getelementptr float, float* %I, i64 %tmp109 ; <float*> [#uses=1] 153*9880d681SAndroid Build Coastguard Worker %scevgep125 = getelementptr float, float* %O, i64 %tmp109 ; <float*> [#uses=1] 154*9880d681SAndroid Build Coastguard Worker br label %bb7 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Workerbb7: ; preds = %bb6.bb7_crit_edge, %bb6.preheader 157*9880d681SAndroid Build Coastguard Worker %I_addr.1.lcssa = phi float* [ %scevgep110, %bb6.bb7_crit_edge ], [ %I_addr.0, %bb6.preheader ] ; <float*> [#uses=1] 158*9880d681SAndroid Build Coastguard Worker %O_addr.1.lcssa = phi float* [ %scevgep125, %bb6.bb7_crit_edge ], [ %O_addr.0, %bb6.preheader ] ; <float*> [#uses=1] 159*9880d681SAndroid Build Coastguard Worker %vX0.0.lcssa = phi <4 x float> [ %41, %bb6.bb7_crit_edge ], [ %31, %bb6.preheader ] ; <<4 x float>> [#uses=1] 160*9880d681SAndroid Build Coastguard Worker %N_addr.1.lcssa = phi i64 [ %tmp136, %bb6.bb7_crit_edge ], [ %N_addr.0, %bb6.preheader ] ; <i64> [#uses=1] 161*9880d681SAndroid Build Coastguard Worker %asmtmp.i17 = call <4 x float> asm "movss $1, $0\09\0Apshufd $$0, $0, $0", "=x,*m,~{dirflag},~{fpsr},~{flags}"(float* %times4) nounwind ; <<4 x float>> [#uses=0] 162*9880d681SAndroid Build Coastguard Worker br label %bb11 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerbb8: ; preds = %bb4 165*9880d681SAndroid Build Coastguard Worker br i1 %35, label %bb.nph, label %bb11 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerbb.nph: ; preds = %bb8 168*9880d681SAndroid Build Coastguard Worker %I_addr.0.sum = add i64 %14, -1 ; <i64> [#uses=1] 169*9880d681SAndroid Build Coastguard Worker %49 = getelementptr inbounds float, float* %I, i64 %I_addr.0.sum ; <float*> [#uses=1] 170*9880d681SAndroid Build Coastguard Worker %50 = bitcast float* %49 to <4 x float>* ; <<4 x float>*> [#uses=1] 171*9880d681SAndroid Build Coastguard Worker %51 = load <4 x float>, <4 x float>* %50, align 16 ; <<4 x float>> [#uses=1] 172*9880d681SAndroid Build Coastguard Worker %tmp54 = add i64 %14, 16 ; <i64> [#uses=1] 173*9880d681SAndroid Build Coastguard Worker %tmp56 = add i64 %14, 3 ; <i64> [#uses=1] 174*9880d681SAndroid Build Coastguard Worker %tmp60 = add i64 %14, 7 ; <i64> [#uses=1] 175*9880d681SAndroid Build Coastguard Worker %tmp64 = add i64 %14, 11 ; <i64> [#uses=1] 176*9880d681SAndroid Build Coastguard Worker %tmp68 = add i64 %14, 15 ; <i64> [#uses=1] 177*9880d681SAndroid Build Coastguard Worker %tmp76 = add i64 %14, 4 ; <i64> [#uses=1] 178*9880d681SAndroid Build Coastguard Worker %tmp80 = add i64 %14, 8 ; <i64> [#uses=1] 179*9880d681SAndroid Build Coastguard Worker %tmp84 = add i64 %14, 12 ; <i64> [#uses=1] 180*9880d681SAndroid Build Coastguard Worker %tmp90 = add i64 %N, -16 ; <i64> [#uses=1] 181*9880d681SAndroid Build Coastguard Worker %tmp91 = sub i64 %tmp90, %14 ; <i64> [#uses=1] 182*9880d681SAndroid Build Coastguard Worker br label %bb9 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Workerbb9: ; preds = %bb.nph, %bb9 185*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ 0, %bb.nph ], [ %indvar.next, %bb9 ] ; <i64> [#uses=3] 186*9880d681SAndroid Build Coastguard Worker %vX3.125 = phi <4 x float> [ %34, %bb.nph ], [ %69, %bb9 ] ; <<4 x float>> [#uses=2] 187*9880d681SAndroid Build Coastguard Worker %vX0.223 = phi <4 x float> [ %31, %bb.nph ], [ %65, %bb9 ] ; <<4 x float>> [#uses=2] 188*9880d681SAndroid Build Coastguard Worker %vX2.121 = phi <4 x float> [ %33, %bb.nph ], [ %70, %bb9 ] ; <<4 x float>> [#uses=2] 189*9880d681SAndroid Build Coastguard Worker %vX1.120 = phi <4 x float> [ %32, %bb.nph ], [ %71, %bb9 ] ; <<4 x float>> [#uses=2] 190*9880d681SAndroid Build Coastguard Worker %vI0.019 = phi <4 x float> [ %51, %bb.nph ], [ %55, %bb9 ] ; <<4 x float>> [#uses=1] 191*9880d681SAndroid Build Coastguard Worker %tmp51 = shl i64 %indvar, 4 ; <i64> [#uses=9] 192*9880d681SAndroid Build Coastguard Worker %tmp55 = add i64 %tmp54, %tmp51 ; <i64> [#uses=2] 193*9880d681SAndroid Build Coastguard Worker %tmp57 = add i64 %tmp56, %tmp51 ; <i64> [#uses=1] 194*9880d681SAndroid Build Coastguard Worker %scevgep58 = getelementptr float, float* %I, i64 %tmp57 ; <float*> [#uses=1] 195*9880d681SAndroid Build Coastguard Worker %scevgep5859 = bitcast float* %scevgep58 to <4 x float>* ; <<4 x float>*> [#uses=1] 196*9880d681SAndroid Build Coastguard Worker %tmp61 = add i64 %tmp60, %tmp51 ; <i64> [#uses=1] 197*9880d681SAndroid Build Coastguard Worker %scevgep62 = getelementptr float, float* %I, i64 %tmp61 ; <float*> [#uses=1] 198*9880d681SAndroid Build Coastguard Worker %scevgep6263 = bitcast float* %scevgep62 to <4 x float>* ; <<4 x float>*> [#uses=1] 199*9880d681SAndroid Build Coastguard Worker %tmp65 = add i64 %tmp64, %tmp51 ; <i64> [#uses=1] 200*9880d681SAndroid Build Coastguard Worker %scevgep66 = getelementptr float, float* %I, i64 %tmp65 ; <float*> [#uses=1] 201*9880d681SAndroid Build Coastguard Worker %scevgep6667 = bitcast float* %scevgep66 to <4 x float>* ; <<4 x float>*> [#uses=1] 202*9880d681SAndroid Build Coastguard Worker %tmp69 = add i64 %tmp68, %tmp51 ; <i64> [#uses=1] 203*9880d681SAndroid Build Coastguard Worker %scevgep70 = getelementptr float, float* %I, i64 %tmp69 ; <float*> [#uses=1] 204*9880d681SAndroid Build Coastguard Worker %scevgep7071 = bitcast float* %scevgep70 to <4 x float>* ; <<4 x float>*> [#uses=1] 205*9880d681SAndroid Build Coastguard Worker %tmp72 = add i64 %14, %tmp51 ; <i64> [#uses=1] 206*9880d681SAndroid Build Coastguard Worker %scevgep73 = getelementptr float, float* %O, i64 %tmp72 ; <float*> [#uses=1] 207*9880d681SAndroid Build Coastguard Worker %scevgep7374 = bitcast float* %scevgep73 to <4 x float>* ; <<4 x float>*> [#uses=1] 208*9880d681SAndroid Build Coastguard Worker %tmp77 = add i64 %tmp76, %tmp51 ; <i64> [#uses=1] 209*9880d681SAndroid Build Coastguard Worker %scevgep78 = getelementptr float, float* %O, i64 %tmp77 ; <float*> [#uses=1] 210*9880d681SAndroid Build Coastguard Worker %scevgep7879 = bitcast float* %scevgep78 to <4 x float>* ; <<4 x float>*> [#uses=1] 211*9880d681SAndroid Build Coastguard Worker %tmp81 = add i64 %tmp80, %tmp51 ; <i64> [#uses=1] 212*9880d681SAndroid Build Coastguard Worker %scevgep82 = getelementptr float, float* %O, i64 %tmp81 ; <float*> [#uses=1] 213*9880d681SAndroid Build Coastguard Worker %scevgep8283 = bitcast float* %scevgep82 to <4 x float>* ; <<4 x float>*> [#uses=1] 214*9880d681SAndroid Build Coastguard Worker %tmp85 = add i64 %tmp84, %tmp51 ; <i64> [#uses=1] 215*9880d681SAndroid Build Coastguard Worker %scevgep86 = getelementptr float, float* %O, i64 %tmp85 ; <float*> [#uses=1] 216*9880d681SAndroid Build Coastguard Worker %scevgep8687 = bitcast float* %scevgep86 to <4 x float>* ; <<4 x float>*> [#uses=1] 217*9880d681SAndroid Build Coastguard Worker %tmp88 = mul i64 %indvar, -16 ; <i64> [#uses=1] 218*9880d681SAndroid Build Coastguard Worker %tmp92 = add i64 %tmp91, %tmp88 ; <i64> [#uses=2] 219*9880d681SAndroid Build Coastguard Worker %52 = load <4 x float>, <4 x float>* %scevgep5859, align 16 ; <<4 x float>> [#uses=2] 220*9880d681SAndroid Build Coastguard Worker %53 = load <4 x float>, <4 x float>* %scevgep6263, align 16 ; <<4 x float>> [#uses=2] 221*9880d681SAndroid Build Coastguard Worker %54 = load <4 x float>, <4 x float>* %scevgep6667, align 16 ; <<4 x float>> [#uses=2] 222*9880d681SAndroid Build Coastguard Worker %55 = load <4 x float>, <4 x float>* %scevgep7071, align 16 ; <<4 x float>> [#uses=2] 223*9880d681SAndroid Build Coastguard Worker %56 = shufflevector <4 x float> %vI0.019, <4 x float> %52, <4 x i32> <i32 4, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1] 224*9880d681SAndroid Build Coastguard Worker %57 = shufflevector <4 x float> %56, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0> ; <<4 x float>> [#uses=1] 225*9880d681SAndroid Build Coastguard Worker %58 = shufflevector <4 x float> %52, <4 x float> %53, <4 x i32> <i32 4, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1] 226*9880d681SAndroid Build Coastguard Worker %59 = shufflevector <4 x float> %58, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0> ; <<4 x float>> [#uses=1] 227*9880d681SAndroid Build Coastguard Worker %60 = shufflevector <4 x float> %53, <4 x float> %54, <4 x i32> <i32 4, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1] 228*9880d681SAndroid Build Coastguard Worker %61 = shufflevector <4 x float> %60, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0> ; <<4 x float>> [#uses=1] 229*9880d681SAndroid Build Coastguard Worker %62 = shufflevector <4 x float> %54, <4 x float> %55, <4 x i32> <i32 4, i32 1, i32 2, i32 3> ; <<4 x float>> [#uses=1] 230*9880d681SAndroid Build Coastguard Worker %63 = shufflevector <4 x float> %62, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0> ; <<4 x float>> [#uses=1] 231*9880d681SAndroid Build Coastguard Worker %64 = fmul <4 x float> %57, %vX0.223 ; <<4 x float>> [#uses=1] 232*9880d681SAndroid Build Coastguard Worker %65 = fadd <4 x float> %vX0.223, %asmtmp.i18 ; <<4 x float>> [#uses=2] 233*9880d681SAndroid Build Coastguard Worker %66 = fmul <4 x float> %59, %vX1.120 ; <<4 x float>> [#uses=1] 234*9880d681SAndroid Build Coastguard Worker %67 = fmul <4 x float> %61, %vX2.121 ; <<4 x float>> [#uses=1] 235*9880d681SAndroid Build Coastguard Worker %68 = fmul <4 x float> %63, %vX3.125 ; <<4 x float>> [#uses=1] 236*9880d681SAndroid Build Coastguard Worker store <4 x float> %64, <4 x float>* %scevgep7374, align 16 237*9880d681SAndroid Build Coastguard Worker store <4 x float> %66, <4 x float>* %scevgep7879, align 16 238*9880d681SAndroid Build Coastguard Worker store <4 x float> %67, <4 x float>* %scevgep8283, align 16 239*9880d681SAndroid Build Coastguard Worker store <4 x float> %68, <4 x float>* %scevgep8687, align 16 240*9880d681SAndroid Build Coastguard Worker %69 = fadd <4 x float> %vX3.125, %asmtmp.i18 ; <<4 x float>> [#uses=1] 241*9880d681SAndroid Build Coastguard Worker %70 = fadd <4 x float> %vX2.121, %asmtmp.i18 ; <<4 x float>> [#uses=1] 242*9880d681SAndroid Build Coastguard Worker %71 = fadd <4 x float> %vX1.120, %asmtmp.i18 ; <<4 x float>> [#uses=1] 243*9880d681SAndroid Build Coastguard Worker %72 = icmp sgt i64 %tmp92, 15 ; <i1> [#uses=1] 244*9880d681SAndroid Build Coastguard Worker %indvar.next = add i64 %indvar, 1 ; <i64> [#uses=1] 245*9880d681SAndroid Build Coastguard Worker br i1 %72, label %bb9, label %bb10.bb11.loopexit_crit_edge 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Workerbb10.bb11.loopexit_crit_edge: ; preds = %bb9 248*9880d681SAndroid Build Coastguard Worker %scevgep = getelementptr float, float* %I, i64 %tmp55 ; <float*> [#uses=1] 249*9880d681SAndroid Build Coastguard Worker %scevgep75 = getelementptr float, float* %O, i64 %tmp55 ; <float*> [#uses=1] 250*9880d681SAndroid Build Coastguard Worker br label %bb11 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Workerbb11: ; preds = %bb8, %bb10.bb11.loopexit_crit_edge, %bb7 253*9880d681SAndroid Build Coastguard Worker %N_addr.2 = phi i64 [ %N_addr.1.lcssa, %bb7 ], [ %tmp92, %bb10.bb11.loopexit_crit_edge ], [ %N_addr.0, %bb8 ] ; <i64> [#uses=2] 254*9880d681SAndroid Build Coastguard Worker %vX0.1 = phi <4 x float> [ %vX0.0.lcssa, %bb7 ], [ %65, %bb10.bb11.loopexit_crit_edge ], [ %31, %bb8 ] ; <<4 x float>> [#uses=1] 255*9880d681SAndroid Build Coastguard Worker %O_addr.2 = phi float* [ %O_addr.1.lcssa, %bb7 ], [ %scevgep75, %bb10.bb11.loopexit_crit_edge ], [ %O_addr.0, %bb8 ] ; <float*> [#uses=1] 256*9880d681SAndroid Build Coastguard Worker %I_addr.2 = phi float* [ %I_addr.1.lcssa, %bb7 ], [ %scevgep, %bb10.bb11.loopexit_crit_edge ], [ %I_addr.0, %bb8 ] ; <float*> [#uses=1] 257*9880d681SAndroid Build Coastguard Worker %73 = extractelement <4 x float> %vX0.1, i32 0 ; <float> [#uses=2] 258*9880d681SAndroid Build Coastguard Worker %74 = icmp sgt i64 %N_addr.2, 0 ; <i1> [#uses=1] 259*9880d681SAndroid Build Coastguard Worker br i1 %74, label %bb12, label %bb14 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Workerbb12: ; preds = %bb11, %bb12 262*9880d681SAndroid Build Coastguard Worker %indvar94 = phi i64 [ %indvar.next95, %bb12 ], [ 0, %bb11 ] ; <i64> [#uses=3] 263*9880d681SAndroid Build Coastguard Worker %x.130 = phi float [ %77, %bb12 ], [ %73, %bb11 ] ; <float> [#uses=2] 264*9880d681SAndroid Build Coastguard Worker %I_addr.433 = getelementptr float, float* %I_addr.2, i64 %indvar94 ; <float*> [#uses=1] 265*9880d681SAndroid Build Coastguard Worker %O_addr.432 = getelementptr float, float* %O_addr.2, i64 %indvar94 ; <float*> [#uses=1] 266*9880d681SAndroid Build Coastguard Worker %75 = load float, float* %I_addr.433, align 4 ; <float> [#uses=1] 267*9880d681SAndroid Build Coastguard Worker %76 = fmul float %75, %x.130 ; <float> [#uses=1] 268*9880d681SAndroid Build Coastguard Worker store float %76, float* %O_addr.432, align 4 269*9880d681SAndroid Build Coastguard Worker %77 = fadd float %x.130, %0 ; <float> [#uses=2] 270*9880d681SAndroid Build Coastguard Worker %indvar.next95 = add i64 %indvar94, 1 ; <i64> [#uses=2] 271*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvar.next95, %N_addr.2 ; <i1> [#uses=1] 272*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %bb14, label %bb12 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Workerbb14: ; preds = %bb12, %bb11 275*9880d681SAndroid Build Coastguard Worker %x.1.lcssa = phi float [ %73, %bb11 ], [ %77, %bb12 ] ; <float> [#uses=1] 276*9880d681SAndroid Build Coastguard Worker store float %x.1.lcssa, float* %Start, align 4 277*9880d681SAndroid Build Coastguard Worker ret void 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %entry 280*9880d681SAndroid Build Coastguard Worker ret void 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker; Codegen shouldn't crash on this testcase. 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerdefine void @bar(i32 %a, i32 %b) nounwind { 286*9880d681SAndroid Build Coastguard Workerentry: ; preds = %bb1, %entry, %for.end204 287*9880d681SAndroid Build Coastguard Worker br label %outer 288*9880d681SAndroid Build Coastguard Worker 289*9880d681SAndroid Build Coastguard Workerouter: ; preds = %bb1, %entry 290*9880d681SAndroid Build Coastguard Worker %i6 = phi i32 [ %storemerge171, %bb1 ], [ %a, %entry ] ; <i32> [#uses=2] 291*9880d681SAndroid Build Coastguard Worker %storemerge171 = add i32 %i6, 1 ; <i32> [#uses=1] 292*9880d681SAndroid Build Coastguard Worker br label %inner 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Workerinner: ; preds = %bb0, %if.end275 295*9880d681SAndroid Build Coastguard Worker %i8 = phi i32 [ %a, %outer ], [ %indvar.next159, %bb0 ] ; <i32> [#uses=2] 296*9880d681SAndroid Build Coastguard Worker %t338 = load i32, i32* undef ; <i32> [#uses=1] 297*9880d681SAndroid Build Coastguard Worker %t191 = mul i32 %i8, %t338 ; <i32> [#uses=1] 298*9880d681SAndroid Build Coastguard Worker %t179 = add i32 %i6, %t191 ; <i32> [#uses=1] 299*9880d681SAndroid Build Coastguard Worker br label %bb0 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Workerbb0: ; preds = %for.body332 302*9880d681SAndroid Build Coastguard Worker %indvar.next159 = add i32 %i8, 1 ; <i32> [#uses=1] 303*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb1, label %inner 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard Workerbb1: ; preds = %bb0, %outer 306*9880d681SAndroid Build Coastguard Worker %midx.4 = phi i32 [ %t179, %bb0 ] ; <i32> [#uses=0] 307*9880d681SAndroid Build Coastguard Worker br label %outer 308*9880d681SAndroid Build Coastguard Worker} 309