1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=armv7-apple-ios -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-IOS --check-prefix=CHECK 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=thumbv7m-none-macho -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-DARWIN --check-prefix=CHECK 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-none-eabi -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-EABI --check-prefix=CHECK 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-none-eabihf -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-EABI --check-prefix=CHECK 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-none-androideabi -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-EABI --check-prefix=CHECK 6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-none-gnueabi -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-GNUEABI --check-prefix=CHECK 7*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-none-gnueabihf -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-GNUEABI --check-prefix=CHECK 8*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-none-musleabi -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-GNUEABI --check-prefix=CHECK 9*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=arm-none-musleabihf -disable-post-ra -o - | FileCheck %s --check-prefix=CHECK-GNUEABI --check-prefix=CHECK 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine void @f1(i8* %dest, i8* %src) { 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: f1 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 16*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 17*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove 18*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 19*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 500, i32 0, i1 false) 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 22*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 23*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy 24*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 25*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 500, i32 0, i1 false) 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker ; EABI memset swaps arguments 28*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #1 29*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 30*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #1 31*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 32*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: mov r2, #1 33*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset 34*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: mov r1, #1 35*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 36*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %dest, i8 1, i32 500, i32 0, i1 false) 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker ; EABI uses memclr if value set to 0 39*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #0 40*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 41*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #0 42*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 43*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memclr 44*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 45*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %dest, i8 0, i32 500, i32 0, i1 false) 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker ; EABI uses aligned function variants if possible 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 50*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 51*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove4 52*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 53*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 500, i32 4, i1 false) 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 56*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 57*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy4 58*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 59*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 500, i32 4, i1 false) 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 62*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 63*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset4 64*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 65*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %dest, i8 1, i32 500, i32 4, i1 false) 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 68*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 69*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memclr4 70*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 71*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %dest, i8 0, i32 500, i32 4, i1 false) 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 74*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 75*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove8 76*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 77*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 500, i32 8, i1 false) 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 80*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 81*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy8 82*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 83*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 500, i32 8, i1 false) 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 86*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 87*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset8 88*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 89*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %dest, i8 1, i32 500, i32 8, i1 false) 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 92*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 93*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memclr8 94*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 95*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %dest, i8 0, i32 500, i32 8, i1 false) 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Worker unreachable 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; Check that alloca arguments to memory intrinsics are automatically aligned if at least 8 bytes in size 101*9880d681SAndroid Build Coastguard Workerdefine void @f2(i8* %dest, i32 %n) { 102*9880d681SAndroid Build Coastguard Workerentry: 103*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: f2 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker ; IOS (ARMv7) should 8-byte align, others should 4-byte align 106*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: add r1, sp, #32 107*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 108*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: add r1, sp, #28 109*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 110*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: add r1, sp, #28 111*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove 112*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: add r1, sp, #28 113*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 114*9880d681SAndroid Build Coastguard Worker %arr0 = alloca [9 x i8], align 1 115*9880d681SAndroid Build Coastguard Worker %0 = bitcast [9 x i8]* %arr0 to i8* 116*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %0, i32 %n, i32 0, i1 false) 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker ; CHECK: add r1, sp, #16 119*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 120*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 121*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy 122*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 123*9880d681SAndroid Build Coastguard Worker %arr1 = alloca [9 x i8], align 1 124*9880d681SAndroid Build Coastguard Worker %1 = bitcast [9 x i8]* %arr1 to i8* 125*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %n, i32 0, i1 false) 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r0, sp 128*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #1 129*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 130*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: add r0, sp, #4 131*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #1 132*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 133*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: add r0, sp, #4 134*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: mov r2, #1 135*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset 136*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: add r0, sp, #4 137*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: mov r1, #1 138*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 139*9880d681SAndroid Build Coastguard Worker %arr2 = alloca [9 x i8], align 1 140*9880d681SAndroid Build Coastguard Worker %2 = bitcast [9 x i8]* %arr2 to i8* 141*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %2, i8 1, i32 %n, i32 0, i1 false) 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker unreachable 144*9880d681SAndroid Build Coastguard Worker} 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker; Check that alloca arguments are not aligned if less than 8 bytes in size 147*9880d681SAndroid Build Coastguard Workerdefine void @f3(i8* %dest, i32 %n) { 148*9880d681SAndroid Build Coastguard Workerentry: 149*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: f3 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r1, sp, #17|sub(.w)? r1, r7, #15}} 152*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 153*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 154*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove 155*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 156*9880d681SAndroid Build Coastguard Worker %arr0 = alloca [7 x i8], align 1 157*9880d681SAndroid Build Coastguard Worker %0 = bitcast [7 x i8]* %arr0 to i8* 158*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %0, i32 %n, i32 0, i1 false) 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r1, sp, #10}} 161*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 162*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 163*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy 164*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 165*9880d681SAndroid Build Coastguard Worker %arr1 = alloca [7 x i8], align 1 166*9880d681SAndroid Build Coastguard Worker %1 = bitcast [7 x i8]* %arr1 to i8* 167*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %n, i32 0, i1 false) 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r0, sp, #3}} 170*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #1 171*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 172*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #1 173*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 174*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: mov r2, #1 175*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset 176*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: mov r1, #1 177*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 178*9880d681SAndroid Build Coastguard Worker %arr2 = alloca [7 x i8], align 1 179*9880d681SAndroid Build Coastguard Worker %2 = bitcast [7 x i8]* %arr2 to i8* 180*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %2, i8 1, i32 %n, i32 0, i1 false) 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker unreachable 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker; Check that alloca arguments are not aligned if size+offset is less than 8 bytes 186*9880d681SAndroid Build Coastguard Workerdefine void @f4(i8* %dest, i32 %n) { 187*9880d681SAndroid Build Coastguard Workerentry: 188*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: f4 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #23|sub(.w)? r., r7, #17}} 191*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 192*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 193*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove 194*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 195*9880d681SAndroid Build Coastguard Worker %arr0 = alloca [9 x i8], align 1 196*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds [9 x i8], [9 x i8]* %arr0, i32 0, i32 4 197*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %0, i32 %n, i32 0, i1 false) 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(10|14)}} 200*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 201*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 202*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy 203*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 204*9880d681SAndroid Build Coastguard Worker %arr1 = alloca [9 x i8], align 1 205*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds [9 x i8], [9 x i8]* %arr1, i32 0, i32 4 206*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %n, i32 0, i1 false) 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(1|5)}} 209*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #1 210*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 211*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #1 212*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 213*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: mov r2, #1 214*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset 215*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: mov r1, #1 216*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 217*9880d681SAndroid Build Coastguard Worker %arr2 = alloca [9 x i8], align 1 218*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [9 x i8], [9 x i8]* %arr2, i32 0, i32 4 219*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %2, i8 1, i32 %n, i32 0, i1 false) 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker unreachable 222*9880d681SAndroid Build Coastguard Worker} 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Worker; Check that alloca arguments are not aligned if the offset is not a multiple of 4 225*9880d681SAndroid Build Coastguard Workerdefine void @f5(i8* %dest, i32 %n) { 226*9880d681SAndroid Build Coastguard Workerentry: 227*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: f5 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r7, #21}} 230*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 231*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 232*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove 233*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 234*9880d681SAndroid Build Coastguard Worker %arr0 = alloca [13 x i8], align 1 235*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds [13 x i8], [13 x i8]* %arr0, i32 0, i32 1 236*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %0, i32 %n, i32 0, i1 false) 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(10|14)}} 239*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 240*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 241*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy 242*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 243*9880d681SAndroid Build Coastguard Worker %arr1 = alloca [13 x i8], align 1 244*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds [13 x i8], [13 x i8]* %arr1, i32 0, i32 1 245*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %n, i32 0, i1 false) 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(1|5)}} 248*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #1 249*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 250*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #1 251*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 252*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: mov r2, #1 253*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset 254*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: mov r1, #1 255*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 256*9880d681SAndroid Build Coastguard Worker %arr2 = alloca [13 x i8], align 1 257*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [13 x i8], [13 x i8]* %arr2, i32 0, i32 1 258*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %2, i8 1, i32 %n, i32 0, i1 false) 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Worker unreachable 261*9880d681SAndroid Build Coastguard Worker} 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker; Check that alloca arguments are not aligned if the offset is unknown 264*9880d681SAndroid Build Coastguard Workerdefine void @f6(i8* %dest, i32 %n, i32 %i) { 265*9880d681SAndroid Build Coastguard Workerentry: 266*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: f6 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r7, #25}} 269*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 270*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 271*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove 272*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 273*9880d681SAndroid Build Coastguard Worker %arr0 = alloca [13 x i8], align 1 274*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds [13 x i8], [13 x i8]* %arr0, i32 0, i32 %i 275*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %0, i32 %n, i32 0, i1 false) 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(10|14)}} 278*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 279*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 280*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy 281*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 282*9880d681SAndroid Build Coastguard Worker %arr1 = alloca [13 x i8], align 1 283*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds [13 x i8], [13 x i8]* %arr1, i32 0, i32 %i 284*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %n, i32 0, i1 false) 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(1|5)}} 287*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #1 288*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 289*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #1 290*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 291*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: mov r2, #1 292*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset 293*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: mov r1, #1 294*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 295*9880d681SAndroid Build Coastguard Worker %arr2 = alloca [13 x i8], align 1 296*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [13 x i8], [13 x i8]* %arr2, i32 0, i32 %i 297*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %2, i8 1, i32 %n, i32 0, i1 false) 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker unreachable 300*9880d681SAndroid Build Coastguard Worker} 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Worker; Check that alloca arguments are not aligned if the GEP is not inbounds 303*9880d681SAndroid Build Coastguard Workerdefine void @f7(i8* %dest, i32 %n) { 304*9880d681SAndroid Build Coastguard Workerentry: 305*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: f7 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r7, #21}} 308*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 309*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 310*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove 311*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 312*9880d681SAndroid Build Coastguard Worker %arr0 = alloca [13 x i8], align 1 313*9880d681SAndroid Build Coastguard Worker %0 = getelementptr [13 x i8], [13 x i8]* %arr0, i32 0, i32 4 314*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %0, i32 %n, i32 0, i1 false) 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(10|14)}} 317*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 318*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 319*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy 320*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 321*9880d681SAndroid Build Coastguard Worker %arr1 = alloca [13 x i8], align 1 322*9880d681SAndroid Build Coastguard Worker %1 = getelementptr [13 x i8], [13 x i8]* %arr1, i32 0, i32 4 323*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %n, i32 0, i1 false) 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(1|5)}} 326*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #1 327*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 328*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #1 329*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 330*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: mov r2, #1 331*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset 332*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: mov r1, #1 333*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 334*9880d681SAndroid Build Coastguard Worker %arr2 = alloca [13 x i8], align 1 335*9880d681SAndroid Build Coastguard Worker %2 = getelementptr [13 x i8], [13 x i8]* %arr2, i32 0, i32 4 336*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %2, i8 1, i32 %n, i32 0, i1 false) 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Worker unreachable 339*9880d681SAndroid Build Coastguard Worker} 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Worker; Check that alloca arguments are not aligned when the offset is past the end of the allocation 342*9880d681SAndroid Build Coastguard Workerdefine void @f8(i8* %dest, i32 %n) { 343*9880d681SAndroid Build Coastguard Workerentry: 344*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: f8 345*9880d681SAndroid Build Coastguard Worker 346*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #27|sub(.w)? r., r7, #21}} 347*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memmove 348*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memmove 349*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memmove 350*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memmove 351*9880d681SAndroid Build Coastguard Worker %arr0 = alloca [13 x i8], align 1 352*9880d681SAndroid Build Coastguard Worker %0 = getelementptr inbounds [13 x i8], [13 x i8]* %arr0, i32 0, i32 16 353*9880d681SAndroid Build Coastguard Worker call void @llvm.memmove.p0i8.p0i8.i32(i8* %dest, i8* %0, i32 %n, i32 0, i1 false) 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(10|14)}} 356*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memcpy 357*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memcpy 358*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memcpy 359*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memcpy 360*9880d681SAndroid Build Coastguard Worker %arr1 = alloca [13 x i8], align 1 361*9880d681SAndroid Build Coastguard Worker %1 = getelementptr inbounds [13 x i8], [13 x i8]* %arr1, i32 0, i32 16 362*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %1, i32 %n, i32 0, i1 false) 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard Worker ; CHECK: {{add(.w)? r., sp, #(1|5)}} 365*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: mov r1, #1 366*9880d681SAndroid Build Coastguard Worker ; CHECK-IOS: bl _memset 367*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: movs r1, #1 368*9880d681SAndroid Build Coastguard Worker ; CHECK-DARWIN: bl _memset 369*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: mov r2, #1 370*9880d681SAndroid Build Coastguard Worker ; CHECK-EABI: bl __aeabi_memset 371*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: mov r1, #1 372*9880d681SAndroid Build Coastguard Worker ; CHECK-GNUEABI: bl memset 373*9880d681SAndroid Build Coastguard Worker %arr2 = alloca [13 x i8], align 1 374*9880d681SAndroid Build Coastguard Worker %2 = getelementptr inbounds [13 x i8], [13 x i8]* %arr2, i32 0, i32 16 375*9880d681SAndroid Build Coastguard Worker call void @llvm.memset.p0i8.i32(i8* %2, i8 1, i32 %n, i32 0, i1 false) 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Worker unreachable 378*9880d681SAndroid Build Coastguard Worker} 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Worker; Check that global variables are aligned if they are large enough, but only if 381*9880d681SAndroid Build Coastguard Worker; they are defined in this object and don't have an explicit section. 382*9880d681SAndroid Build Coastguard Worker@arr1 = global [7 x i8] c"\01\02\03\04\05\06\07", align 1 383*9880d681SAndroid Build Coastguard Worker@arr2 = global [8 x i8] c"\01\02\03\04\05\06\07\08", align 1 384*9880d681SAndroid Build Coastguard Worker@arr3 = global [7 x i8] c"\01\02\03\04\05\06\07", section "foo,bar", align 1 385*9880d681SAndroid Build Coastguard Worker@arr4 = global [8 x i8] c"\01\02\03\04\05\06\07\08", section "foo,bar", align 1 386*9880d681SAndroid Build Coastguard Worker@arr5 = weak global [7 x i8] c"\01\02\03\04\05\06\07", align 1 387*9880d681SAndroid Build Coastguard Worker@arr6 = weak_odr global [7 x i8] c"\01\02\03\04\05\06\07", align 1 388*9880d681SAndroid Build Coastguard Worker@arr7 = external global [7 x i8], align 1 389*9880d681SAndroid Build Coastguard Workerdefine void @f9(i8* %dest, i32 %n) { 390*9880d681SAndroid Build Coastguard Workerentry: 391*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @arr1, i32 0, i32 0), i32 %n, i32 1, i1 false) 392*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @arr2, i32 0, i32 0), i32 %n, i32 1, i1 false) 393*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @arr3, i32 0, i32 0), i32 %n, i32 1, i1 false) 394*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @arr4, i32 0, i32 0), i32 %n, i32 1, i1 false) 395*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @arr5, i32 0, i32 0), i32 %n, i32 1, i1 false) 396*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @arr6, i32 0, i32 0), i32 %n, i32 1, i1 false) 397*9880d681SAndroid Build Coastguard Worker call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* getelementptr inbounds ([7 x i8], [7 x i8]* @arr7, i32 0, i32 0), i32 %n, i32 1, i1 false) 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker unreachable 400*9880d681SAndroid Build Coastguard Worker} 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Worker; CHECK: {{\.data|\.section.+data}} 403*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .p2align 404*9880d681SAndroid Build Coastguard Worker; CHECK: arr1: 405*9880d681SAndroid Build Coastguard Worker; CHECK-IOS: .p2align 3 406*9880d681SAndroid Build Coastguard Worker; CHECK-DARWIN: .p2align 2 407*9880d681SAndroid Build Coastguard Worker; CHECK-EABI-NOT: .p2align 408*9880d681SAndroid Build Coastguard Worker; CHECK-GNUEABI-NOT: .p2align 409*9880d681SAndroid Build Coastguard Worker; CHECK: arr2: 410*9880d681SAndroid Build Coastguard Worker; CHECK: {{\.section.+foo,bar}} 411*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .p2align 412*9880d681SAndroid Build Coastguard Worker; CHECK: arr3: 413*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .p2align 414*9880d681SAndroid Build Coastguard Worker; CHECK: arr4: 415*9880d681SAndroid Build Coastguard Worker; CHECK: {{\.data|\.section.+data}} 416*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .p2align 417*9880d681SAndroid Build Coastguard Worker; CHECK: arr5: 418*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: .p2align 419*9880d681SAndroid Build Coastguard Worker; CHECK: arr6: 420*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: arr7: 421*9880d681SAndroid Build Coastguard Worker 422*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind 423*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind 424*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind 425