[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Analysis / CostModel / ARM / memcpy.ll
blob1a66b2b55cc46e546bf2b1835c64837746b521f3
1 ; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2 ; RUN: opt < %s  -passes="print<cost-model>" 2>&1 -disable-output -cost-kind=code-size | \
3 ; RUN:    FileCheck %s --check-prefixes=COMMON,CHECK-NO-SA
4 ; RUN: opt < %s  -passes="print<cost-model>" 2>&1 -disable-output -cost-kind=code-size -mattr=+strict-align | \
5 ; RUN:    FileCheck %s --check-prefixes=COMMON,CHECK-SA
7 target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
8 target triple = "thumbv7m-arm-unknown-eabi"
10 ;;;;;;;;;;;;
11 ; Align 1, 1
12 ;;;;;;;;;;;;
14 define void @memcpy_1(ptr %d, ptr %s) {
16 ; with/without strict-align:
18 ; ldrb r1, [r1]
19 ; strb r1, [r0]
21 ; COMMON-LABEL: 'memcpy_1'
22 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 1, i1 false)
23 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
25 entry:
26   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 1, i1 false)
27   ret void
30 define void @memcpy_2(ptr %d, ptr %s) {
32 ; no strict-align:
34 ; ldrh  r1, [r1]
35 ; strh  r1, [r0]
37 ; strict-align:
39 ; ldrb  r2, [r1]
40 ; ldrb  r1, [r1, #1]
41 ; strb  r1, [r0, #1]
42 ; strb  r2, [r0]
44 ; CHECK-NO-SA-LABEL: 'memcpy_2'
45 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 2, i1 false)
46 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
48 ; CHECK-SA-LABEL: 'memcpy_2'
49 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 2, i1 false)
50 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
52 entry:
53   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 2, i1 false)
54   ret void
57 define void @memcpy_3(ptr %d, ptr %s) {
59 ; no strict-align:
61 ; ldrb  r2, [r1, #2]
62 ; strb  r2, [r0, #2]
63 ; ldrh  r1, [r1]
64 ; strh  r1, [r0]
66 ; strict-align:
68 ; ldrb  r2, [r1]
69 ; ldrb  r3, [r1, #1]
70 ; ldrb  r1, [r1, #2]
71 ; strb  r1, [r0, #2]
72 ; strb  r3, [r0, #1]
73 ; strb  r2, [r0]
75 ; CHECK-NO-SA-LABEL: 'memcpy_3'
76 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 3, i1 false)
77 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
79 ; CHECK-SA-LABEL: 'memcpy_3'
80 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 6 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 3, i1 false)
81 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
83 entry:
84   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 3, i1 false)
85   ret void
88 define void @memcpy_4(ptr %d, ptr %s) {
90 ; no strict-align:
92 ; ldr   r1, [r1]
93 ; str   r1, [r0]
95 ; strict-align:
97 ; ldrb.w  r12, [r1]
98 ; ldrb  r3, [r1, #1]
99 ; ldrb  r2, [r1, #2]
100 ; ldrb  r1, [r1, #3]
101 ; strb  r1, [r0, #3]
102 ; strb  r2, [r0, #2]
103 ; strb  r3, [r0, #1]
104 ; strb.w  r12, [r0]
106 ; CHECK-NO-SA-LABEL: 'memcpy_4'
107 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 4, i1 false)
108 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
110 ; CHECK-SA-LABEL: 'memcpy_4'
111 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 8 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 4, i1 false)
112 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
114 entry:
115   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 4, i1 false)
116   ret void
119 define void @memcpy_8(ptr %d, ptr %s) {
121 ; no strict-align:
123 ; ldr   r2, [r1]
124 ; ldr   r1, [r1, #4]
125 ; str   r1, [r0, #4]
126 ; str   r2, [r0]
128 ; strict-align:
130 ; push  {r7, lr}
131 ; movs  r2, #8
132 ; bl  __aeabi_memcpy
133 ; pop {r7, pc}
135 ; COMMON-LABEL: 'memcpy_8'
136 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 8, i1 false)
137 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
139 entry:
140   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 8, i1 false)
141   ret void
144 define void @memcpy_16(ptr %d, ptr %s) {
146 ; no strict-align:
148 ; ldr.w r12, [r1]
149 ; ldr   r3, [r1, #4]
150 ; ldr   r2, [r1, #8]
151 ; ldr   r1, [r1, #12]
152 ; str   r1, [r0, #12]
153 ; str   r2, [r0, #8]
154 ; str   r3, [r0, #4]
155 ; str.w r12, [r0]
157 ; strict-align:
159 ; push  {r7, lr}
160 ; movs  r2, #8
161 ; bl  __aeabi_memcpy
162 ; pop {r7, pc}
164 ; CHECK-NO-SA-LABEL: 'memcpy_16'
165 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 8 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 16, i1 false)
166 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
168 ; CHECK-SA-LABEL: 'memcpy_16'
169 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 16, i1 false)
170 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
172 entry:
173   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 16, i1 false)
174   ret void
177 define void @memcpy_32(ptr %d, ptr %s, i32 %N) {
179 ; with/without strict-align:
181 ; movs  r2, #32
182 ; bl    __aeabi_memcpy
184 ; COMMON-LABEL: 'memcpy_32'
185 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 32, i1 false)
186 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
188 entry:
189   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 32, i1 false)
190   ret void
193 define void @memcpy_N(ptr %d, ptr %s, i32 %N) {
195 ; with/without strict-align:
197 ; bl __aeabi_memcpy
199 ; COMMON-LABEL: 'memcpy_N'
200 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 %N, i1 false)
201 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
203 entry:
204   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 1 %s, i32 %N, i1 false)
205   ret void
208 ;;;;;;;;;;;;;
209 ; Align 2, 2
210 ;;;;;;;;;;;;;
212 define void @memcpy_1_al2(ptr %d, ptr %s) {
214 ; with/without strict-align:
216 ; ldrb r1, [r1]
217 ; strb r1, [r0]
219 ; COMMON-LABEL: 'memcpy_1_al2'
220 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 1, i1 false)
221 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
223 entry:
224   call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 1, i1 false)
225   ret void
228 define void @memcpy_2_al2(ptr %d, ptr %s) {
230 ; with/without strict-align:
232 ; ldrh r1, [r1]
233 ; strh r1, [r0]
235 ; COMMON-LABEL: 'memcpy_2_al2'
236 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 2, i1 false)
237 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
239 entry:
240   call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 2, i1 false)
241   ret void
244 define void @memcpy_3_al2(ptr %d, ptr %s) {
246 ; with/without strict-align:
248 ; ldrb r2, [r1, #2]
249 ; strb r2, [r0, #2]
250 ; ldrh r1, [r1]
251 ; strh r1, [r0]
253 ; COMMON-LABEL: 'memcpy_3_al2'
254 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 3, i1 false)
255 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
257 entry:
258   call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 3, i1 false)
259   ret void
262 define void @memcpy_4_al2(ptr %d, ptr %s) {
264 ; no strict-align:
266 ; ldr r1, [r1]
267 ; str r1, [r0]
269 ; strict-align:
271 ; ldrh  r2, [r1, #2]
272 ; strh  r2, [r0, #2]
273 ; ldrh  r1, [r1]
274 ; strh  r1, [r0]
276 ; CHECK-NO-SA-LABEL: 'memcpy_4_al2'
277 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 4, i1 false)
278 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
280 ; CHECK-SA-LABEL: 'memcpy_4_al2'
281 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 4, i1 false)
282 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
284 entry:
285   call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 4, i1 false)
286   ret void
289 define void @memcpy_8_al2(ptr %d, ptr %s) {
291 ; no strict-align:
293 ; ldr r2, [r1]
294 ; ldr r1, [r1, #4]
295 ; str r1, [r0, #4]
296 ; str r2, [r0]
298 ; strict-align:
300 ;       ldrh    r2, [r1, #6]
301 ;       strh    r2, [r0, #6]
302 ;       ldrh    r2, [r1, #4]
303 ;       strh    r2, [r0, #4]
304 ;       ldrh    r2, [r1, #2]
305 ;       strh    r2, [r0, #2]
306 ;       ldrh    r1, [r1]
307 ;       strh    r1, [r0]
309 ; CHECK-NO-SA-LABEL: 'memcpy_8_al2'
310 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 8, i1 false)
311 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
313 ; CHECK-SA-LABEL: 'memcpy_8_al2'
314 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 8 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 8, i1 false)
315 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
317 entry:
318   call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 8, i1 false)
319   ret void
322 define void @memcpy_16_al2(ptr %d, ptr %s) {
324 ; no strict-align:
326 ; ldr.w r12, [r1]
327 ; ldr r3, [r1, #4]
328 ; ldr r2, [r1, #8]
329 ; ldr r1, [r1, #12]
330 ; str r1, [r0, #12]
331 ; str r2, [r0, #8]
332 ; str r3, [r0, #4]
333 ; str.w r12, [r0]
335 ; strict-align:
337 ;       movs    r2, #16
338 ;       bl      __aeabi_memcpy
340 ; CHECK-NO-SA-LABEL: 'memcpy_16_al2'
341 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 8 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 16, i1 false)
342 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
344 ; CHECK-SA-LABEL: 'memcpy_16_al2'
345 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 16, i1 false)
346 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
348 entry:
349   call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 16, i1 false)
350   ret void
353 define void @memcpy_32_al2(ptr %d, ptr %s, i32 %N) {
355 ; with/without strict-align:
357 ; movs r2, #32
358 ; bl __aeabi_memcpy
360 ; COMMON-LABEL: 'memcpy_32_al2'
361 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 32, i1 false)
362 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
364 entry:
365   call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 32, i1 false)
366   ret void
369 define void @memcpy_N_al2(ptr %d, ptr %s, i32 %N) {
371 ; with/without strict-align:
373 ; bl __aeabi_memcpy
375 ; COMMON-LABEL: 'memcpy_N_al2'
376 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 %N, i1 false)
377 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
379 entry:
380   call void @llvm.memcpy.p0.p0.i32(ptr align 2 %d, ptr align 2 %s, i32 %N, i1 false)
381   ret void
384 ;;;;;;;;;;;;;
385 ; Align 4, 4
386 ;;;;;;;;;;;;;
388 define void @memcpy_1_al4(ptr %d, ptr %s) {
390 ; with/without strict-align:
392 ; ldrb r1, [r1]
393 ; strb r1, [r0]
395 ; COMMON-LABEL: 'memcpy_1_al4'
396 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 1, i1 false)
397 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
399 entry:
400   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 1, i1 false)
401   ret void
404 define void @memcpy_2_al4(ptr %d, ptr %s) {
406 ; with/without strict-align:
408 ; ldrh r1, [r1]
409 ; strh r1, [r0]
411 ; COMMON-LABEL: 'memcpy_2_al4'
412 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 2, i1 false)
413 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
415 entry:
416   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 2, i1 false)
417   ret void
420 define void @memcpy_3_al4(ptr %d, ptr %s) {
422 ; with/without strict-align:
424 ; ldrb r2, [r1, #2]
425 ; strb r2, [r0, #2]
426 ; ldrh r1, [r1]
427 ; strh r1, [r0]
429 ; COMMON-LABEL: 'memcpy_3_al4'
430 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 3, i1 false)
431 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
433 entry:
434   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 3, i1 false)
435   ret void
438 define void @memcpy_4_al4(ptr %d, ptr %s) {
440 ; with/without strict-align:
442 ; ldr r1, [r1]
443 ; str r1, [r0]
445 ; COMMON-LABEL: 'memcpy_4_al4'
446 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 4, i1 false)
447 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
449 entry:
450   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 4, i1 false)
451   ret void
454 define void @memcpy_8_al4(ptr %d, ptr %s) {
456 ; with/without strict-align:
458 ; ldrd r2, r1, [r1]
459 ; strd r2, r1, [r0]
461 ; COMMON-LABEL: 'memcpy_8_al4'
462 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 8, i1 false)
463 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
465 entry:
466   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 8, i1 false)
467   ret void
470 define void @memcpy_16_al4(ptr %d, ptr %s) {
472 ; with/without strict-align:
474 ; ldm.w  r1, {r2, r3, r12}
475 ; ldr    r1, [r1, #12]
476 ; stm.w  r0, {r2, r3, r12}
477 ; str    r1, [r0, #12]
479 ; COMMON-LABEL: 'memcpy_16_al4'
480 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 8 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 16, i1 false)
481 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
483 entry:
484   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 16, i1 false)
485   ret void
488 define void @memcpy_32_al4(ptr %d, ptr %s, i32 %N) {
490 ; with/without strict-align:
492 ; ldm.w  r1!, {r2, r3, r12, lr}
493 ; stm.w  r0!, {r2, r3, r12, lr}
494 ; ldm.w  r1, {r2, r3, r12, lr}
495 ; stm.w  r0, {r2, r3, r12, lr}
497 ; COMMON-LABEL: 'memcpy_32_al4'
498 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 32, i1 false)
499 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
501 entry:
502   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 32, i1 false)
503   ret void
506 define void @memcpy_N_al4(ptr %d, ptr %s, i32 %N) {
508 ; with/without strict-align:
510 ; bl  __aeabi_memcpy4
512 ; COMMON-LABEL: 'memcpy_N_al4'
513 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 %N, i1 false)
514 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
516 entry:
517   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 4 %s, i32 %N, i1 false)
518   ret void
521 ;;;;;;;;;;;;;
522 ; Align 1, 4
523 ;;;;;;;;;;;;;
525 define void @memcpy_1_al14(ptr %d, ptr %s) {
527 ; with/without strict-align:
529 ; ldrb r1, [r1]
530 ; strb r1, [r0]
532 ; COMMON-LABEL: 'memcpy_1_al14'
533 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 1, i1 false)
534 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
536 entry:
537   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 1, i1 false)
538   ret void
541 define void @memcpy_2_al14(ptr %d, ptr %s) {
543 ; no strict-align:
545 ; ldrh r1, [r1]
546 ; strh r1, [r0]
548 ; strict-align:
550 ; ldrb  r2, [r1]
551 ; ldrb  r1, [r1, #1]
552 ; strb  r1, [r0, #1]
553 ; strb  r2, [r0]
555 ; CHECK-NO-SA-LABEL: 'memcpy_2_al14'
556 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 2, i1 false)
557 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
559 ; CHECK-SA-LABEL: 'memcpy_2_al14'
560 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 2, i1 false)
561 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
563 entry:
564   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 2, i1 false)
565   ret void
568 define void @memcpy_3_al14(ptr %d, ptr %s) {
570 ; no strict-align:
572 ; ldrb r2, [r1, #2]
573 ; strb r2, [r0, #2]
574 ; ldrh r1, [r1]
575 ; strh r1, [r0]
577 ; strict-align:
579 ; ldrb  r2, [r1]
580 ; ldrb  r3, [r1, #1]
581 ; ldrb  r1, [r1, #2]
582 ; strb  r1, [r0, #2]
583 ; strb  r3, [r0, #1]
584 ; strb  r2, [r0]
586 ; CHECK-NO-SA-LABEL: 'memcpy_3_al14'
587 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 3, i1 false)
588 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
590 ; CHECK-SA-LABEL: 'memcpy_3_al14'
591 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 6 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 3, i1 false)
592 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
594 entry:
595   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 3, i1 false)
596   ret void
599 define void @memcpy_4_al14(ptr %d, ptr %s) {
601 ; no strict-align:
603 ; ldr r1, [r1]
604 ; str r1, [r0]
606 ; strict-align:
608 ; ldrb.w        r12, [r1]
609 ; ldrb  r3, [r1, #1]
610 ; ldrb  r2, [r1, #2]
611 ; ldrb  r1, [r1, #3]
612 ; strb  r1, [r0, #3]
613 ; strb  r2, [r0, #2]
614 ; strb  r3, [r0, #1]
615 ; strb.w        r12, [r0]
617 ; CHECK-NO-SA-LABEL: 'memcpy_4_al14'
618 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 4, i1 false)
619 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
621 ; CHECK-SA-LABEL: 'memcpy_4_al14'
622 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 8 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 4, i1 false)
623 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
625 entry:
626   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 4, i1 false)
627   ret void
630 define void @memcpy_8_al14(ptr %d, ptr %s) {
632 ; no strict-align:
634 ; ldr r2, [r1]
635 ; ldr r1, [r1, #4]
636 ; str r1, [r0, #4]
637 ; str r2, [r0]
639 ; strict-align:
641 ; push  {r7, lr}
642 ; movs  r2, #8
643 ; bl  __aeabi_memcpy
644 ; pop {r7, pc}
646 ; COMMON-LABEL: 'memcpy_8_al14'
647 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 8, i1 false)
648 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
650 entry:
651   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 8, i1 false)
652   ret void
655 define void @memcpy_16_al14(ptr %d, ptr %s) {
657 ; no strict-align:
659 ; ldr.w r12, [r1]
660 ; ldr   r3, [r1, #4]
661 ; ldr   r2, [r1, #8]
662 ; ldr   r1, [r1, #12]
663 ; str   r1, [r0, #12]
664 ; str   r2, [r0, #8]
665 ; str   r3, [r0, #4]
666 ; str.w r12, [r0]
668 ; strict-align:
670 ;       movs    r2, #16
671 ;       bl      __aeabi_memcpy
673 ; CHECK-NO-SA-LABEL: 'memcpy_16_al14'
674 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 8 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 16, i1 false)
675 ; CHECK-NO-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
677 ; CHECK-SA-LABEL: 'memcpy_16_al14'
678 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 16, i1 false)
679 ; CHECK-SA-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
681 entry:
682   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 16, i1 false)
683   ret void
686 define void @memcpy_32_al14(ptr %d, ptr %s) {
688 ; with/without strict-align:
690 ; movs r2, #32
691 ; bl   __aeabi_memcpy
693 ; COMMON-LABEL: 'memcpy_32_al14'
694 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 32, i1 false)
695 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
697 entry:
698   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 32, i1 false)
699   ret void
702 define void @memcpy_N_al14(ptr %d, ptr %s, i32 %N) {
704 ; with/without strict-align:
706 ; bl  __aeabi_memcpy4
708 ; COMMON-LABEL: 'memcpy_N_al14'
709 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 %N, i1 false)
710 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
712 entry:
713   call void @llvm.memcpy.p0.p0.i32(ptr align 1 %d, ptr align 4 %s, i32 %N, i1 false)
714   ret void
717 ;;;;;;;;;;;;;
718 ; Align 4, 1
719 ;;;;;;;;;;;;;
721 define void @memcpy_1_al41(ptr %d, ptr %s) {
723 ; with/without strict-align:
725 ; ldrb  r1, [r1]
726 ; strb  r1, [r0]
728 ; COMMON-LABEL: 'memcpy_1_al41'
729 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 1 %s, i32 1, i1 false)
730 ; COMMON-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret void
732 entry:
733   call void @llvm.memcpy.p0.p0.i32(ptr align 4 %d, ptr align 1 %s, i32 1, i1 false)
734   ret void
737 declare void @llvm.memcpy.p0.p0.i32(ptr nocapture writeonly, ptr nocapture readonly, i32, i1) #1