1*9880d681SAndroid Build Coastguard Worker; Test spilling using MVC. The tests here assume z10 register pressure, 2*9880d681SAndroid Build Coastguard Worker; without the high words being available. 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 -verify-machineinstrs | FileCheck %s 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdeclare void @foo() 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Worker@g0 = global i32 0 9*9880d681SAndroid Build Coastguard Worker@g1 = global i32 1 10*9880d681SAndroid Build Coastguard Worker@g2 = global i32 2 11*9880d681SAndroid Build Coastguard Worker@g3 = global i32 3 12*9880d681SAndroid Build Coastguard Worker@g4 = global i32 4 13*9880d681SAndroid Build Coastguard Worker@g5 = global i32 5 14*9880d681SAndroid Build Coastguard Worker@g6 = global i32 6 15*9880d681SAndroid Build Coastguard Worker@g7 = global i32 7 16*9880d681SAndroid Build Coastguard Worker@g8 = global i32 8 17*9880d681SAndroid Build Coastguard Worker@g9 = global i32 9 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker@h0 = global i64 0 20*9880d681SAndroid Build Coastguard Worker@h1 = global i64 1 21*9880d681SAndroid Build Coastguard Worker@h2 = global i64 2 22*9880d681SAndroid Build Coastguard Worker@h3 = global i64 3 23*9880d681SAndroid Build Coastguard Worker@h4 = global i64 4 24*9880d681SAndroid Build Coastguard Worker@h5 = global i64 5 25*9880d681SAndroid Build Coastguard Worker@h6 = global i64 6 26*9880d681SAndroid Build Coastguard Worker@h7 = global i64 7 27*9880d681SAndroid Build Coastguard Worker@h8 = global i64 8 28*9880d681SAndroid Build Coastguard Worker@h9 = global i64 9 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker; This function shouldn't spill anything 31*9880d681SAndroid Build Coastguard Workerdefine void @f1(i32 *%ptr0) { 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f1: 33*9880d681SAndroid Build Coastguard Worker; CHECK: stmg 34*9880d681SAndroid Build Coastguard Worker; CHECK: aghi %r15, -160 35*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r15 36*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 37*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %r15 38*9880d681SAndroid Build Coastguard Worker; CHECK: lmg 39*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 40*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr i32, i32 *%ptr0, i32 2 41*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr0, i32 4 42*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr i32, i32 *%ptr0, i32 6 43*9880d681SAndroid Build Coastguard Worker %ptr4 = getelementptr i32, i32 *%ptr0, i32 8 44*9880d681SAndroid Build Coastguard Worker %ptr5 = getelementptr i32, i32 *%ptr0, i32 10 45*9880d681SAndroid Build Coastguard Worker %ptr6 = getelementptr i32, i32 *%ptr0, i32 12 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker %val0 = load i32 , i32 *%ptr0 48*9880d681SAndroid Build Coastguard Worker %val1 = load i32 , i32 *%ptr1 49*9880d681SAndroid Build Coastguard Worker %val2 = load i32 , i32 *%ptr2 50*9880d681SAndroid Build Coastguard Worker %val3 = load i32 , i32 *%ptr3 51*9880d681SAndroid Build Coastguard Worker %val4 = load i32 , i32 *%ptr4 52*9880d681SAndroid Build Coastguard Worker %val5 = load i32 , i32 *%ptr5 53*9880d681SAndroid Build Coastguard Worker %val6 = load i32 , i32 *%ptr6 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker call void @foo() 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker store i32 %val0, i32 *%ptr0 58*9880d681SAndroid Build Coastguard Worker store i32 %val1, i32 *%ptr1 59*9880d681SAndroid Build Coastguard Worker store i32 %val2, i32 *%ptr2 60*9880d681SAndroid Build Coastguard Worker store i32 %val3, i32 *%ptr3 61*9880d681SAndroid Build Coastguard Worker store i32 %val4, i32 *%ptr4 62*9880d681SAndroid Build Coastguard Worker store i32 %val5, i32 *%ptr5 63*9880d681SAndroid Build Coastguard Worker store i32 %val6, i32 *%ptr6 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker ret void 66*9880d681SAndroid Build Coastguard Worker} 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; Test a case where at least one i32 load and at least one i32 store 69*9880d681SAndroid Build Coastguard Worker; need spills. 70*9880d681SAndroid Build Coastguard Workerdefine void @f2(i32 *%ptr0) { 71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f2: 72*9880d681SAndroid Build Coastguard Worker; CHECK: mvc [[OFFSET1:16[04]]](4,%r15), [[OFFSET2:[0-9]+]]({{%r[0-9]+}}) 73*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 74*9880d681SAndroid Build Coastguard Worker; CHECK: mvc [[OFFSET2]](4,{{%r[0-9]+}}), [[OFFSET1]](%r15) 75*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 76*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr i32, i32 *%ptr0, i64 2 77*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr0, i64 4 78*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr i32, i32 *%ptr0, i64 6 79*9880d681SAndroid Build Coastguard Worker %ptr4 = getelementptr i32, i32 *%ptr0, i64 8 80*9880d681SAndroid Build Coastguard Worker %ptr5 = getelementptr i32, i32 *%ptr0, i64 10 81*9880d681SAndroid Build Coastguard Worker %ptr6 = getelementptr i32, i32 *%ptr0, i64 12 82*9880d681SAndroid Build Coastguard Worker %ptr7 = getelementptr i32, i32 *%ptr0, i64 14 83*9880d681SAndroid Build Coastguard Worker %ptr8 = getelementptr i32, i32 *%ptr0, i64 16 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker %val0 = load i32 , i32 *%ptr0 86*9880d681SAndroid Build Coastguard Worker %val1 = load i32 , i32 *%ptr1 87*9880d681SAndroid Build Coastguard Worker %val2 = load i32 , i32 *%ptr2 88*9880d681SAndroid Build Coastguard Worker %val3 = load i32 , i32 *%ptr3 89*9880d681SAndroid Build Coastguard Worker %val4 = load i32 , i32 *%ptr4 90*9880d681SAndroid Build Coastguard Worker %val5 = load i32 , i32 *%ptr5 91*9880d681SAndroid Build Coastguard Worker %val6 = load i32 , i32 *%ptr6 92*9880d681SAndroid Build Coastguard Worker %val7 = load i32 , i32 *%ptr7 93*9880d681SAndroid Build Coastguard Worker %val8 = load i32 , i32 *%ptr8 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker call void @foo() 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker store i32 %val0, i32 *%ptr0 98*9880d681SAndroid Build Coastguard Worker store i32 %val1, i32 *%ptr1 99*9880d681SAndroid Build Coastguard Worker store i32 %val2, i32 *%ptr2 100*9880d681SAndroid Build Coastguard Worker store i32 %val3, i32 *%ptr3 101*9880d681SAndroid Build Coastguard Worker store i32 %val4, i32 *%ptr4 102*9880d681SAndroid Build Coastguard Worker store i32 %val5, i32 *%ptr5 103*9880d681SAndroid Build Coastguard Worker store i32 %val6, i32 *%ptr6 104*9880d681SAndroid Build Coastguard Worker store i32 %val7, i32 *%ptr7 105*9880d681SAndroid Build Coastguard Worker store i32 %val8, i32 *%ptr8 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker ret void 108*9880d681SAndroid Build Coastguard Worker} 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; Test a case where at least one i64 load and at least one i64 store 111*9880d681SAndroid Build Coastguard Worker; need spills. 112*9880d681SAndroid Build Coastguard Workerdefine void @f3(i64 *%ptr0) { 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f3: 114*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 160(8,%r15), [[OFFSET:[0-9]+]]({{%r[0-9]+}}) 115*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 116*9880d681SAndroid Build Coastguard Worker; CHECK: mvc [[OFFSET]](8,{{%r[0-9]+}}), 160(%r15) 117*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 118*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr i64, i64 *%ptr0, i64 2 119*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i64, i64 *%ptr0, i64 4 120*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr i64, i64 *%ptr0, i64 6 121*9880d681SAndroid Build Coastguard Worker %ptr4 = getelementptr i64, i64 *%ptr0, i64 8 122*9880d681SAndroid Build Coastguard Worker %ptr5 = getelementptr i64, i64 *%ptr0, i64 10 123*9880d681SAndroid Build Coastguard Worker %ptr6 = getelementptr i64, i64 *%ptr0, i64 12 124*9880d681SAndroid Build Coastguard Worker %ptr7 = getelementptr i64, i64 *%ptr0, i64 14 125*9880d681SAndroid Build Coastguard Worker %ptr8 = getelementptr i64, i64 *%ptr0, i64 16 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker %val0 = load i64 , i64 *%ptr0 128*9880d681SAndroid Build Coastguard Worker %val1 = load i64 , i64 *%ptr1 129*9880d681SAndroid Build Coastguard Worker %val2 = load i64 , i64 *%ptr2 130*9880d681SAndroid Build Coastguard Worker %val3 = load i64 , i64 *%ptr3 131*9880d681SAndroid Build Coastguard Worker %val4 = load i64 , i64 *%ptr4 132*9880d681SAndroid Build Coastguard Worker %val5 = load i64 , i64 *%ptr5 133*9880d681SAndroid Build Coastguard Worker %val6 = load i64 , i64 *%ptr6 134*9880d681SAndroid Build Coastguard Worker %val7 = load i64 , i64 *%ptr7 135*9880d681SAndroid Build Coastguard Worker %val8 = load i64 , i64 *%ptr8 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker call void @foo() 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker store i64 %val0, i64 *%ptr0 140*9880d681SAndroid Build Coastguard Worker store i64 %val1, i64 *%ptr1 141*9880d681SAndroid Build Coastguard Worker store i64 %val2, i64 *%ptr2 142*9880d681SAndroid Build Coastguard Worker store i64 %val3, i64 *%ptr3 143*9880d681SAndroid Build Coastguard Worker store i64 %val4, i64 *%ptr4 144*9880d681SAndroid Build Coastguard Worker store i64 %val5, i64 *%ptr5 145*9880d681SAndroid Build Coastguard Worker store i64 %val6, i64 *%ptr6 146*9880d681SAndroid Build Coastguard Worker store i64 %val7, i64 *%ptr7 147*9880d681SAndroid Build Coastguard Worker store i64 %val8, i64 *%ptr8 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker ret void 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker 153*9880d681SAndroid Build Coastguard Worker; Test a case where at least at least one f32 load and at least one f32 store 154*9880d681SAndroid Build Coastguard Worker; need spills. The 8 call-saved FPRs could be used for 8 of the %vals 155*9880d681SAndroid Build Coastguard Worker; (and are at the time of writing), but it would really be better to use 156*9880d681SAndroid Build Coastguard Worker; MVC for all 10. 157*9880d681SAndroid Build Coastguard Workerdefine void @f4(float *%ptr0) { 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f4: 159*9880d681SAndroid Build Coastguard Worker; CHECK: mvc [[OFFSET1:16[04]]](4,%r15), [[OFFSET2:[0-9]+]]({{%r[0-9]+}}) 160*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 161*9880d681SAndroid Build Coastguard Worker; CHECK: mvc [[OFFSET2]](4,{{%r[0-9]+}}), [[OFFSET1]](%r15) 162*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 163*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr float, float *%ptr0, i64 2 164*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr float, float *%ptr0, i64 4 165*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr float, float *%ptr0, i64 6 166*9880d681SAndroid Build Coastguard Worker %ptr4 = getelementptr float, float *%ptr0, i64 8 167*9880d681SAndroid Build Coastguard Worker %ptr5 = getelementptr float, float *%ptr0, i64 10 168*9880d681SAndroid Build Coastguard Worker %ptr6 = getelementptr float, float *%ptr0, i64 12 169*9880d681SAndroid Build Coastguard Worker %ptr7 = getelementptr float, float *%ptr0, i64 14 170*9880d681SAndroid Build Coastguard Worker %ptr8 = getelementptr float, float *%ptr0, i64 16 171*9880d681SAndroid Build Coastguard Worker %ptr9 = getelementptr float, float *%ptr0, i64 18 172*9880d681SAndroid Build Coastguard Worker 173*9880d681SAndroid Build Coastguard Worker %val0 = load float , float *%ptr0 174*9880d681SAndroid Build Coastguard Worker %val1 = load float , float *%ptr1 175*9880d681SAndroid Build Coastguard Worker %val2 = load float , float *%ptr2 176*9880d681SAndroid Build Coastguard Worker %val3 = load float , float *%ptr3 177*9880d681SAndroid Build Coastguard Worker %val4 = load float , float *%ptr4 178*9880d681SAndroid Build Coastguard Worker %val5 = load float , float *%ptr5 179*9880d681SAndroid Build Coastguard Worker %val6 = load float , float *%ptr6 180*9880d681SAndroid Build Coastguard Worker %val7 = load float , float *%ptr7 181*9880d681SAndroid Build Coastguard Worker %val8 = load float , float *%ptr8 182*9880d681SAndroid Build Coastguard Worker %val9 = load float , float *%ptr9 183*9880d681SAndroid Build Coastguard Worker 184*9880d681SAndroid Build Coastguard Worker call void @foo() 185*9880d681SAndroid Build Coastguard Worker 186*9880d681SAndroid Build Coastguard Worker store float %val0, float *%ptr0 187*9880d681SAndroid Build Coastguard Worker store float %val1, float *%ptr1 188*9880d681SAndroid Build Coastguard Worker store float %val2, float *%ptr2 189*9880d681SAndroid Build Coastguard Worker store float %val3, float *%ptr3 190*9880d681SAndroid Build Coastguard Worker store float %val4, float *%ptr4 191*9880d681SAndroid Build Coastguard Worker store float %val5, float *%ptr5 192*9880d681SAndroid Build Coastguard Worker store float %val6, float *%ptr6 193*9880d681SAndroid Build Coastguard Worker store float %val7, float *%ptr7 194*9880d681SAndroid Build Coastguard Worker store float %val8, float *%ptr8 195*9880d681SAndroid Build Coastguard Worker store float %val9, float *%ptr9 196*9880d681SAndroid Build Coastguard Worker 197*9880d681SAndroid Build Coastguard Worker ret void 198*9880d681SAndroid Build Coastguard Worker} 199*9880d681SAndroid Build Coastguard Worker 200*9880d681SAndroid Build Coastguard Worker; Similarly for f64. 201*9880d681SAndroid Build Coastguard Workerdefine void @f5(double *%ptr0) { 202*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f5: 203*9880d681SAndroid Build Coastguard Worker; CHECK: mvc 160(8,%r15), [[OFFSET:[0-9]+]]({{%r[0-9]+}}) 204*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 205*9880d681SAndroid Build Coastguard Worker; CHECK: mvc [[OFFSET]](8,{{%r[0-9]+}}), 160(%r15) 206*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 207*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr double, double *%ptr0, i64 2 208*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr double, double *%ptr0, i64 4 209*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr double, double *%ptr0, i64 6 210*9880d681SAndroid Build Coastguard Worker %ptr4 = getelementptr double, double *%ptr0, i64 8 211*9880d681SAndroid Build Coastguard Worker %ptr5 = getelementptr double, double *%ptr0, i64 10 212*9880d681SAndroid Build Coastguard Worker %ptr6 = getelementptr double, double *%ptr0, i64 12 213*9880d681SAndroid Build Coastguard Worker %ptr7 = getelementptr double, double *%ptr0, i64 14 214*9880d681SAndroid Build Coastguard Worker %ptr8 = getelementptr double, double *%ptr0, i64 16 215*9880d681SAndroid Build Coastguard Worker %ptr9 = getelementptr double, double *%ptr0, i64 18 216*9880d681SAndroid Build Coastguard Worker 217*9880d681SAndroid Build Coastguard Worker %val0 = load double , double *%ptr0 218*9880d681SAndroid Build Coastguard Worker %val1 = load double , double *%ptr1 219*9880d681SAndroid Build Coastguard Worker %val2 = load double , double *%ptr2 220*9880d681SAndroid Build Coastguard Worker %val3 = load double , double *%ptr3 221*9880d681SAndroid Build Coastguard Worker %val4 = load double , double *%ptr4 222*9880d681SAndroid Build Coastguard Worker %val5 = load double , double *%ptr5 223*9880d681SAndroid Build Coastguard Worker %val6 = load double , double *%ptr6 224*9880d681SAndroid Build Coastguard Worker %val7 = load double , double *%ptr7 225*9880d681SAndroid Build Coastguard Worker %val8 = load double , double *%ptr8 226*9880d681SAndroid Build Coastguard Worker %val9 = load double , double *%ptr9 227*9880d681SAndroid Build Coastguard Worker 228*9880d681SAndroid Build Coastguard Worker call void @foo() 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker store double %val0, double *%ptr0 231*9880d681SAndroid Build Coastguard Worker store double %val1, double *%ptr1 232*9880d681SAndroid Build Coastguard Worker store double %val2, double *%ptr2 233*9880d681SAndroid Build Coastguard Worker store double %val3, double *%ptr3 234*9880d681SAndroid Build Coastguard Worker store double %val4, double *%ptr4 235*9880d681SAndroid Build Coastguard Worker store double %val5, double *%ptr5 236*9880d681SAndroid Build Coastguard Worker store double %val6, double *%ptr6 237*9880d681SAndroid Build Coastguard Worker store double %val7, double *%ptr7 238*9880d681SAndroid Build Coastguard Worker store double %val8, double *%ptr8 239*9880d681SAndroid Build Coastguard Worker store double %val9, double *%ptr9 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Worker ret void 242*9880d681SAndroid Build Coastguard Worker} 243*9880d681SAndroid Build Coastguard Worker 244*9880d681SAndroid Build Coastguard Worker; Repeat f2 with atomic accesses. We shouldn't use MVC here. 245*9880d681SAndroid Build Coastguard Workerdefine void @f6(i32 *%ptr0) { 246*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f6: 247*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 248*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 249*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr i32, i32 *%ptr0, i64 2 250*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr0, i64 4 251*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr i32, i32 *%ptr0, i64 6 252*9880d681SAndroid Build Coastguard Worker %ptr4 = getelementptr i32, i32 *%ptr0, i64 8 253*9880d681SAndroid Build Coastguard Worker %ptr5 = getelementptr i32, i32 *%ptr0, i64 10 254*9880d681SAndroid Build Coastguard Worker %ptr6 = getelementptr i32, i32 *%ptr0, i64 12 255*9880d681SAndroid Build Coastguard Worker %ptr7 = getelementptr i32, i32 *%ptr0, i64 14 256*9880d681SAndroid Build Coastguard Worker %ptr8 = getelementptr i32, i32 *%ptr0, i64 16 257*9880d681SAndroid Build Coastguard Worker 258*9880d681SAndroid Build Coastguard Worker %val0 = load atomic i32 , i32 *%ptr0 unordered, align 4 259*9880d681SAndroid Build Coastguard Worker %val1 = load atomic i32 , i32 *%ptr1 unordered, align 4 260*9880d681SAndroid Build Coastguard Worker %val2 = load atomic i32 , i32 *%ptr2 unordered, align 4 261*9880d681SAndroid Build Coastguard Worker %val3 = load atomic i32 , i32 *%ptr3 unordered, align 4 262*9880d681SAndroid Build Coastguard Worker %val4 = load atomic i32 , i32 *%ptr4 unordered, align 4 263*9880d681SAndroid Build Coastguard Worker %val5 = load atomic i32 , i32 *%ptr5 unordered, align 4 264*9880d681SAndroid Build Coastguard Worker %val6 = load atomic i32 , i32 *%ptr6 unordered, align 4 265*9880d681SAndroid Build Coastguard Worker %val7 = load atomic i32 , i32 *%ptr7 unordered, align 4 266*9880d681SAndroid Build Coastguard Worker %val8 = load atomic i32 , i32 *%ptr8 unordered, align 4 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker call void @foo() 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker store atomic i32 %val0, i32 *%ptr0 unordered, align 4 271*9880d681SAndroid Build Coastguard Worker store atomic i32 %val1, i32 *%ptr1 unordered, align 4 272*9880d681SAndroid Build Coastguard Worker store atomic i32 %val2, i32 *%ptr2 unordered, align 4 273*9880d681SAndroid Build Coastguard Worker store atomic i32 %val3, i32 *%ptr3 unordered, align 4 274*9880d681SAndroid Build Coastguard Worker store atomic i32 %val4, i32 *%ptr4 unordered, align 4 275*9880d681SAndroid Build Coastguard Worker store atomic i32 %val5, i32 *%ptr5 unordered, align 4 276*9880d681SAndroid Build Coastguard Worker store atomic i32 %val6, i32 *%ptr6 unordered, align 4 277*9880d681SAndroid Build Coastguard Worker store atomic i32 %val7, i32 *%ptr7 unordered, align 4 278*9880d681SAndroid Build Coastguard Worker store atomic i32 %val8, i32 *%ptr8 unordered, align 4 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker ret void 281*9880d681SAndroid Build Coastguard Worker} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker; ...likewise volatile accesses. 284*9880d681SAndroid Build Coastguard Workerdefine void @f7(i32 *%ptr0) { 285*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f7: 286*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 287*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 288*9880d681SAndroid Build Coastguard Worker %ptr1 = getelementptr i32, i32 *%ptr0, i64 2 289*9880d681SAndroid Build Coastguard Worker %ptr2 = getelementptr i32, i32 *%ptr0, i64 4 290*9880d681SAndroid Build Coastguard Worker %ptr3 = getelementptr i32, i32 *%ptr0, i64 6 291*9880d681SAndroid Build Coastguard Worker %ptr4 = getelementptr i32, i32 *%ptr0, i64 8 292*9880d681SAndroid Build Coastguard Worker %ptr5 = getelementptr i32, i32 *%ptr0, i64 10 293*9880d681SAndroid Build Coastguard Worker %ptr6 = getelementptr i32, i32 *%ptr0, i64 12 294*9880d681SAndroid Build Coastguard Worker %ptr7 = getelementptr i32, i32 *%ptr0, i64 14 295*9880d681SAndroid Build Coastguard Worker %ptr8 = getelementptr i32, i32 *%ptr0, i64 16 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker %val0 = load volatile i32 , i32 *%ptr0 298*9880d681SAndroid Build Coastguard Worker %val1 = load volatile i32 , i32 *%ptr1 299*9880d681SAndroid Build Coastguard Worker %val2 = load volatile i32 , i32 *%ptr2 300*9880d681SAndroid Build Coastguard Worker %val3 = load volatile i32 , i32 *%ptr3 301*9880d681SAndroid Build Coastguard Worker %val4 = load volatile i32 , i32 *%ptr4 302*9880d681SAndroid Build Coastguard Worker %val5 = load volatile i32 , i32 *%ptr5 303*9880d681SAndroid Build Coastguard Worker %val6 = load volatile i32 , i32 *%ptr6 304*9880d681SAndroid Build Coastguard Worker %val7 = load volatile i32 , i32 *%ptr7 305*9880d681SAndroid Build Coastguard Worker %val8 = load volatile i32 , i32 *%ptr8 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker call void @foo() 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker store volatile i32 %val0, i32 *%ptr0 310*9880d681SAndroid Build Coastguard Worker store volatile i32 %val1, i32 *%ptr1 311*9880d681SAndroid Build Coastguard Worker store volatile i32 %val2, i32 *%ptr2 312*9880d681SAndroid Build Coastguard Worker store volatile i32 %val3, i32 *%ptr3 313*9880d681SAndroid Build Coastguard Worker store volatile i32 %val4, i32 *%ptr4 314*9880d681SAndroid Build Coastguard Worker store volatile i32 %val5, i32 *%ptr5 315*9880d681SAndroid Build Coastguard Worker store volatile i32 %val6, i32 *%ptr6 316*9880d681SAndroid Build Coastguard Worker store volatile i32 %val7, i32 *%ptr7 317*9880d681SAndroid Build Coastguard Worker store volatile i32 %val8, i32 *%ptr8 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker ret void 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker; Check that LRL and STRL are not converted. 323*9880d681SAndroid Build Coastguard Workerdefine void @f8() { 324*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f8: 325*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 326*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 327*9880d681SAndroid Build Coastguard Worker %val0 = load i32 , i32 *@g0 328*9880d681SAndroid Build Coastguard Worker %val1 = load i32 , i32 *@g1 329*9880d681SAndroid Build Coastguard Worker %val2 = load i32 , i32 *@g2 330*9880d681SAndroid Build Coastguard Worker %val3 = load i32 , i32 *@g3 331*9880d681SAndroid Build Coastguard Worker %val4 = load i32 , i32 *@g4 332*9880d681SAndroid Build Coastguard Worker %val5 = load i32 , i32 *@g5 333*9880d681SAndroid Build Coastguard Worker %val6 = load i32 , i32 *@g6 334*9880d681SAndroid Build Coastguard Worker %val7 = load i32 , i32 *@g7 335*9880d681SAndroid Build Coastguard Worker %val8 = load i32 , i32 *@g8 336*9880d681SAndroid Build Coastguard Worker %val9 = load i32 , i32 *@g9 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker call void @foo() 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Worker store i32 %val0, i32 *@g0 341*9880d681SAndroid Build Coastguard Worker store i32 %val1, i32 *@g1 342*9880d681SAndroid Build Coastguard Worker store i32 %val2, i32 *@g2 343*9880d681SAndroid Build Coastguard Worker store i32 %val3, i32 *@g3 344*9880d681SAndroid Build Coastguard Worker store i32 %val4, i32 *@g4 345*9880d681SAndroid Build Coastguard Worker store i32 %val5, i32 *@g5 346*9880d681SAndroid Build Coastguard Worker store i32 %val6, i32 *@g6 347*9880d681SAndroid Build Coastguard Worker store i32 %val7, i32 *@g7 348*9880d681SAndroid Build Coastguard Worker store i32 %val8, i32 *@g8 349*9880d681SAndroid Build Coastguard Worker store i32 %val9, i32 *@g9 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Worker ret void 352*9880d681SAndroid Build Coastguard Worker} 353*9880d681SAndroid Build Coastguard Worker 354*9880d681SAndroid Build Coastguard Worker; Likewise LGRL and STGRL. 355*9880d681SAndroid Build Coastguard Workerdefine void @f9() { 356*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f9: 357*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc 358*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 359*9880d681SAndroid Build Coastguard Worker %val0 = load i64 , i64 *@h0 360*9880d681SAndroid Build Coastguard Worker %val1 = load i64 , i64 *@h1 361*9880d681SAndroid Build Coastguard Worker %val2 = load i64 , i64 *@h2 362*9880d681SAndroid Build Coastguard Worker %val3 = load i64 , i64 *@h3 363*9880d681SAndroid Build Coastguard Worker %val4 = load i64 , i64 *@h4 364*9880d681SAndroid Build Coastguard Worker %val5 = load i64 , i64 *@h5 365*9880d681SAndroid Build Coastguard Worker %val6 = load i64 , i64 *@h6 366*9880d681SAndroid Build Coastguard Worker %val7 = load i64 , i64 *@h7 367*9880d681SAndroid Build Coastguard Worker %val8 = load i64 , i64 *@h8 368*9880d681SAndroid Build Coastguard Worker %val9 = load i64 , i64 *@h9 369*9880d681SAndroid Build Coastguard Worker 370*9880d681SAndroid Build Coastguard Worker call void @foo() 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Worker store i64 %val0, i64 *@h0 373*9880d681SAndroid Build Coastguard Worker store i64 %val1, i64 *@h1 374*9880d681SAndroid Build Coastguard Worker store i64 %val2, i64 *@h2 375*9880d681SAndroid Build Coastguard Worker store i64 %val3, i64 *@h3 376*9880d681SAndroid Build Coastguard Worker store i64 %val4, i64 *@h4 377*9880d681SAndroid Build Coastguard Worker store i64 %val5, i64 *@h5 378*9880d681SAndroid Build Coastguard Worker store i64 %val6, i64 *@h6 379*9880d681SAndroid Build Coastguard Worker store i64 %val7, i64 *@h7 380*9880d681SAndroid Build Coastguard Worker store i64 %val8, i64 *@h8 381*9880d681SAndroid Build Coastguard Worker store i64 %val9, i64 *@h9 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Worker ret void 384*9880d681SAndroid Build Coastguard Worker} 385*9880d681SAndroid Build Coastguard Worker 386*9880d681SAndroid Build Coastguard Worker; This showed a problem with the way stack coloring updated instructions. 387*9880d681SAndroid Build Coastguard Worker; The copy from %val9 to %newval8 can be done using an MVC, which then 388*9880d681SAndroid Build Coastguard Worker; has two frame index operands. Stack coloring chose a valid renumbering 389*9880d681SAndroid Build Coastguard Worker; [FI0, FI1] -> [FI1, FI2], but applied it in the form FI0 -> FI1 -> FI2, 390*9880d681SAndroid Build Coastguard Worker; so that both operands ended up being the same. 391*9880d681SAndroid Build Coastguard Workerdefine void @f10() { 392*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f10: 393*9880d681SAndroid Build Coastguard Worker; CHECK: lgrl [[REG:%r[0-9]+]], h9 394*9880d681SAndroid Build Coastguard Worker; CHECK: stg [[REG]], [[VAL9:[0-9]+]](%r15) 395*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 396*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 397*9880d681SAndroid Build Coastguard Worker; CHECK: mvc [[NEWVAL8:[0-9]+]](8,%r15), [[VAL9]](%r15) 398*9880d681SAndroid Build Coastguard Worker; CHECK: brasl %r14, foo@PLT 399*9880d681SAndroid Build Coastguard Worker; CHECK: lg [[REG:%r[0-9]+]], [[NEWVAL8]](%r15) 400*9880d681SAndroid Build Coastguard Worker; CHECK: stgrl [[REG]], h8 401*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 402*9880d681SAndroid Build Coastguard Workerentry: 403*9880d681SAndroid Build Coastguard Worker %val8 = load volatile i64 , i64 *@h8 404*9880d681SAndroid Build Coastguard Worker %val0 = load volatile i64 , i64 *@h0 405*9880d681SAndroid Build Coastguard Worker %val1 = load volatile i64 , i64 *@h1 406*9880d681SAndroid Build Coastguard Worker %val2 = load volatile i64 , i64 *@h2 407*9880d681SAndroid Build Coastguard Worker %val3 = load volatile i64 , i64 *@h3 408*9880d681SAndroid Build Coastguard Worker %val4 = load volatile i64 , i64 *@h4 409*9880d681SAndroid Build Coastguard Worker %val5 = load volatile i64 , i64 *@h5 410*9880d681SAndroid Build Coastguard Worker %val6 = load volatile i64 , i64 *@h6 411*9880d681SAndroid Build Coastguard Worker %val7 = load volatile i64 , i64 *@h7 412*9880d681SAndroid Build Coastguard Worker %val9 = load volatile i64 , i64 *@h9 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Worker call void @foo() 415*9880d681SAndroid Build Coastguard Worker 416*9880d681SAndroid Build Coastguard Worker store volatile i64 %val0, i64 *@h0 417*9880d681SAndroid Build Coastguard Worker store volatile i64 %val1, i64 *@h1 418*9880d681SAndroid Build Coastguard Worker store volatile i64 %val2, i64 *@h2 419*9880d681SAndroid Build Coastguard Worker store volatile i64 %val3, i64 *@h3 420*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4, i64 *@h4 421*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64 *@h5 422*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64 *@h6 423*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64 *@h7 424*9880d681SAndroid Build Coastguard Worker 425*9880d681SAndroid Build Coastguard Worker %check = load volatile i64 , i64 *@h0 426*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %check, 0 427*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %skip, label %fallthru 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Workerfallthru: 430*9880d681SAndroid Build Coastguard Worker call void @foo() 431*9880d681SAndroid Build Coastguard Worker 432*9880d681SAndroid Build Coastguard Worker store volatile i64 %val0, i64 *@h0 433*9880d681SAndroid Build Coastguard Worker store volatile i64 %val1, i64 *@h1 434*9880d681SAndroid Build Coastguard Worker store volatile i64 %val2, i64 *@h2 435*9880d681SAndroid Build Coastguard Worker store volatile i64 %val3, i64 *@h3 436*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4, i64 *@h4 437*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64 *@h5 438*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64 *@h6 439*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64 *@h7 440*9880d681SAndroid Build Coastguard Worker store volatile i64 %val8, i64 *@h8 441*9880d681SAndroid Build Coastguard Worker br label %skip 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Workerskip: 444*9880d681SAndroid Build Coastguard Worker %newval8 = phi i64 [ %val8, %entry ], [ %val9, %fallthru ] 445*9880d681SAndroid Build Coastguard Worker call void @foo() 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker store volatile i64 %val0, i64 *@h0 448*9880d681SAndroid Build Coastguard Worker store volatile i64 %val1, i64 *@h1 449*9880d681SAndroid Build Coastguard Worker store volatile i64 %val2, i64 *@h2 450*9880d681SAndroid Build Coastguard Worker store volatile i64 %val3, i64 *@h3 451*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4, i64 *@h4 452*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64 *@h5 453*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64 *@h6 454*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64 *@h7 455*9880d681SAndroid Build Coastguard Worker store volatile i64 %newval8, i64 *@h8 456*9880d681SAndroid Build Coastguard Worker store volatile i64 %val9, i64 *@h9 457*9880d681SAndroid Build Coastguard Worker 458*9880d681SAndroid Build Coastguard Worker ret void 459*9880d681SAndroid Build Coastguard Worker} 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker; This used to generate a no-op MVC. It is very sensitive to spill heuristics. 462*9880d681SAndroid Build Coastguard Workerdefine void @f11() { 463*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f11: 464*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: mvc [[OFFSET:[0-9]+]](8,%r15), [[OFFSET]](%r15) 465*9880d681SAndroid Build Coastguard Worker; CHECK: br %r14 466*9880d681SAndroid Build Coastguard Workerentry: 467*9880d681SAndroid Build Coastguard Worker %val0 = load volatile i64 , i64 *@h0 468*9880d681SAndroid Build Coastguard Worker %val1 = load volatile i64 , i64 *@h1 469*9880d681SAndroid Build Coastguard Worker %val2 = load volatile i64 , i64 *@h2 470*9880d681SAndroid Build Coastguard Worker %val3 = load volatile i64 , i64 *@h3 471*9880d681SAndroid Build Coastguard Worker %val4 = load volatile i64 , i64 *@h4 472*9880d681SAndroid Build Coastguard Worker %val5 = load volatile i64 , i64 *@h5 473*9880d681SAndroid Build Coastguard Worker %val6 = load volatile i64 , i64 *@h6 474*9880d681SAndroid Build Coastguard Worker %val7 = load volatile i64 , i64 *@h7 475*9880d681SAndroid Build Coastguard Worker 476*9880d681SAndroid Build Coastguard Worker %altval0 = load volatile i64 , i64 *@h0 477*9880d681SAndroid Build Coastguard Worker %altval1 = load volatile i64 , i64 *@h1 478*9880d681SAndroid Build Coastguard Worker 479*9880d681SAndroid Build Coastguard Worker call void @foo() 480*9880d681SAndroid Build Coastguard Worker 481*9880d681SAndroid Build Coastguard Worker store volatile i64 %val0, i64 *@h0 482*9880d681SAndroid Build Coastguard Worker store volatile i64 %val1, i64 *@h1 483*9880d681SAndroid Build Coastguard Worker store volatile i64 %val2, i64 *@h2 484*9880d681SAndroid Build Coastguard Worker store volatile i64 %val3, i64 *@h3 485*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4, i64 *@h4 486*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64 *@h5 487*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64 *@h6 488*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64 *@h7 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Worker %check = load volatile i64 , i64 *@h0 491*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i64 %check, 0 492*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %a1, label %b1 493*9880d681SAndroid Build Coastguard Worker 494*9880d681SAndroid Build Coastguard Workera1: 495*9880d681SAndroid Build Coastguard Worker call void @foo() 496*9880d681SAndroid Build Coastguard Worker br label %join1 497*9880d681SAndroid Build Coastguard Worker 498*9880d681SAndroid Build Coastguard Workerb1: 499*9880d681SAndroid Build Coastguard Worker call void @foo() 500*9880d681SAndroid Build Coastguard Worker br label %join1 501*9880d681SAndroid Build Coastguard Worker 502*9880d681SAndroid Build Coastguard Workerjoin1: 503*9880d681SAndroid Build Coastguard Worker %newval0 = phi i64 [ %val0, %a1 ], [ %altval0, %b1 ] 504*9880d681SAndroid Build Coastguard Worker 505*9880d681SAndroid Build Coastguard Worker call void @foo() 506*9880d681SAndroid Build Coastguard Worker 507*9880d681SAndroid Build Coastguard Worker store volatile i64 %val1, i64 *@h1 508*9880d681SAndroid Build Coastguard Worker store volatile i64 %val2, i64 *@h2 509*9880d681SAndroid Build Coastguard Worker store volatile i64 %val3, i64 *@h3 510*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4, i64 *@h4 511*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64 *@h5 512*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64 *@h6 513*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64 *@h7 514*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %a2, label %b2 515*9880d681SAndroid Build Coastguard Worker 516*9880d681SAndroid Build Coastguard Workera2: 517*9880d681SAndroid Build Coastguard Worker call void @foo() 518*9880d681SAndroid Build Coastguard Worker br label %join2 519*9880d681SAndroid Build Coastguard Worker 520*9880d681SAndroid Build Coastguard Workerb2: 521*9880d681SAndroid Build Coastguard Worker call void @foo() 522*9880d681SAndroid Build Coastguard Worker br label %join2 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Workerjoin2: 525*9880d681SAndroid Build Coastguard Worker %newval1 = phi i64 [ %val1, %a2 ], [ %altval1, %b2 ] 526*9880d681SAndroid Build Coastguard Worker 527*9880d681SAndroid Build Coastguard Worker call void @foo() 528*9880d681SAndroid Build Coastguard Worker 529*9880d681SAndroid Build Coastguard Worker store volatile i64 %val2, i64 *@h2 530*9880d681SAndroid Build Coastguard Worker store volatile i64 %val3, i64 *@h3 531*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4, i64 *@h4 532*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64 *@h5 533*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64 *@h6 534*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64 *@h7 535*9880d681SAndroid Build Coastguard Worker 536*9880d681SAndroid Build Coastguard Worker call void @foo() 537*9880d681SAndroid Build Coastguard Worker 538*9880d681SAndroid Build Coastguard Worker store volatile i64 %newval0, i64 *@h0 539*9880d681SAndroid Build Coastguard Worker store volatile i64 %newval1, i64 *@h1 540*9880d681SAndroid Build Coastguard Worker store volatile i64 %val2, i64 *@h2 541*9880d681SAndroid Build Coastguard Worker store volatile i64 %val3, i64 *@h3 542*9880d681SAndroid Build Coastguard Worker store volatile i64 %val4, i64 *@h4 543*9880d681SAndroid Build Coastguard Worker store volatile i64 %val5, i64 *@h5 544*9880d681SAndroid Build Coastguard Worker store volatile i64 %val6, i64 *@h6 545*9880d681SAndroid Build Coastguard Worker store volatile i64 %val7, i64 *@h7 546*9880d681SAndroid Build Coastguard Worker 547*9880d681SAndroid Build Coastguard Worker ret void 548*9880d681SAndroid Build Coastguard Worker} 549