1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=cortex-a9 -verify-coalescing -verify-machineinstrs | FileCheck %s 2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" 3*9880d681SAndroid Build Coastguard Workertarget triple = "thumbv7-apple-ios0.0.0" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; CHECK: f 6*9880d681SAndroid Build Coastguard Worker; The vld2 and vst2 are not aligned wrt each other, the second Q loaded is the 7*9880d681SAndroid Build Coastguard Worker; first one stored. 8*9880d681SAndroid Build Coastguard Worker; The coalescer must find a super-register larger than QQ to eliminate the copy 9*9880d681SAndroid Build Coastguard Worker; setting up the vst2 data. 10*9880d681SAndroid Build Coastguard Worker; CHECK: vld2 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vorr 12*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vmov 13*9880d681SAndroid Build Coastguard Worker; CHECK: vst2 14*9880d681SAndroid Build Coastguard Workerdefine void @f(float* %p, i32 %c) nounwind ssp { 15*9880d681SAndroid Build Coastguard Workerentry: 16*9880d681SAndroid Build Coastguard Worker %0 = bitcast float* %p to i8* 17*9880d681SAndroid Build Coastguard Worker %vld2 = tail call { <4 x float>, <4 x float> } @llvm.arm.neon.vld2.v4f32.p0i8(i8* %0, i32 4) 18*9880d681SAndroid Build Coastguard Worker %vld221 = extractvalue { <4 x float>, <4 x float> } %vld2, 1 19*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds float, float* %p, i32 8 20*9880d681SAndroid Build Coastguard Worker %1 = bitcast float* %add.ptr to i8* 21*9880d681SAndroid Build Coastguard Worker tail call void @llvm.arm.neon.vst2.p0i8.v4f32(i8* %1, <4 x float> %vld221, <4 x float> undef, i32 4) 22*9880d681SAndroid Build Coastguard Worker ret void 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; CHECK: f1 26*9880d681SAndroid Build Coastguard Worker; FIXME: This function still has copies. 27*9880d681SAndroid Build Coastguard Workerdefine void @f1(float* %p, i32 %c) nounwind ssp { 28*9880d681SAndroid Build Coastguard Workerentry: 29*9880d681SAndroid Build Coastguard Worker %0 = bitcast float* %p to i8* 30*9880d681SAndroid Build Coastguard Worker %vld2 = tail call { <4 x float>, <4 x float> } @llvm.arm.neon.vld2.v4f32.p0i8(i8* %0, i32 4) 31*9880d681SAndroid Build Coastguard Worker %vld221 = extractvalue { <4 x float>, <4 x float> } %vld2, 1 32*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds float, float* %p, i32 8 33*9880d681SAndroid Build Coastguard Worker %1 = bitcast float* %add.ptr to i8* 34*9880d681SAndroid Build Coastguard Worker %vld22 = tail call { <4 x float>, <4 x float> } @llvm.arm.neon.vld2.v4f32.p0i8(i8* %1, i32 4) 35*9880d681SAndroid Build Coastguard Worker %vld2215 = extractvalue { <4 x float>, <4 x float> } %vld22, 0 36*9880d681SAndroid Build Coastguard Worker tail call void @llvm.arm.neon.vst2.p0i8.v4f32(i8* %1, <4 x float> %vld221, <4 x float> %vld2215, i32 4) 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; CHECK: f2 41*9880d681SAndroid Build Coastguard Worker; FIXME: This function still has copies. 42*9880d681SAndroid Build Coastguard Workerdefine void @f2(float* %p, i32 %c) nounwind ssp { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker %0 = bitcast float* %p to i8* 45*9880d681SAndroid Build Coastguard Worker %vld2 = tail call { <4 x float>, <4 x float> } @llvm.arm.neon.vld2.v4f32.p0i8(i8* %0, i32 4) 46*9880d681SAndroid Build Coastguard Worker %vld224 = extractvalue { <4 x float>, <4 x float> } %vld2, 1 47*9880d681SAndroid Build Coastguard Worker br label %do.body 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdo.body: ; preds = %do.body, %entry 50*9880d681SAndroid Build Coastguard Worker %qq0.0.1.0 = phi <4 x float> [ %vld224, %entry ], [ %vld2216, %do.body ] 51*9880d681SAndroid Build Coastguard Worker %c.addr.0 = phi i32 [ %c, %entry ], [ %dec, %do.body ] 52*9880d681SAndroid Build Coastguard Worker %p.addr.0 = phi float* [ %p, %entry ], [ %add.ptr, %do.body ] 53*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds float, float* %p.addr.0, i32 8 54*9880d681SAndroid Build Coastguard Worker %1 = bitcast float* %add.ptr to i8* 55*9880d681SAndroid Build Coastguard Worker %vld22 = tail call { <4 x float>, <4 x float> } @llvm.arm.neon.vld2.v4f32.p0i8(i8* %1, i32 4) 56*9880d681SAndroid Build Coastguard Worker %vld2215 = extractvalue { <4 x float>, <4 x float> } %vld22, 0 57*9880d681SAndroid Build Coastguard Worker %vld2216 = extractvalue { <4 x float>, <4 x float> } %vld22, 1 58*9880d681SAndroid Build Coastguard Worker tail call void @llvm.arm.neon.vst2.p0i8.v4f32(i8* %1, <4 x float> %qq0.0.1.0, <4 x float> %vld2215, i32 4) 59*9880d681SAndroid Build Coastguard Worker %dec = add nsw i32 %c.addr.0, -1 60*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq i32 %dec, 0 61*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %do.end, label %do.body 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerdo.end: ; preds = %do.body 64*9880d681SAndroid Build Coastguard Worker ret void 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdeclare { <4 x float>, <4 x float> } @llvm.arm.neon.vld2.v4f32.p0i8(i8*, i32) nounwind readonly 68*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst2.p0i8.v4f32(i8*, <4 x float>, <4 x float>, i32) nounwind 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; CHECK: f3 71*9880d681SAndroid Build Coastguard Worker; This function has lane insertions that span basic blocks. 72*9880d681SAndroid Build Coastguard Worker; The trivial REG_SEQUENCE lowering can't handle that, but the coalescer can. 73*9880d681SAndroid Build Coastguard Worker; 74*9880d681SAndroid Build Coastguard Worker; void f3(float *p, float *q) { 75*9880d681SAndroid Build Coastguard Worker; float32x2_t x; 76*9880d681SAndroid Build Coastguard Worker; x[1] = p[3]; 77*9880d681SAndroid Build Coastguard Worker; if (q) 78*9880d681SAndroid Build Coastguard Worker; x[0] = q[0] + q[1]; 79*9880d681SAndroid Build Coastguard Worker; else 80*9880d681SAndroid Build Coastguard Worker; x[0] = p[2]; 81*9880d681SAndroid Build Coastguard Worker; vst1_f32(p+4, x); 82*9880d681SAndroid Build Coastguard Worker; } 83*9880d681SAndroid Build Coastguard Worker; 84*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vmov 85*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vorr 86*9880d681SAndroid Build Coastguard Workerdefine void @f3(float* %p, float* %q) nounwind ssp { 87*9880d681SAndroid Build Coastguard Workerentry: 88*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds float, float* %p, i32 3 89*9880d681SAndroid Build Coastguard Worker %0 = load float, float* %arrayidx, align 4 90*9880d681SAndroid Build Coastguard Worker %vecins = insertelement <2 x float> undef, float %0, i32 1 91*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq float* %q, null 92*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.else, label %if.then 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 95*9880d681SAndroid Build Coastguard Worker %1 = load float, float* %q, align 4 96*9880d681SAndroid Build Coastguard Worker %arrayidx2 = getelementptr inbounds float, float* %q, i32 1 97*9880d681SAndroid Build Coastguard Worker %2 = load float, float* %arrayidx2, align 4 98*9880d681SAndroid Build Coastguard Worker %add = fadd float %1, %2 99*9880d681SAndroid Build Coastguard Worker %vecins3 = insertelement <2 x float> %vecins, float %add, i32 0 100*9880d681SAndroid Build Coastguard Worker br label %if.end 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerif.else: ; preds = %entry 103*9880d681SAndroid Build Coastguard Worker %arrayidx4 = getelementptr inbounds float, float* %p, i32 2 104*9880d681SAndroid Build Coastguard Worker %3 = load float, float* %arrayidx4, align 4 105*9880d681SAndroid Build Coastguard Worker %vecins5 = insertelement <2 x float> %vecins, float %3, i32 0 106*9880d681SAndroid Build Coastguard Worker br label %if.end 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %if.else, %if.then 109*9880d681SAndroid Build Coastguard Worker %x.0 = phi <2 x float> [ %vecins3, %if.then ], [ %vecins5, %if.else ] 110*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds float, float* %p, i32 4 111*9880d681SAndroid Build Coastguard Worker %4 = bitcast float* %add.ptr to i8* 112*9880d681SAndroid Build Coastguard Worker tail call void @llvm.arm.neon.vst1.p0i8.v2f32(i8* %4, <2 x float> %x.0, i32 4) 113*9880d681SAndroid Build Coastguard Worker ret void 114*9880d681SAndroid Build Coastguard Worker} 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst1.p0i8.v2f32(i8*, <2 x float>, i32) nounwind 117*9880d681SAndroid Build Coastguard Workerdeclare <2 x float> @llvm.arm.neon.vld1.v2f32.p0i8(i8*, i32) nounwind readonly 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker; CHECK: f4 120*9880d681SAndroid Build Coastguard Worker; This function inserts a lane into a fully defined vector. 121*9880d681SAndroid Build Coastguard Worker; The destination lane isn't read, so the subregs can coalesce. 122*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vmov 123*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vorr 124*9880d681SAndroid Build Coastguard Workerdefine void @f4(float* %p, float* %q) nounwind ssp { 125*9880d681SAndroid Build Coastguard Workerentry: 126*9880d681SAndroid Build Coastguard Worker %0 = bitcast float* %p to i8* 127*9880d681SAndroid Build Coastguard Worker %vld1 = tail call <2 x float> @llvm.arm.neon.vld1.v2f32.p0i8(i8* %0, i32 4) 128*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq float* %q, null 129*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 132*9880d681SAndroid Build Coastguard Worker %1 = load float, float* %q, align 4 133*9880d681SAndroid Build Coastguard Worker %arrayidx1 = getelementptr inbounds float, float* %q, i32 1 134*9880d681SAndroid Build Coastguard Worker %2 = load float, float* %arrayidx1, align 4 135*9880d681SAndroid Build Coastguard Worker %add = fadd float %1, %2 136*9880d681SAndroid Build Coastguard Worker %vecins = insertelement <2 x float> %vld1, float %add, i32 1 137*9880d681SAndroid Build Coastguard Worker br label %if.end 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 140*9880d681SAndroid Build Coastguard Worker %x.0 = phi <2 x float> [ %vecins, %if.then ], [ %vld1, %entry ] 141*9880d681SAndroid Build Coastguard Worker tail call void @llvm.arm.neon.vst1.p0i8.v2f32(i8* %0, <2 x float> %x.0, i32 4) 142*9880d681SAndroid Build Coastguard Worker ret void 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; CHECK: f5 146*9880d681SAndroid Build Coastguard Worker; Coalesce vector lanes through phis. 147*9880d681SAndroid Build Coastguard Worker; CHECK: vmov.f32 {{.*}}, #1.0 148*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vmov 149*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: vorr 150*9880d681SAndroid Build Coastguard Worker; CHECK: bx 151*9880d681SAndroid Build Coastguard Worker; We may leave the last insertelement in the if.end block. 152*9880d681SAndroid Build Coastguard Worker; It is inserting the %add value into a dead lane, but %add causes interference 153*9880d681SAndroid Build Coastguard Worker; in the entry block, and we don't do dead lane checks across basic blocks. 154*9880d681SAndroid Build Coastguard Workerdefine void @f5(float* %p, float* %q) nounwind ssp { 155*9880d681SAndroid Build Coastguard Workerentry: 156*9880d681SAndroid Build Coastguard Worker %0 = bitcast float* %p to i8* 157*9880d681SAndroid Build Coastguard Worker %vld1 = tail call <4 x float> @llvm.arm.neon.vld1.v4f32.p0i8(i8* %0, i32 4) 158*9880d681SAndroid Build Coastguard Worker %vecext = extractelement <4 x float> %vld1, i32 0 159*9880d681SAndroid Build Coastguard Worker %vecext1 = extractelement <4 x float> %vld1, i32 1 160*9880d681SAndroid Build Coastguard Worker %vecext2 = extractelement <4 x float> %vld1, i32 2 161*9880d681SAndroid Build Coastguard Worker %vecext3 = extractelement <4 x float> %vld1, i32 3 162*9880d681SAndroid Build Coastguard Worker %add = fadd float %vecext3, 1.000000e+00 163*9880d681SAndroid Build Coastguard Worker %tobool = icmp eq float* %q, null 164*9880d681SAndroid Build Coastguard Worker br i1 %tobool, label %if.end, label %if.then 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerif.then: ; preds = %entry 167*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds float, float* %q, i32 1 168*9880d681SAndroid Build Coastguard Worker %1 = load float, float* %arrayidx, align 4 169*9880d681SAndroid Build Coastguard Worker %add4 = fadd float %vecext, %1 170*9880d681SAndroid Build Coastguard Worker %2 = load float, float* %q, align 4 171*9880d681SAndroid Build Coastguard Worker %add6 = fadd float %vecext1, %2 172*9880d681SAndroid Build Coastguard Worker %arrayidx7 = getelementptr inbounds float, float* %q, i32 2 173*9880d681SAndroid Build Coastguard Worker %3 = load float, float* %arrayidx7, align 4 174*9880d681SAndroid Build Coastguard Worker %add8 = fadd float %vecext2, %3 175*9880d681SAndroid Build Coastguard Worker br label %if.end 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %entry, %if.then 178*9880d681SAndroid Build Coastguard Worker %a.0 = phi float [ %add4, %if.then ], [ %vecext, %entry ] 179*9880d681SAndroid Build Coastguard Worker %b.0 = phi float [ %add6, %if.then ], [ %vecext1, %entry ] 180*9880d681SAndroid Build Coastguard Worker %c.0 = phi float [ %add8, %if.then ], [ %vecext2, %entry ] 181*9880d681SAndroid Build Coastguard Worker %vecinit = insertelement <4 x float> undef, float %a.0, i32 0 182*9880d681SAndroid Build Coastguard Worker %vecinit9 = insertelement <4 x float> %vecinit, float %b.0, i32 1 183*9880d681SAndroid Build Coastguard Worker %vecinit10 = insertelement <4 x float> %vecinit9, float %c.0, i32 2 184*9880d681SAndroid Build Coastguard Worker %vecinit11 = insertelement <4 x float> %vecinit10, float %add, i32 3 185*9880d681SAndroid Build Coastguard Worker tail call void @llvm.arm.neon.vst1.p0i8.v4f32(i8* %0, <4 x float> %vecinit11, i32 4) 186*9880d681SAndroid Build Coastguard Worker ret void 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.arm.neon.vld1.v4f32.p0i8(i8*, i32) nounwind readonly 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.arm.neon.vst1.p0i8.v4f32(i8*, <4 x float>, i32) nounwind 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Worker; CHECK: pr13999 194*9880d681SAndroid Build Coastguard Workerdefine void @pr13999() nounwind readonly { 195*9880d681SAndroid Build Coastguard Workerentry: 196*9880d681SAndroid Build Coastguard Worker br i1 true, label %outer_loop, label %loop.end 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerouter_loop: 199*9880d681SAndroid Build Coastguard Worker %d = phi double [ 0.0, %entry ], [ %add, %after_inner_loop ] 200*9880d681SAndroid Build Coastguard Worker %0 = insertelement <2 x double> <double 0.0, double 0.0>, double %d, i32 0 201*9880d681SAndroid Build Coastguard Worker br i1 undef, label %after_inner_loop, label %inner_loop 202*9880d681SAndroid Build Coastguard Worker 203*9880d681SAndroid Build Coastguard Workerinner_loop: 204*9880d681SAndroid Build Coastguard Worker br i1 true, label %after_inner_loop, label %inner_loop 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerafter_inner_loop: 207*9880d681SAndroid Build Coastguard Worker %1 = phi <2 x double> [ %0, %outer_loop ], [ <double 0.0, double 0.0>, 208*9880d681SAndroid Build Coastguard Worker%inner_loop ] 209*9880d681SAndroid Build Coastguard Worker %2 = extractelement <2 x double> %1, i32 1 210*9880d681SAndroid Build Coastguard Worker %add = fadd double 1.0, %2 211*9880d681SAndroid Build Coastguard Worker br i1 false, label %loop.end, label %outer_loop 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerloop.end: 214*9880d681SAndroid Build Coastguard Worker %d.end = phi double [ 0.0, %entry ], [ %add, %after_inner_loop ] 215*9880d681SAndroid Build Coastguard Worker ret void 216*9880d681SAndroid Build Coastguard Worker} 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; CHECK: pr14078 219*9880d681SAndroid Build Coastguard Workerdefine arm_aapcs_vfpcc i32 @pr14078(i8* nocapture %arg, i8* nocapture %arg1, i32 %arg2) nounwind uwtable readonly { 220*9880d681SAndroid Build Coastguard Workerbb: 221*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb31, label %bb3 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerbb3: ; preds = %bb12, %bb 224*9880d681SAndroid Build Coastguard Worker %tmp = shufflevector <2 x i64> undef, <2 x i64> undef, <1 x i32> zeroinitializer 225*9880d681SAndroid Build Coastguard Worker %tmp4 = bitcast <1 x i64> %tmp to <2 x float> 226*9880d681SAndroid Build Coastguard Worker %tmp5 = shufflevector <2 x float> %tmp4, <2 x float> undef, <4 x i32> zeroinitializer 227*9880d681SAndroid Build Coastguard Worker %tmp6 = bitcast <4 x float> %tmp5 to <2 x i64> 228*9880d681SAndroid Build Coastguard Worker %tmp7 = shufflevector <2 x i64> %tmp6, <2 x i64> undef, <1 x i32> zeroinitializer 229*9880d681SAndroid Build Coastguard Worker %tmp8 = bitcast <1 x i64> %tmp7 to <2 x float> 230*9880d681SAndroid Build Coastguard Worker %tmp9 = tail call <2 x float> @baz(<2 x float> <float 0xFFFFFFFFE0000000, float 0.000000e+00>, <2 x float> %tmp8, <2 x float> zeroinitializer) nounwind 231*9880d681SAndroid Build Coastguard Worker br i1 undef, label %bb10, label %bb12 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerbb10: ; preds = %bb3 234*9880d681SAndroid Build Coastguard Worker %tmp11 = load <4 x float>, <4 x float>* undef, align 8 235*9880d681SAndroid Build Coastguard Worker br label %bb12 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerbb12: ; preds = %bb10, %bb3 238*9880d681SAndroid Build Coastguard Worker %tmp13 = shufflevector <2 x float> %tmp9, <2 x float> zeroinitializer, <2 x i32> <i32 0, i32 2> 239*9880d681SAndroid Build Coastguard Worker %tmp14 = bitcast <2 x float> %tmp13 to <1 x i64> 240*9880d681SAndroid Build Coastguard Worker %tmp15 = shufflevector <1 x i64> %tmp14, <1 x i64> zeroinitializer, <2 x i32> <i32 0, i32 1> 241*9880d681SAndroid Build Coastguard Worker %tmp16 = bitcast <2 x i64> %tmp15 to <4 x float> 242*9880d681SAndroid Build Coastguard Worker %tmp17 = fmul <4 x float> zeroinitializer, %tmp16 243*9880d681SAndroid Build Coastguard Worker %tmp18 = bitcast <4 x float> %tmp17 to <2 x i64> 244*9880d681SAndroid Build Coastguard Worker %tmp19 = shufflevector <2 x i64> %tmp18, <2 x i64> undef, <1 x i32> zeroinitializer 245*9880d681SAndroid Build Coastguard Worker %tmp20 = bitcast <1 x i64> %tmp19 to <2 x float> 246*9880d681SAndroid Build Coastguard Worker %tmp21 = tail call <2 x float> @baz67(<2 x float> %tmp20, <2 x float> undef) nounwind 247*9880d681SAndroid Build Coastguard Worker %tmp22 = tail call <2 x float> @baz67(<2 x float> %tmp21, <2 x float> %tmp21) nounwind 248*9880d681SAndroid Build Coastguard Worker %tmp23 = shufflevector <2 x float> %tmp22, <2 x float> undef, <4 x i32> zeroinitializer 249*9880d681SAndroid Build Coastguard Worker %tmp24 = bitcast <4 x float> %tmp23 to <2 x i64> 250*9880d681SAndroid Build Coastguard Worker %tmp25 = shufflevector <2 x i64> %tmp24, <2 x i64> undef, <1 x i32> zeroinitializer 251*9880d681SAndroid Build Coastguard Worker %tmp26 = bitcast <1 x i64> %tmp25 to <2 x float> 252*9880d681SAndroid Build Coastguard Worker %tmp27 = extractelement <2 x float> %tmp26, i32 0 253*9880d681SAndroid Build Coastguard Worker %tmp28 = fcmp olt float %tmp27, 0.000000e+00 254*9880d681SAndroid Build Coastguard Worker %tmp29 = select i1 %tmp28, i32 0, i32 undef 255*9880d681SAndroid Build Coastguard Worker %tmp30 = icmp ult i32 undef, %arg2 256*9880d681SAndroid Build Coastguard Worker br i1 %tmp30, label %bb3, label %bb31 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Workerbb31: ; preds = %bb12, %bb 259*9880d681SAndroid Build Coastguard Worker %tmp32 = phi i32 [ 1, %bb ], [ %tmp29, %bb12 ] 260*9880d681SAndroid Build Coastguard Worker ret i32 %tmp32 261*9880d681SAndroid Build Coastguard Worker} 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Workerdeclare <2 x float> @baz(<2 x float>, <2 x float>, <2 x float>) nounwind readnone 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Workerdeclare <2 x float> @baz67(<2 x float>, <2 x float>) nounwind readnone 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Worker%struct.wombat.5 = type { %struct.quux, %struct.quux, %struct.quux, %struct.quux } 268*9880d681SAndroid Build Coastguard Worker%struct.quux = type { <4 x float> } 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker; CHECK: pr14079 271*9880d681SAndroid Build Coastguard Workerdefine linkonce_odr arm_aapcs_vfpcc %struct.wombat.5 @pr14079(i8* nocapture %arg, i8* nocapture %arg1, i8* nocapture %arg2) nounwind uwtable inlinehint { 272*9880d681SAndroid Build Coastguard Workerbb: 273*9880d681SAndroid Build Coastguard Worker %tmp = shufflevector <2 x i64> zeroinitializer, <2 x i64> undef, <1 x i32> zeroinitializer 274*9880d681SAndroid Build Coastguard Worker %tmp3 = bitcast <1 x i64> %tmp to <2 x float> 275*9880d681SAndroid Build Coastguard Worker %tmp4 = shufflevector <2 x float> %tmp3, <2 x float> zeroinitializer, <2 x i32> <i32 1, i32 3> 276*9880d681SAndroid Build Coastguard Worker %tmp5 = shufflevector <2 x float> %tmp4, <2 x float> undef, <2 x i32> <i32 1, i32 3> 277*9880d681SAndroid Build Coastguard Worker %tmp6 = bitcast <2 x float> %tmp5 to <1 x i64> 278*9880d681SAndroid Build Coastguard Worker %tmp7 = shufflevector <1 x i64> undef, <1 x i64> %tmp6, <2 x i32> <i32 0, i32 1> 279*9880d681SAndroid Build Coastguard Worker %tmp8 = bitcast <2 x i64> %tmp7 to <4 x float> 280*9880d681SAndroid Build Coastguard Worker %tmp9 = shufflevector <2 x i64> zeroinitializer, <2 x i64> undef, <1 x i32> <i32 1> 281*9880d681SAndroid Build Coastguard Worker %tmp10 = bitcast <1 x i64> %tmp9 to <2 x float> 282*9880d681SAndroid Build Coastguard Worker %tmp11 = shufflevector <2 x float> %tmp10, <2 x float> undef, <2 x i32> <i32 0, i32 2> 283*9880d681SAndroid Build Coastguard Worker %tmp12 = shufflevector <2 x float> %tmp11, <2 x float> undef, <2 x i32> <i32 0, i32 2> 284*9880d681SAndroid Build Coastguard Worker %tmp13 = bitcast <2 x float> %tmp12 to <1 x i64> 285*9880d681SAndroid Build Coastguard Worker %tmp14 = shufflevector <1 x i64> %tmp13, <1 x i64> undef, <2 x i32> <i32 0, i32 1> 286*9880d681SAndroid Build Coastguard Worker %tmp15 = bitcast <2 x i64> %tmp14 to <4 x float> 287*9880d681SAndroid Build Coastguard Worker %tmp16 = insertvalue %struct.wombat.5 undef, <4 x float> %tmp8, 1, 0 288*9880d681SAndroid Build Coastguard Worker %tmp17 = insertvalue %struct.wombat.5 %tmp16, <4 x float> %tmp15, 2, 0 289*9880d681SAndroid Build Coastguard Worker %tmp18 = insertvalue %struct.wombat.5 %tmp17, <4 x float> undef, 3, 0 290*9880d681SAndroid Build Coastguard Worker ret %struct.wombat.5 %tmp18 291*9880d681SAndroid Build Coastguard Worker} 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker; CHECK: adjustCopiesBackFrom 294*9880d681SAndroid Build Coastguard Worker; The shuffle in if.else3 must be preserved even though adjustCopiesBackFrom 295*9880d681SAndroid Build Coastguard Worker; is tempted to remove it. 296*9880d681SAndroid Build Coastguard Worker; CHECK: vorr d 297*9880d681SAndroid Build Coastguard Workerdefine internal void @adjustCopiesBackFrom(<2 x i64>* noalias nocapture sret %agg.result, <2 x i64> %in) { 298*9880d681SAndroid Build Coastguard Workerentry: 299*9880d681SAndroid Build Coastguard Worker %0 = extractelement <2 x i64> %in, i32 0 300*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %0, 1 301*9880d681SAndroid Build Coastguard Worker %.in = select i1 %cmp, <2 x i64> <i64 0, i64 undef>, <2 x i64> %in 302*9880d681SAndroid Build Coastguard Worker %1 = extractelement <2 x i64> %in, i32 1 303*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp slt i64 %1, 1 304*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %if.then2, label %if.else3 305*9880d681SAndroid Build Coastguard Worker 306*9880d681SAndroid Build Coastguard Workerif.then2: ; preds = %entry 307*9880d681SAndroid Build Coastguard Worker %2 = insertelement <2 x i64> %.in, i64 0, i32 1 308*9880d681SAndroid Build Coastguard Worker br label %if.end4 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Workerif.else3: ; preds = %entry 311*9880d681SAndroid Build Coastguard Worker %3 = shufflevector <2 x i64> %.in, <2 x i64> %in, <2 x i32> <i32 0, i32 3> 312*9880d681SAndroid Build Coastguard Worker br label %if.end4 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Workerif.end4: ; preds = %if.else3, %if.then2 315*9880d681SAndroid Build Coastguard Worker %result.2 = phi <2 x i64> [ %2, %if.then2 ], [ %3, %if.else3 ] 316*9880d681SAndroid Build Coastguard Worker store <2 x i64> %result.2, <2 x i64>* %agg.result, align 128 317*9880d681SAndroid Build Coastguard Worker ret void 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Worker; <rdar://problem/12758887> 321*9880d681SAndroid Build Coastguard Worker; RegisterCoalescer::updateRegDefsUses() could visit an instruction more than 322*9880d681SAndroid Build Coastguard Worker; once under rare circumstances. When widening a register from QPR to DTriple 323*9880d681SAndroid Build Coastguard Worker; with the original virtual register in dsub_1_dsub_2, the double rewrite would 324*9880d681SAndroid Build Coastguard Worker; produce an invalid sub-register. 325*9880d681SAndroid Build Coastguard Worker; 326*9880d681SAndroid Build Coastguard Worker; This is because dsub_1_dsub_2 is not an idempotent sub-register index. 327*9880d681SAndroid Build Coastguard Worker; It will translate %vr:dsub_0 -> %vr:dsub_1. 328*9880d681SAndroid Build Coastguard Workerdefine hidden fastcc void @radar12758887() nounwind optsize ssp { 329*9880d681SAndroid Build Coastguard Workerentry: 330*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.body, label %for.end70 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.end, %entry 333*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.body29, label %for.end 334*9880d681SAndroid Build Coastguard Worker 335*9880d681SAndroid Build Coastguard Workerfor.body29: ; preds = %for.body29, %for.body 336*9880d681SAndroid Build Coastguard Worker %0 = load <2 x double>, <2 x double>* null, align 1 337*9880d681SAndroid Build Coastguard Worker %splat40 = shufflevector <2 x double> %0, <2 x double> undef, <2 x i32> zeroinitializer 338*9880d681SAndroid Build Coastguard Worker %mul41 = fmul <2 x double> undef, %splat40 339*9880d681SAndroid Build Coastguard Worker %add42 = fadd <2 x double> undef, %mul41 340*9880d681SAndroid Build Coastguard Worker %splat44 = shufflevector <2 x double> %0, <2 x double> undef, <2 x i32> <i32 1, i32 1> 341*9880d681SAndroid Build Coastguard Worker %mul45 = fmul <2 x double> undef, %splat44 342*9880d681SAndroid Build Coastguard Worker %add46 = fadd <2 x double> undef, %mul45 343*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.end, label %for.body29 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body29, %for.body 346*9880d681SAndroid Build Coastguard Worker %accumR2.0.lcssa = phi <2 x double> [ zeroinitializer, %for.body ], [ %add42, %for.body29 ] 347*9880d681SAndroid Build Coastguard Worker %accumI2.0.lcssa = phi <2 x double> [ zeroinitializer, %for.body ], [ %add46, %for.body29 ] 348*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <2 x double> %accumI2.0.lcssa, <2 x double> undef, <2 x i32> <i32 1, i32 0> 349*9880d681SAndroid Build Coastguard Worker %add58 = fadd <2 x double> undef, %1 350*9880d681SAndroid Build Coastguard Worker %mul61 = fmul <2 x double> %add58, undef 351*9880d681SAndroid Build Coastguard Worker %add63 = fadd <2 x double> undef, %mul61 352*9880d681SAndroid Build Coastguard Worker %add64 = fadd <2 x double> undef, %add63 353*9880d681SAndroid Build Coastguard Worker %add67 = fadd <2 x double> undef, %add64 354*9880d681SAndroid Build Coastguard Worker store <2 x double> %add67, <2 x double>* undef, align 1 355*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.end70, label %for.body 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Workerfor.end70: ; preds = %for.end, %entry 358*9880d681SAndroid Build Coastguard Worker ret void 359*9880d681SAndroid Build Coastguard Worker} 360