xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/memfunc.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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