1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -verify-machineinstrs | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_int 4*9880d681SAndroid Build Coastguard Worker; CHECK: ldp 5*9880d681SAndroid Build Coastguard Workerdefine i32 @ldp_int(i32* %p) nounwind { 6*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %p, align 4 7*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 8*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr, align 4 9*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %tmp1, %tmp 10*9880d681SAndroid Build Coastguard Worker ret i32 %add 11*9880d681SAndroid Build Coastguard Worker} 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_sext_int 14*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw 15*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_sext_int(i32* %p) nounwind { 16*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %p, align 4 17*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 18*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr, align 4 19*9880d681SAndroid Build Coastguard Worker %sexttmp = sext i32 %tmp to i64 20*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 21*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %sexttmp1, %sexttmp 22*9880d681SAndroid Build Coastguard Worker ret i64 %add 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_half_sext_res0_int: 26*9880d681SAndroid Build Coastguard Worker; CHECK: ldp w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0] 27*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw x[[DST1]], w[[DST1]] 28*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_half_sext_res0_int(i32* %p) nounwind { 29*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %p, align 4 30*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 31*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr, align 4 32*9880d681SAndroid Build Coastguard Worker %sexttmp = sext i32 %tmp to i64 33*9880d681SAndroid Build Coastguard Worker %sexttmp1 = zext i32 %tmp1 to i64 34*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %sexttmp1, %sexttmp 35*9880d681SAndroid Build Coastguard Worker ret i64 %add 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_half_sext_res1_int: 39*9880d681SAndroid Build Coastguard Worker; CHECK: ldp w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0] 40*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw x[[DST2]], w[[DST2]] 41*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_half_sext_res1_int(i32* %p) nounwind { 42*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %p, align 4 43*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 44*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr, align 4 45*9880d681SAndroid Build Coastguard Worker %sexttmp = zext i32 %tmp to i64 46*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 47*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %sexttmp1, %sexttmp 48*9880d681SAndroid Build Coastguard Worker ret i64 %add 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_long 53*9880d681SAndroid Build Coastguard Worker; CHECK: ldp 54*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_long(i64* %p) nounwind { 55*9880d681SAndroid Build Coastguard Worker %tmp = load i64, i64* %p, align 8 56*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i64, i64* %p, i64 1 57*9880d681SAndroid Build Coastguard Worker %tmp1 = load i64, i64* %add.ptr, align 8 58*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %tmp1, %tmp 59*9880d681SAndroid Build Coastguard Worker ret i64 %add 60*9880d681SAndroid Build Coastguard Worker} 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_float 63*9880d681SAndroid Build Coastguard Worker; CHECK: ldp 64*9880d681SAndroid Build Coastguard Workerdefine float @ldp_float(float* %p) nounwind { 65*9880d681SAndroid Build Coastguard Worker %tmp = load float, float* %p, align 4 66*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds float, float* %p, i64 1 67*9880d681SAndroid Build Coastguard Worker %tmp1 = load float, float* %add.ptr, align 4 68*9880d681SAndroid Build Coastguard Worker %add = fadd float %tmp, %tmp1 69*9880d681SAndroid Build Coastguard Worker ret float %add 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_double 73*9880d681SAndroid Build Coastguard Worker; CHECK: ldp 74*9880d681SAndroid Build Coastguard Workerdefine double @ldp_double(double* %p) nounwind { 75*9880d681SAndroid Build Coastguard Worker %tmp = load double, double* %p, align 8 76*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds double, double* %p, i64 1 77*9880d681SAndroid Build Coastguard Worker %tmp1 = load double, double* %add.ptr, align 8 78*9880d681SAndroid Build Coastguard Worker %add = fadd double %tmp, %tmp1 79*9880d681SAndroid Build Coastguard Worker ret double %add 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; Test the load/store optimizer---combine ldurs into a ldp, if appropriate 83*9880d681SAndroid Build Coastguard Workerdefine i32 @ldur_int(i32* %a) nounwind { 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_int 85*9880d681SAndroid Build Coastguard Worker; CHECK: ldp [[DST1:w[0-9]+]], [[DST2:w[0-9]+]], [x0, #-8] 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add w{{[0-9]+}}, [[DST2]], [[DST1]] 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 88*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i32 -1 89*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 90*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i32 -2 91*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 92*9880d681SAndroid Build Coastguard Worker %tmp3 = add i32 %tmp1, %tmp2 93*9880d681SAndroid Build Coastguard Worker ret i32 %tmp3 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerdefine i64 @ldur_sext_int(i32* %a) nounwind { 97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_sext_int 98*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw [[DST1:x[0-9]+]], [[DST2:x[0-9]+]], [x0, #-8] 99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x{{[0-9]+}}, [[DST2]], [[DST1]] 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 101*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i32 -1 102*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 103*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i32 -2 104*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 105*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 106*9880d681SAndroid Build Coastguard Worker %sexttmp2 = sext i32 %tmp2 to i64 107*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %sexttmp1, %sexttmp2 108*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 109*9880d681SAndroid Build Coastguard Worker} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workerdefine i64 @ldur_half_sext_int_res0(i32* %a) nounwind { 112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_half_sext_int_res0 113*9880d681SAndroid Build Coastguard Worker; CHECK: ldp w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0, #-8] 114*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw x[[DST1]], w[[DST1]] 115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x{{[0-9]+}}, x[[DST2]], x[[DST1]] 116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 117*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i32 -1 118*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 119*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i32 -2 120*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 121*9880d681SAndroid Build Coastguard Worker %sexttmp1 = zext i32 %tmp1 to i64 122*9880d681SAndroid Build Coastguard Worker %sexttmp2 = sext i32 %tmp2 to i64 123*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %sexttmp1, %sexttmp2 124*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Workerdefine i64 @ldur_half_sext_int_res1(i32* %a) nounwind { 128*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_half_sext_int_res1 129*9880d681SAndroid Build Coastguard Worker; CHECK: ldp w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0, #-8] 130*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw x[[DST2]], w[[DST2]] 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x{{[0-9]+}}, x[[DST2]], x[[DST1]] 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 133*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i32 -1 134*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 135*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i32 -2 136*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 137*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 138*9880d681SAndroid Build Coastguard Worker %sexttmp2 = zext i32 %tmp2 to i64 139*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %sexttmp1, %sexttmp2 140*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 141*9880d681SAndroid Build Coastguard Worker} 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Workerdefine i64 @ldur_long(i64* %a) nounwind ssp { 145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_long 146*9880d681SAndroid Build Coastguard Worker; CHECK: ldp [[DST1:x[0-9]+]], [[DST2:x[0-9]+]], [x0, #-16] 147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x{{[0-9]+}}, [[DST2]], [[DST1]] 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 149*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i64, i64* %a, i64 -1 150*9880d681SAndroid Build Coastguard Worker %tmp1 = load i64, i64* %p1, align 2 151*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i64, i64* %a, i64 -2 152*9880d681SAndroid Build Coastguard Worker %tmp2 = load i64, i64* %p2, align 2 153*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %tmp1, %tmp2 154*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Workerdefine float @ldur_float(float* %a) { 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_float 159*9880d681SAndroid Build Coastguard Worker; CHECK: ldp [[DST1:s[0-9]+]], [[DST2:s[0-9]+]], [x0, #-8] 160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add s{{[0-9]+}}, [[DST2]], [[DST1]] 161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 162*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds float, float* %a, i64 -1 163*9880d681SAndroid Build Coastguard Worker %tmp1 = load float, float* %p1, align 2 164*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds float, float* %a, i64 -2 165*9880d681SAndroid Build Coastguard Worker %tmp2 = load float, float* %p2, align 2 166*9880d681SAndroid Build Coastguard Worker %tmp3 = fadd float %tmp1, %tmp2 167*9880d681SAndroid Build Coastguard Worker ret float %tmp3 168*9880d681SAndroid Build Coastguard Worker} 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerdefine double @ldur_double(double* %a) { 171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldur_double 172*9880d681SAndroid Build Coastguard Worker; CHECK: ldp [[DST1:d[0-9]+]], [[DST2:d[0-9]+]], [x0, #-16] 173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add d{{[0-9]+}}, [[DST2]], [[DST1]] 174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 175*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds double, double* %a, i64 -1 176*9880d681SAndroid Build Coastguard Worker %tmp1 = load double, double* %p1, align 2 177*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds double, double* %a, i64 -2 178*9880d681SAndroid Build Coastguard Worker %tmp2 = load double, double* %p2, align 2 179*9880d681SAndroid Build Coastguard Worker %tmp3 = fadd double %tmp1, %tmp2 180*9880d681SAndroid Build Coastguard Worker ret double %tmp3 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker; Now check some boundary conditions 184*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyIn(i64* %a) nounwind ssp { 185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyIn 186*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldur 187*9880d681SAndroid Build Coastguard Worker; CHECK: ldp [[DST1:x[0-9]+]], [[DST2:x[0-9]+]], [x0, #-256] 188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x{{[0-9]+}}, [[DST2]], [[DST1]] 189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 190*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i64, i64* %a, i64 -31 191*9880d681SAndroid Build Coastguard Worker %tmp1 = load i64, i64* %p1, align 2 192*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i64, i64* %a, i64 -32 193*9880d681SAndroid Build Coastguard Worker %tmp2 = load i64, i64* %p2, align 2 194*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %tmp1, %tmp2 195*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyInSext(i32* %a) nounwind ssp { 199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyInSext 200*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldur 201*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw [[DST1:x[0-9]+]], [[DST2:x[0-9]+]], [x0, #-256] 202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x{{[0-9]+}}, [[DST2]], [[DST1]] 203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 204*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i64 -63 205*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 206*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i64 -64 207*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 208*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 209*9880d681SAndroid Build Coastguard Worker %sexttmp2 = sext i32 %tmp2 to i64 210*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %sexttmp1, %sexttmp2 211*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 212*9880d681SAndroid Build Coastguard Worker} 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyInHalfSextRes0(i32* %a) nounwind ssp { 215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyInHalfSextRes0 216*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldur 217*9880d681SAndroid Build Coastguard Worker; CHECK: ldp w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0, #-256] 218*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw x[[DST1]], w[[DST1]] 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x{{[0-9]+}}, x[[DST2]], x[[DST1]] 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 221*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i64 -63 222*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 223*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i64 -64 224*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 225*9880d681SAndroid Build Coastguard Worker %sexttmp1 = zext i32 %tmp1 to i64 226*9880d681SAndroid Build Coastguard Worker %sexttmp2 = sext i32 %tmp2 to i64 227*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %sexttmp1, %sexttmp2 228*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 229*9880d681SAndroid Build Coastguard Worker} 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyInHalfSextRes1(i32* %a) nounwind ssp { 232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyInHalfSextRes1 233*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldur 234*9880d681SAndroid Build Coastguard Worker; CHECK: ldp w[[DST1:[0-9]+]], w[[DST2:[0-9]+]], [x0, #-256] 235*9880d681SAndroid Build Coastguard Worker; CHECK: sxtw x[[DST2]], w[[DST2]] 236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add x{{[0-9]+}}, x[[DST2]], x[[DST1]] 237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 238*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i64 -63 239*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 240*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i64 -64 241*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 242*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 243*9880d681SAndroid Build Coastguard Worker %sexttmp2 = zext i32 %tmp2 to i64 244*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %sexttmp1, %sexttmp2 245*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 246*9880d681SAndroid Build Coastguard Worker} 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyOut(i64* %a) nounwind ssp { 249*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyOut 250*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldp 251*9880d681SAndroid Build Coastguard Worker; Don't be fragile about which loads or manipulations of the base register 252*9880d681SAndroid Build Coastguard Worker; are used---just check that there isn't an ldp before the add 253*9880d681SAndroid Build Coastguard Worker; CHECK: add 254*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 255*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i64, i64* %a, i64 -32 256*9880d681SAndroid Build Coastguard Worker %tmp1 = load i64, i64* %p1, align 2 257*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i64, i64* %a, i64 -33 258*9880d681SAndroid Build Coastguard Worker %tmp2 = load i64, i64* %p2, align 2 259*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %tmp1, %tmp2 260*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 261*9880d681SAndroid Build Coastguard Worker} 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpBarelyOutSext(i32* %a) nounwind ssp { 264*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpBarelyOutSext 265*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldp 266*9880d681SAndroid Build Coastguard Worker; Don't be fragile about which loads or manipulations of the base register 267*9880d681SAndroid Build Coastguard Worker; are used---just check that there isn't an ldp before the add 268*9880d681SAndroid Build Coastguard Worker; CHECK: add 269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 270*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i64 -64 271*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %p1, align 2 272*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i64 -65 273*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %p2, align 2 274*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 275*9880d681SAndroid Build Coastguard Worker %sexttmp2 = sext i32 %tmp2 to i64 276*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %sexttmp1, %sexttmp2 277*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 278*9880d681SAndroid Build Coastguard Worker} 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpNotAligned(i64* %a) nounwind ssp { 281*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpNotAligned 282*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldp 283*9880d681SAndroid Build Coastguard Worker; CHECK: ldur 284*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldur 285*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add 286*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 287*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i64, i64* %a, i64 -18 288*9880d681SAndroid Build Coastguard Worker %bp1 = bitcast i64* %p1 to i8* 289*9880d681SAndroid Build Coastguard Worker %bp1p1 = getelementptr inbounds i8, i8* %bp1, i64 1 290*9880d681SAndroid Build Coastguard Worker %dp1 = bitcast i8* %bp1p1 to i64* 291*9880d681SAndroid Build Coastguard Worker %tmp1 = load i64, i64* %dp1, align 1 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i64, i64* %a, i64 -17 294*9880d681SAndroid Build Coastguard Worker %bp2 = bitcast i64* %p2 to i8* 295*9880d681SAndroid Build Coastguard Worker %bp2p1 = getelementptr inbounds i8, i8* %bp2, i64 1 296*9880d681SAndroid Build Coastguard Worker %dp2 = bitcast i8* %bp2p1 to i64* 297*9880d681SAndroid Build Coastguard Worker %tmp2 = load i64, i64* %dp2, align 1 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %tmp1, %tmp2 300*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 301*9880d681SAndroid Build Coastguard Worker} 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Workerdefine i64 @pairUpNotAlignedSext(i32* %a) nounwind ssp { 304*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pairUpNotAlignedSext 305*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ldp 306*9880d681SAndroid Build Coastguard Worker; CHECK: ldursw 307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ldursw 308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add 309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 310*9880d681SAndroid Build Coastguard Worker %p1 = getelementptr inbounds i32, i32* %a, i64 -18 311*9880d681SAndroid Build Coastguard Worker %bp1 = bitcast i32* %p1 to i8* 312*9880d681SAndroid Build Coastguard Worker %bp1p1 = getelementptr inbounds i8, i8* %bp1, i64 1 313*9880d681SAndroid Build Coastguard Worker %dp1 = bitcast i8* %bp1p1 to i32* 314*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %dp1, align 1 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker %p2 = getelementptr inbounds i32, i32* %a, i64 -17 317*9880d681SAndroid Build Coastguard Worker %bp2 = bitcast i32* %p2 to i8* 318*9880d681SAndroid Build Coastguard Worker %bp2p1 = getelementptr inbounds i8, i8* %bp2, i64 1 319*9880d681SAndroid Build Coastguard Worker %dp2 = bitcast i8* %bp2p1 to i32* 320*9880d681SAndroid Build Coastguard Worker %tmp2 = load i32, i32* %dp2, align 1 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 323*9880d681SAndroid Build Coastguard Worker %sexttmp2 = sext i32 %tmp2 to i64 324*9880d681SAndroid Build Coastguard Worker %tmp3 = add i64 %sexttmp1, %sexttmp2 325*9880d681SAndroid Build Coastguard Worker ret i64 %tmp3 326*9880d681SAndroid Build Coastguard Worker} 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Workerdeclare void @use-ptr(i32*) 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_sext_int_pre 331*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw x{{[0-9]+}}, x{{[0-9]+}}, [x{{[0-9]+}}, #8] 332*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_sext_int_pre(i32* %p) nounwind { 333*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i32, i32* %p, i64 2 334*9880d681SAndroid Build Coastguard Worker call void @use-ptr(i32* %ptr) 335*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %ptr, i64 0 336*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %add.ptr, align 4 337*9880d681SAndroid Build Coastguard Worker %add.ptr1 = getelementptr inbounds i32, i32* %ptr, i64 1 338*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr1, align 4 339*9880d681SAndroid Build Coastguard Worker %sexttmp = sext i32 %tmp to i64 340*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 341*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %sexttmp1, %sexttmp 342*9880d681SAndroid Build Coastguard Worker ret i64 %add 343*9880d681SAndroid Build Coastguard Worker} 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldp_sext_int_post 346*9880d681SAndroid Build Coastguard Worker; CHECK: ldpsw x{{[0-9]+}}, x{{[0-9]+}}, [x0], #8 347*9880d681SAndroid Build Coastguard Workerdefine i64 @ldp_sext_int_post(i32* %p) nounwind { 348*9880d681SAndroid Build Coastguard Worker %tmp = load i32, i32* %p, align 4 349*9880d681SAndroid Build Coastguard Worker %add.ptr = getelementptr inbounds i32, i32* %p, i64 1 350*9880d681SAndroid Build Coastguard Worker %tmp1 = load i32, i32* %add.ptr, align 4 351*9880d681SAndroid Build Coastguard Worker %sexttmp = sext i32 %tmp to i64 352*9880d681SAndroid Build Coastguard Worker %sexttmp1 = sext i32 %tmp1 to i64 353*9880d681SAndroid Build Coastguard Worker %ptr = getelementptr inbounds i32, i32* %add.ptr, i64 1 354*9880d681SAndroid Build Coastguard Worker call void @use-ptr(i32* %ptr) 355*9880d681SAndroid Build Coastguard Worker %add = add nsw i64 %sexttmp1, %sexttmp 356*9880d681SAndroid Build Coastguard Worker ret i64 %add 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359