1*9880d681SAndroid Build Coastguard Worker; Test moves between FPRs and GPRs. The 32-bit cases test the z10 2*9880d681SAndroid Build Coastguard Worker; implementation, which has no high-word support. 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare i64 @foo() 7*9880d681SAndroid Build Coastguard Workerdeclare double @bar() 8*9880d681SAndroid Build Coastguard Worker@dptr = external global double 9*9880d681SAndroid Build Coastguard Worker@iptr = external global i64 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; Test 32-bit moves from GPRs to FPRs. The GPR must be moved into the high 12*9880d681SAndroid Build Coastguard Worker; 32 bits of the FPR. 13*9880d681SAndroid Build Coastguard Workerdefine float @f1(i32 %a) { 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 15*9880d681SAndroid Build Coastguard Worker; CHECK: sllg [[REGISTER:%r[0-5]]], %r2, 32 16*9880d681SAndroid Build Coastguard Worker; CHECK: ldgr %f0, [[REGISTER]] 17*9880d681SAndroid Build Coastguard Worker %res = bitcast i32 %a to float 18*9880d681SAndroid Build Coastguard Worker ret float %res 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; Like f1, but create a situation where the shift can be folded with 22*9880d681SAndroid Build Coastguard Worker; surrounding code. 23*9880d681SAndroid Build Coastguard Workerdefine float @f2(i64 %big) { 24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 25*9880d681SAndroid Build Coastguard Worker; CHECK: risbg [[REGISTER:%r[0-5]]], %r2, 0, 159, 31 26*9880d681SAndroid Build Coastguard Worker; CHECK: ldgr %f0, [[REGISTER]] 27*9880d681SAndroid Build Coastguard Worker %shift = lshr i64 %big, 1 28*9880d681SAndroid Build Coastguard Worker %a = trunc i64 %shift to i32 29*9880d681SAndroid Build Coastguard Worker %res = bitcast i32 %a to float 30*9880d681SAndroid Build Coastguard Worker ret float %res 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; Another example of the same thing. 34*9880d681SAndroid Build Coastguard Workerdefine float @f3(i64 %big) { 35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 36*9880d681SAndroid Build Coastguard Worker; CHECK: risbg [[REGISTER:%r[0-5]]], %r2, 0, 159, 2 37*9880d681SAndroid Build Coastguard Worker; CHECK: ldgr %f0, [[REGISTER]] 38*9880d681SAndroid Build Coastguard Worker %shift = ashr i64 %big, 30 39*9880d681SAndroid Build Coastguard Worker %a = trunc i64 %shift to i32 40*9880d681SAndroid Build Coastguard Worker %res = bitcast i32 %a to float 41*9880d681SAndroid Build Coastguard Worker ret float %res 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; Like f1, but the value to transfer is already in the high 32 bits. 45*9880d681SAndroid Build Coastguard Workerdefine float @f4(i64 %big) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r2 48*9880d681SAndroid Build Coastguard Worker; CHECK: nilf %r2, 0 49*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r2 50*9880d681SAndroid Build Coastguard Worker; CHECK: ldgr %f0, %r2 51*9880d681SAndroid Build Coastguard Worker %shift = ashr i64 %big, 32 52*9880d681SAndroid Build Coastguard Worker %a = trunc i64 %shift to i32 53*9880d681SAndroid Build Coastguard Worker %res = bitcast i32 %a to float 54*9880d681SAndroid Build Coastguard Worker ret float %res 55*9880d681SAndroid Build Coastguard Worker} 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; Test 64-bit moves from GPRs to FPRs. 58*9880d681SAndroid Build Coastguard Workerdefine double @f5(i64 %a) { 59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 60*9880d681SAndroid Build Coastguard Worker; CHECK: ldgr %f0, %r2 61*9880d681SAndroid Build Coastguard Worker %res = bitcast i64 %a to double 62*9880d681SAndroid Build Coastguard Worker ret double %res 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; Test 128-bit moves from GPRs to FPRs. i128 isn't a legitimate type, 66*9880d681SAndroid Build Coastguard Worker; so this goes through memory. 67*9880d681SAndroid Build Coastguard Workerdefine void @f6(fp128 *%a, i128 *%b) { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 69*9880d681SAndroid Build Coastguard Worker; CHECK: lg 70*9880d681SAndroid Build Coastguard Worker; CHECK: lg 71*9880d681SAndroid Build Coastguard Worker; CHECK: stg 72*9880d681SAndroid Build Coastguard Worker; CHECK: stg 73*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 74*9880d681SAndroid Build Coastguard Worker %val = load i128 , i128 *%b 75*9880d681SAndroid Build Coastguard Worker %res = bitcast i128 %val to fp128 76*9880d681SAndroid Build Coastguard Worker store fp128 %res, fp128 *%a 77*9880d681SAndroid Build Coastguard Worker ret void 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; Test 32-bit moves from FPRs to GPRs. The high 32 bits of the FPR should 81*9880d681SAndroid Build Coastguard Worker; be moved into the low 32 bits of the GPR. 82*9880d681SAndroid Build Coastguard Workerdefine i32 @f7(float %a) { 83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 84*9880d681SAndroid Build Coastguard Worker; CHECK: lgdr [[REGISTER:%r[0-5]]], %f0 85*9880d681SAndroid Build Coastguard Worker; CHECK: srlg %r2, [[REGISTER]], 32 86*9880d681SAndroid Build Coastguard Worker %res = bitcast float %a to i32 87*9880d681SAndroid Build Coastguard Worker ret i32 %res 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker; Test 64-bit moves from FPRs to GPRs. 91*9880d681SAndroid Build Coastguard Workerdefine i64 @f8(double %a) { 92*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 93*9880d681SAndroid Build Coastguard Worker; CHECK: lgdr %r2, %f0 94*9880d681SAndroid Build Coastguard Worker %res = bitcast double %a to i64 95*9880d681SAndroid Build Coastguard Worker ret i64 %res 96*9880d681SAndroid Build Coastguard Worker} 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker; Test 128-bit moves from FPRs to GPRs, with the same restriction as f6. 99*9880d681SAndroid Build Coastguard Workerdefine void @f9(fp128 *%a, i128 *%b) { 100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 101*9880d681SAndroid Build Coastguard Worker; CHECK: ld 102*9880d681SAndroid Build Coastguard Worker; CHECK: ld 103*9880d681SAndroid Build Coastguard Worker; CHECK: std 104*9880d681SAndroid Build Coastguard Worker; CHECK: std 105*9880d681SAndroid Build Coastguard Worker %val = load fp128 , fp128 *%a 106*9880d681SAndroid Build Coastguard Worker %res = bitcast fp128 %val to i128 107*9880d681SAndroid Build Coastguard Worker store i128 %res, i128 *%b 108*9880d681SAndroid Build Coastguard Worker ret void 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; Test cases where the destination of an LGDR needs to be spilled. 112*9880d681SAndroid Build Coastguard Worker; We shouldn't have any integer stack stores or floating-point loads. 113*9880d681SAndroid Build Coastguard Workerdefine void @f10(double %extra) { 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 115*9880d681SAndroid Build Coastguard Worker; CHECK: dptr 116*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: stg {{.*}}(%r15) 117*9880d681SAndroid Build Coastguard Worker; CHECK: %loop 118*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ld {{.*}}(%r15) 119*9880d681SAndroid Build Coastguard Worker; CHECK: %exit 120*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 121*9880d681SAndroid Build Coastguard Workerentry: 122*9880d681SAndroid Build Coastguard Worker %double0 = load volatile double , double *@dptr 123*9880d681SAndroid Build Coastguard Worker %biased0 = fadd double %double0, %extra 124*9880d681SAndroid Build Coastguard Worker %int0 = bitcast double %biased0 to i64 125*9880d681SAndroid Build Coastguard Worker %double1 = load volatile double , double *@dptr 126*9880d681SAndroid Build Coastguard Worker %biased1 = fadd double %double1, %extra 127*9880d681SAndroid Build Coastguard Worker %int1 = bitcast double %biased1 to i64 128*9880d681SAndroid Build Coastguard Worker %double2 = load volatile double , double *@dptr 129*9880d681SAndroid Build Coastguard Worker %biased2 = fadd double %double2, %extra 130*9880d681SAndroid Build Coastguard Worker %int2 = bitcast double %biased2 to i64 131*9880d681SAndroid Build Coastguard Worker %double3 = load volatile double , double *@dptr 132*9880d681SAndroid Build Coastguard Worker %biased3 = fadd double %double3, %extra 133*9880d681SAndroid Build Coastguard Worker %int3 = bitcast double %biased3 to i64 134*9880d681SAndroid Build Coastguard Worker %double4 = load volatile double , double *@dptr 135*9880d681SAndroid Build Coastguard Worker %biased4 = fadd double %double4, %extra 136*9880d681SAndroid Build Coastguard Worker %int4 = bitcast double %biased4 to i64 137*9880d681SAndroid Build Coastguard Worker %double5 = load volatile double , double *@dptr 138*9880d681SAndroid Build Coastguard Worker %biased5 = fadd double %double5, %extra 139*9880d681SAndroid Build Coastguard Worker %int5 = bitcast double %biased5 to i64 140*9880d681SAndroid Build Coastguard Worker %double6 = load volatile double , double *@dptr 141*9880d681SAndroid Build Coastguard Worker %biased6 = fadd double %double6, %extra 142*9880d681SAndroid Build Coastguard Worker %int6 = bitcast double %biased6 to i64 143*9880d681SAndroid Build Coastguard Worker %double7 = load volatile double , double *@dptr 144*9880d681SAndroid Build Coastguard Worker %biased7 = fadd double %double7, %extra 145*9880d681SAndroid Build Coastguard Worker %int7 = bitcast double %biased7 to i64 146*9880d681SAndroid Build Coastguard Worker %double8 = load volatile double , double *@dptr 147*9880d681SAndroid Build Coastguard Worker %biased8 = fadd double %double8, %extra 148*9880d681SAndroid Build Coastguard Worker %int8 = bitcast double %biased8 to i64 149*9880d681SAndroid Build Coastguard Worker %double9 = load volatile double , double *@dptr 150*9880d681SAndroid Build Coastguard Worker %biased9 = fadd double %double9, %extra 151*9880d681SAndroid Build Coastguard Worker %int9 = bitcast double %biased9 to i64 152*9880d681SAndroid Build Coastguard Worker br label %loop 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerloop: 155*9880d681SAndroid Build Coastguard Worker %start = call i64 @foo() 156*9880d681SAndroid Build Coastguard Worker %or0 = or i64 %start, %int0 157*9880d681SAndroid Build Coastguard Worker %or1 = or i64 %or0, %int1 158*9880d681SAndroid Build Coastguard Worker %or2 = or i64 %or1, %int2 159*9880d681SAndroid Build Coastguard Worker %or3 = or i64 %or2, %int3 160*9880d681SAndroid Build Coastguard Worker %or4 = or i64 %or3, %int4 161*9880d681SAndroid Build Coastguard Worker %or5 = or i64 %or4, %int5 162*9880d681SAndroid Build Coastguard Worker %or6 = or i64 %or5, %int6 163*9880d681SAndroid Build Coastguard Worker %or7 = or i64 %or6, %int7 164*9880d681SAndroid Build Coastguard Worker %or8 = or i64 %or7, %int8 165*9880d681SAndroid Build Coastguard Worker %or9 = or i64 %or8, %int9 166*9880d681SAndroid Build Coastguard Worker store i64 %or9, i64 *@iptr 167*9880d681SAndroid Build Coastguard Worker %cont = icmp ne i64 %start, 1 168*9880d681SAndroid Build Coastguard Worker br i1 %cont, label %loop, label %exit 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerexit: 171*9880d681SAndroid Build Coastguard Worker ret void 172*9880d681SAndroid Build Coastguard Worker} 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker; ...likewise LDGR, with the requirements the other way around. 175*9880d681SAndroid Build Coastguard Workerdefine void @f11(i64 %mask) { 176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 177*9880d681SAndroid Build Coastguard Worker; CHECK: iptr 178*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: std {{.*}}(%r15) 179*9880d681SAndroid Build Coastguard Worker; CHECK: %loop 180*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: lg {{.*}}(%r15) 181*9880d681SAndroid Build Coastguard Worker; CHECK: %exit 182*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 183*9880d681SAndroid Build Coastguard Workerentry: 184*9880d681SAndroid Build Coastguard Worker %int0 = load volatile i64 , i64 *@iptr 185*9880d681SAndroid Build Coastguard Worker %masked0 = and i64 %int0, %mask 186*9880d681SAndroid Build Coastguard Worker %double0 = bitcast i64 %masked0 to double 187*9880d681SAndroid Build Coastguard Worker %int1 = load volatile i64 , i64 *@iptr 188*9880d681SAndroid Build Coastguard Worker %masked1 = and i64 %int1, %mask 189*9880d681SAndroid Build Coastguard Worker %double1 = bitcast i64 %masked1 to double 190*9880d681SAndroid Build Coastguard Worker %int2 = load volatile i64 , i64 *@iptr 191*9880d681SAndroid Build Coastguard Worker %masked2 = and i64 %int2, %mask 192*9880d681SAndroid Build Coastguard Worker %double2 = bitcast i64 %masked2 to double 193*9880d681SAndroid Build Coastguard Worker %int3 = load volatile i64 , i64 *@iptr 194*9880d681SAndroid Build Coastguard Worker %masked3 = and i64 %int3, %mask 195*9880d681SAndroid Build Coastguard Worker %double3 = bitcast i64 %masked3 to double 196*9880d681SAndroid Build Coastguard Worker %int4 = load volatile i64 , i64 *@iptr 197*9880d681SAndroid Build Coastguard Worker %masked4 = and i64 %int4, %mask 198*9880d681SAndroid Build Coastguard Worker %double4 = bitcast i64 %masked4 to double 199*9880d681SAndroid Build Coastguard Worker %int5 = load volatile i64 , i64 *@iptr 200*9880d681SAndroid Build Coastguard Worker %masked5 = and i64 %int5, %mask 201*9880d681SAndroid Build Coastguard Worker %double5 = bitcast i64 %masked5 to double 202*9880d681SAndroid Build Coastguard Worker %int6 = load volatile i64 , i64 *@iptr 203*9880d681SAndroid Build Coastguard Worker %masked6 = and i64 %int6, %mask 204*9880d681SAndroid Build Coastguard Worker %double6 = bitcast i64 %masked6 to double 205*9880d681SAndroid Build Coastguard Worker %int7 = load volatile i64 , i64 *@iptr 206*9880d681SAndroid Build Coastguard Worker %masked7 = and i64 %int7, %mask 207*9880d681SAndroid Build Coastguard Worker %double7 = bitcast i64 %masked7 to double 208*9880d681SAndroid Build Coastguard Worker %int8 = load volatile i64 , i64 *@iptr 209*9880d681SAndroid Build Coastguard Worker %masked8 = and i64 %int8, %mask 210*9880d681SAndroid Build Coastguard Worker %double8 = bitcast i64 %masked8 to double 211*9880d681SAndroid Build Coastguard Worker %int9 = load volatile i64 , i64 *@iptr 212*9880d681SAndroid Build Coastguard Worker %masked9 = and i64 %int9, %mask 213*9880d681SAndroid Build Coastguard Worker %double9 = bitcast i64 %masked9 to double 214*9880d681SAndroid Build Coastguard Worker br label %loop 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Workerloop: 217*9880d681SAndroid Build Coastguard Worker %start = call double @bar() 218*9880d681SAndroid Build Coastguard Worker %add0 = fadd double %start, %double0 219*9880d681SAndroid Build Coastguard Worker %add1 = fadd double %add0, %double1 220*9880d681SAndroid Build Coastguard Worker %add2 = fadd double %add1, %double2 221*9880d681SAndroid Build Coastguard Worker %add3 = fadd double %add2, %double3 222*9880d681SAndroid Build Coastguard Worker %add4 = fadd double %add3, %double4 223*9880d681SAndroid Build Coastguard Worker %add5 = fadd double %add4, %double5 224*9880d681SAndroid Build Coastguard Worker %add6 = fadd double %add5, %double6 225*9880d681SAndroid Build Coastguard Worker %add7 = fadd double %add6, %double7 226*9880d681SAndroid Build Coastguard Worker %add8 = fadd double %add7, %double8 227*9880d681SAndroid Build Coastguard Worker %add9 = fadd double %add8, %double9 228*9880d681SAndroid Build Coastguard Worker store double %add9, double *@dptr 229*9880d681SAndroid Build Coastguard Worker %cont = fcmp one double %start, 1.0 230*9880d681SAndroid Build Coastguard Worker br i1 %cont, label %loop, label %exit 231*9880d681SAndroid Build Coastguard Worker 232*9880d681SAndroid Build Coastguard Workerexit: 233*9880d681SAndroid Build Coastguard Worker ret void 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; Test cases where the source of an LDGR needs to be spilled. 237*9880d681SAndroid Build Coastguard Worker; We shouldn't have any integer stack stores or floating-point loads. 238*9880d681SAndroid Build Coastguard Workerdefine void @f12() { 239*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f12: 240*9880d681SAndroid Build Coastguard Worker; CHECK: %loop 241*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: std {{.*}}(%r15) 242*9880d681SAndroid Build Coastguard Worker; CHECK: %exit 243*9880d681SAndroid Build Coastguard Worker; CHECK: foo@PLT 244*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: lg {{.*}}(%r15) 245*9880d681SAndroid Build Coastguard Worker; CHECK: foo@PLT 246*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 247*9880d681SAndroid Build Coastguard Workerentry: 248*9880d681SAndroid Build Coastguard Worker br label %loop 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerloop: 251*9880d681SAndroid Build Coastguard Worker %int0 = phi i64 [ 0, %entry ], [ %add0, %loop ] 252*9880d681SAndroid Build Coastguard Worker %int1 = phi i64 [ 0, %entry ], [ %add1, %loop ] 253*9880d681SAndroid Build Coastguard Worker %int2 = phi i64 [ 0, %entry ], [ %add2, %loop ] 254*9880d681SAndroid Build Coastguard Worker %int3 = phi i64 [ 0, %entry ], [ %add3, %loop ] 255*9880d681SAndroid Build Coastguard Worker %int4 = phi i64 [ 0, %entry ], [ %add4, %loop ] 256*9880d681SAndroid Build Coastguard Worker %int5 = phi i64 [ 0, %entry ], [ %add5, %loop ] 257*9880d681SAndroid Build Coastguard Worker %int6 = phi i64 [ 0, %entry ], [ %add6, %loop ] 258*9880d681SAndroid Build Coastguard Worker %int7 = phi i64 [ 0, %entry ], [ %add7, %loop ] 259*9880d681SAndroid Build Coastguard Worker %int8 = phi i64 [ 0, %entry ], [ %add8, %loop ] 260*9880d681SAndroid Build Coastguard Worker %int9 = phi i64 [ 0, %entry ], [ %add9, %loop ] 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Worker %bias = call i64 @foo() 263*9880d681SAndroid Build Coastguard Worker %add0 = add i64 %int0, %bias 264*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %int1, %bias 265*9880d681SAndroid Build Coastguard Worker %add2 = add i64 %int2, %bias 266*9880d681SAndroid Build Coastguard Worker %add3 = add i64 %int3, %bias 267*9880d681SAndroid Build Coastguard Worker %add4 = add i64 %int4, %bias 268*9880d681SAndroid Build Coastguard Worker %add5 = add i64 %int5, %bias 269*9880d681SAndroid Build Coastguard Worker %add6 = add i64 %int6, %bias 270*9880d681SAndroid Build Coastguard Worker %add7 = add i64 %int7, %bias 271*9880d681SAndroid Build Coastguard Worker %add8 = add i64 %int8, %bias 272*9880d681SAndroid Build Coastguard Worker %add9 = add i64 %int9, %bias 273*9880d681SAndroid Build Coastguard Worker %cont = icmp ne i64 %bias, 1 274*9880d681SAndroid Build Coastguard Worker br i1 %cont, label %loop, label %exit 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Workerexit: 277*9880d681SAndroid Build Coastguard Worker %unused1 = call i64 @foo() 278*9880d681SAndroid Build Coastguard Worker %factor = load volatile double , double *@dptr 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker %conv0 = bitcast i64 %add0 to double 281*9880d681SAndroid Build Coastguard Worker %mul0 = fmul double %conv0, %factor 282*9880d681SAndroid Build Coastguard Worker store volatile double %mul0, double *@dptr 283*9880d681SAndroid Build Coastguard Worker %conv1 = bitcast i64 %add1 to double 284*9880d681SAndroid Build Coastguard Worker %mul1 = fmul double %conv1, %factor 285*9880d681SAndroid Build Coastguard Worker store volatile double %mul1, double *@dptr 286*9880d681SAndroid Build Coastguard Worker %conv2 = bitcast i64 %add2 to double 287*9880d681SAndroid Build Coastguard Worker %mul2 = fmul double %conv2, %factor 288*9880d681SAndroid Build Coastguard Worker store volatile double %mul2, double *@dptr 289*9880d681SAndroid Build Coastguard Worker %conv3 = bitcast i64 %add3 to double 290*9880d681SAndroid Build Coastguard Worker %mul3 = fmul double %conv3, %factor 291*9880d681SAndroid Build Coastguard Worker store volatile double %mul3, double *@dptr 292*9880d681SAndroid Build Coastguard Worker %conv4 = bitcast i64 %add4 to double 293*9880d681SAndroid Build Coastguard Worker %mul4 = fmul double %conv4, %factor 294*9880d681SAndroid Build Coastguard Worker store volatile double %mul4, double *@dptr 295*9880d681SAndroid Build Coastguard Worker %conv5 = bitcast i64 %add5 to double 296*9880d681SAndroid Build Coastguard Worker %mul5 = fmul double %conv5, %factor 297*9880d681SAndroid Build Coastguard Worker store volatile double %mul5, double *@dptr 298*9880d681SAndroid Build Coastguard Worker %conv6 = bitcast i64 %add6 to double 299*9880d681SAndroid Build Coastguard Worker %mul6 = fmul double %conv6, %factor 300*9880d681SAndroid Build Coastguard Worker store volatile double %mul6, double *@dptr 301*9880d681SAndroid Build Coastguard Worker %conv7 = bitcast i64 %add7 to double 302*9880d681SAndroid Build Coastguard Worker %mul7 = fmul double %conv7, %factor 303*9880d681SAndroid Build Coastguard Worker store volatile double %mul7, double *@dptr 304*9880d681SAndroid Build Coastguard Worker %conv8 = bitcast i64 %add8 to double 305*9880d681SAndroid Build Coastguard Worker %mul8 = fmul double %conv8, %factor 306*9880d681SAndroid Build Coastguard Worker store volatile double %mul8, double *@dptr 307*9880d681SAndroid Build Coastguard Worker %conv9 = bitcast i64 %add9 to double 308*9880d681SAndroid Build Coastguard Worker %mul9 = fmul double %conv9, %factor 309*9880d681SAndroid Build Coastguard Worker store volatile double %mul9, double *@dptr 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard Worker %unused2 = call i64 @foo() 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker ret void 314*9880d681SAndroid Build Coastguard Worker} 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker; ...likewise LGDR, with the requirements the other way around. 317*9880d681SAndroid Build Coastguard Workerdefine void @f13() { 318*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f13: 319*9880d681SAndroid Build Coastguard Worker; CHECK: %loop 320*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: stg {{.*}}(%r15) 321*9880d681SAndroid Build Coastguard Worker; CHECK: %exit 322*9880d681SAndroid Build Coastguard Worker; CHECK: foo@PLT 323*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ld {{.*}}(%r15) 324*9880d681SAndroid Build Coastguard Worker; CHECK: foo@PLT 325*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 326*9880d681SAndroid Build Coastguard Workerentry: 327*9880d681SAndroid Build Coastguard Worker br label %loop 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Workerloop: 330*9880d681SAndroid Build Coastguard Worker %double0 = phi double [ 1.0, %entry ], [ %mul0, %loop ] 331*9880d681SAndroid Build Coastguard Worker %double1 = phi double [ 1.0, %entry ], [ %mul1, %loop ] 332*9880d681SAndroid Build Coastguard Worker %double2 = phi double [ 1.0, %entry ], [ %mul2, %loop ] 333*9880d681SAndroid Build Coastguard Worker %double3 = phi double [ 1.0, %entry ], [ %mul3, %loop ] 334*9880d681SAndroid Build Coastguard Worker %double4 = phi double [ 1.0, %entry ], [ %mul4, %loop ] 335*9880d681SAndroid Build Coastguard Worker %double5 = phi double [ 1.0, %entry ], [ %mul5, %loop ] 336*9880d681SAndroid Build Coastguard Worker %double6 = phi double [ 1.0, %entry ], [ %mul6, %loop ] 337*9880d681SAndroid Build Coastguard Worker %double7 = phi double [ 1.0, %entry ], [ %mul7, %loop ] 338*9880d681SAndroid Build Coastguard Worker %double8 = phi double [ 1.0, %entry ], [ %mul8, %loop ] 339*9880d681SAndroid Build Coastguard Worker %double9 = phi double [ 1.0, %entry ], [ %mul9, %loop ] 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker %factor = call double @bar() 342*9880d681SAndroid Build Coastguard Worker %mul0 = fmul double %double0, %factor 343*9880d681SAndroid Build Coastguard Worker %mul1 = fmul double %double1, %factor 344*9880d681SAndroid Build Coastguard Worker %mul2 = fmul double %double2, %factor 345*9880d681SAndroid Build Coastguard Worker %mul3 = fmul double %double3, %factor 346*9880d681SAndroid Build Coastguard Worker %mul4 = fmul double %double4, %factor 347*9880d681SAndroid Build Coastguard Worker %mul5 = fmul double %double5, %factor 348*9880d681SAndroid Build Coastguard Worker %mul6 = fmul double %double6, %factor 349*9880d681SAndroid Build Coastguard Worker %mul7 = fmul double %double7, %factor 350*9880d681SAndroid Build Coastguard Worker %mul8 = fmul double %double8, %factor 351*9880d681SAndroid Build Coastguard Worker %mul9 = fmul double %double9, %factor 352*9880d681SAndroid Build Coastguard Worker %cont = fcmp one double %factor, 1.0 353*9880d681SAndroid Build Coastguard Worker br i1 %cont, label %loop, label %exit 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Workerexit: 356*9880d681SAndroid Build Coastguard Worker %unused1 = call i64 @foo() 357*9880d681SAndroid Build Coastguard Worker %bias = load volatile i64 , i64 *@iptr 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Worker %conv0 = bitcast double %mul0 to i64 360*9880d681SAndroid Build Coastguard Worker %add0 = add i64 %conv0, %bias 361*9880d681SAndroid Build Coastguard Worker store volatile i64 %add0, i64 *@iptr 362*9880d681SAndroid Build Coastguard Worker %conv1 = bitcast double %mul1 to i64 363*9880d681SAndroid Build Coastguard Worker %add1 = add i64 %conv1, %bias 364*9880d681SAndroid Build Coastguard Worker store volatile i64 %add1, i64 *@iptr 365*9880d681SAndroid Build Coastguard Worker %conv2 = bitcast double %mul2 to i64 366*9880d681SAndroid Build Coastguard Worker %add2 = add i64 %conv2, %bias 367*9880d681SAndroid Build Coastguard Worker store volatile i64 %add2, i64 *@iptr 368*9880d681SAndroid Build Coastguard Worker %conv3 = bitcast double %mul3 to i64 369*9880d681SAndroid Build Coastguard Worker %add3 = add i64 %conv3, %bias 370*9880d681SAndroid Build Coastguard Worker store volatile i64 %add3, i64 *@iptr 371*9880d681SAndroid Build Coastguard Worker %conv4 = bitcast double %mul4 to i64 372*9880d681SAndroid Build Coastguard Worker %add4 = add i64 %conv4, %bias 373*9880d681SAndroid Build Coastguard Worker store volatile i64 %add4, i64 *@iptr 374*9880d681SAndroid Build Coastguard Worker %conv5 = bitcast double %mul5 to i64 375*9880d681SAndroid Build Coastguard Worker %add5 = add i64 %conv5, %bias 376*9880d681SAndroid Build Coastguard Worker store volatile i64 %add5, i64 *@iptr 377*9880d681SAndroid Build Coastguard Worker %conv6 = bitcast double %mul6 to i64 378*9880d681SAndroid Build Coastguard Worker %add6 = add i64 %conv6, %bias 379*9880d681SAndroid Build Coastguard Worker store volatile i64 %add6, i64 *@iptr 380*9880d681SAndroid Build Coastguard Worker %conv7 = bitcast double %mul7 to i64 381*9880d681SAndroid Build Coastguard Worker %add7 = add i64 %conv7, %bias 382*9880d681SAndroid Build Coastguard Worker store volatile i64 %add7, i64 *@iptr 383*9880d681SAndroid Build Coastguard Worker %conv8 = bitcast double %mul8 to i64 384*9880d681SAndroid Build Coastguard Worker %add8 = add i64 %conv8, %bias 385*9880d681SAndroid Build Coastguard Worker store volatile i64 %add8, i64 *@iptr 386*9880d681SAndroid Build Coastguard Worker %conv9 = bitcast double %mul9 to i64 387*9880d681SAndroid Build Coastguard Worker %add9 = add i64 %conv9, %bias 388*9880d681SAndroid Build Coastguard Worker store volatile i64 %add9, i64 *@iptr 389*9880d681SAndroid Build Coastguard Worker 390*9880d681SAndroid Build Coastguard Worker %unused2 = call i64 @foo() 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker ret void 393*9880d681SAndroid Build Coastguard Worker} 394