Clang] Fix expansion of response files in -Wp after integrated-cc1 change
[llvm-project.git] / llvm / test / Analysis / CostModel / ARM / memcpy.ll
blob4e8717ef0b9035ab84d78ca6195b1b6ed7c00e4b
1 ; RUN: opt < %s  -cost-model -analyze -cost-kind=code-size | \
2 ; RUN:    FileCheck %s --check-prefixes=COMMON,CHECK-NO-SA
3 ; RUN: opt < %s  -cost-model -analyze -cost-kind=code-size -mattr=+strict-align | \
4 ; RUN:    FileCheck %s --check-prefixes=COMMON,CHECK-SA
6 target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
7 target triple = "thumbv7m-arm-unknown-eabi"
9 ;;;;;;;;;;;;
10 ; Align 1, 1
11 ;;;;;;;;;;;;
13 define void @memcpy_1(i8* %d, i8* %s) {
15 ; with/without strict-align:
17 ; ldrb r1, [r1]
18 ; strb r1, [r0]
20 ; COMMON:           function 'memcpy_1'
21 ; CHECK-NO-SA-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
22 ; CHECK-SA-NEXT:    cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
24 entry:
25   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 1 %s, i32 1, i1 false)
26   ret void
29 define void @memcpy_2(i8* %d, i8* %s) {
31 ; no strict-align:
33 ; ldrh  r1, [r1]
34 ; strh  r1, [r0]
36 ; strict-align:
38 ; ldrb  r2, [r1]
39 ; ldrb  r1, [r1, #1]
40 ; strb  r1, [r0, #1]
41 ; strb  r2, [r0]
43 ; COMMON:           function 'memcpy_2'
44 ; CHECK-NO-SA-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
45 ; CHECK-SA-NEXT:    cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
47 entry:
48   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 1 %s, i32 2, i1 false)
49   ret void
52 define void @memcpy_3(i8* %d, i8* %s) {
54 ; no strict-align:
56 ; ldrb  r2, [r1, #2]
57 ; strb  r2, [r0, #2]
58 ; ldrh  r1, [r1]
59 ; strh  r1, [r0]
61 ; strict-align:
63 ; ldrb  r2, [r1]
64 ; ldrb  r3, [r1, #1]
65 ; ldrb  r1, [r1, #2]
66 ; strb  r1, [r0, #2]
67 ; strb  r3, [r0, #1]
68 ; strb  r2, [r0]
70 ; COMMON:           function 'memcpy_3'
71 ; CHECK-NO-SA-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
72 ; CHECK-SA-NEXT:    cost of 6 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
74 entry:
75   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 1 %s, i32 3, i1 false)
76   ret void
79 define void @memcpy_4(i8* %d, i8* %s) {
81 ; no strict-align:
83 ; ldr   r1, [r1]
84 ; str   r1, [r0]
86 ; strict-align:
88 ; ldrb.w  r12, [r1]
89 ; ldrb  r3, [r1, #1]
90 ; ldrb  r2, [r1, #2]
91 ; ldrb  r1, [r1, #3]
92 ; strb  r1, [r0, #3]
93 ; strb  r2, [r0, #2]
94 ; strb  r3, [r0, #1]
95 ; strb.w  r12, [r0]
97 ; COMMON:           function 'memcpy_4'
98 ; CHECK-NO-SA-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
99 ; CHECK-SA-NEXT:    cost of 8 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
101 entry:
102   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 1 %s, i32 4, i1 false)
103   ret void
106 define void @memcpy_8(i8* %d, i8* %s) {
108 ; no strict-align:
110 ; ldr   r2, [r1]
111 ; ldr   r1, [r1, #4]
112 ; str   r1, [r0, #4]
113 ; str   r2, [r0]
115 ; strict-align:
117 ; push  {r7, lr}
118 ; movs  r2, #8
119 ; bl  __aeabi_memcpy
120 ; pop {r7, pc}
122 ; COMMON:      function 'memcpy_8'
123 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
125 entry:
126   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 1 %s, i32 8, i1 false)
127   ret void
130 define void @memcpy_16(i8* %d, i8* %s) {
132 ; no strict-align:
134 ; ldr.w r12, [r1]
135 ; ldr   r3, [r1, #4]
136 ; ldr   r2, [r1, #8]
137 ; ldr   r1, [r1, #12]
138 ; str   r1, [r0, #12]
139 ; str   r2, [r0, #8]
140 ; str   r3, [r0, #4]
141 ; str.w r12, [r0]
143 ; strict-align:
145 ; push  {r7, lr}
146 ; movs  r2, #8
147 ; bl  __aeabi_memcpy
148 ; pop {r7, pc}
150 ; COMMON:           function 'memcpy_16'
151 ; CHECK-NO-SA-NEXT: cost of 8 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
152 ; CHECK-SA-NEXT:    cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
154 entry:
155   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 1 %s, i32 16, i1 false)
156   ret void
159 define void @memcpy_32(i8* %d, i8* %s, i32 %N) {
161 ; with/without strict-align:
163 ; movs  r2, #32
164 ; bl    __aeabi_memcpy
166 ; COMMON:      function 'memcpy_32'
167 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
169 entry:
170   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 1 %s, i32 32, i1 false)
171   ret void
174 define void @memcpy_N(i8* %d, i8* %s, i32 %N) {
176 ; with/without strict-align:
178 ; bl __aeabi_memcpy
180 ; COMMON:      function 'memcpy_N'
181 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
183 entry:
184   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 1 %s, i32 %N, i1 false)
185   ret void
188 ;;;;;;;;;;;;;
189 ; Align 2, 2
190 ;;;;;;;;;;;;;
192 define void @memcpy_1_al2(i8* %d, i8* %s) {
194 ; with/without strict-align:
196 ; ldrb r1, [r1]
197 ; strb r1, [r0]
199 ; COMMON:      function 'memcpy_1_al2'
200 ; COMMON-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
202 entry:
203   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %d, i8* align 2 %s, i32 1, i1 false)
204   ret void
207 define void @memcpy_2_al2(i8* %d, i8* %s) {
209 ; with/without strict-align:
211 ; ldrh r1, [r1]
212 ; strh r1, [r0]
214 ; COMMON:      function 'memcpy_2_al2'
215 ; COMMON-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
217 entry:
218   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %d, i8* align 2 %s, i32 2, i1 false)
219   ret void
222 define void @memcpy_3_al2(i8* %d, i8* %s) {
224 ; with/without strict-align:
226 ; ldrb r2, [r1, #2]
227 ; strb r2, [r0, #2]
228 ; ldrh r1, [r1]
229 ; strh r1, [r0]
231 ; COMMON:      function 'memcpy_3_al2'
232 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
234 entry:
235   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %d, i8* align 2 %s, i32 3, i1 false)
236   ret void
239 define void @memcpy_4_al2(i8* %d, i8* %s) {
241 ; no strict-align:
243 ; ldr r1, [r1]
244 ; str r1, [r0]
246 ; strict-align:
248 ; ldrh  r2, [r1, #2]
249 ; strh  r2, [r0, #2]
250 ; ldrh  r1, [r1]
251 ; strh  r1, [r0]
253 ; COMMON:           function 'memcpy_4_al2'
254 ; CHECK-NO-SA-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
255 ; CHECK-SA-NEXT:    cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
257 entry:
258   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %d, i8* align 2 %s, i32 4, i1 false)
259   ret void
262 define void @memcpy_8_al2(i8* %d, i8* %s) {
264 ; no strict-align:
266 ; ldr r2, [r1]
267 ; ldr r1, [r1, #4]
268 ; str r1, [r0, #4]
269 ; str r2, [r0]
271 ; strict-align:
273 ;       ldrh    r2, [r1, #6]
274 ;       strh    r2, [r0, #6]
275 ;       ldrh    r2, [r1, #4]
276 ;       strh    r2, [r0, #4]
277 ;       ldrh    r2, [r1, #2]
278 ;       strh    r2, [r0, #2]
279 ;       ldrh    r1, [r1]
280 ;       strh    r1, [r0]
282 ; COMMON:           function 'memcpy_8_al2'
283 ; CHECK-NO-SA-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
284 ; CHECK-SA-NEXT:    cost of 8 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
286 entry:
287   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %d, i8* align 2 %s, i32 8, i1 false)
288   ret void
291 define void @memcpy_16_al2(i8* %d, i8* %s) {
293 ; no strict-align:
295 ; ldr.w r12, [r1]
296 ; ldr r3, [r1, #4]
297 ; ldr r2, [r1, #8]
298 ; ldr r1, [r1, #12]
299 ; str r1, [r0, #12]
300 ; str r2, [r0, #8]
301 ; str r3, [r0, #4]
302 ; str.w r12, [r0]
304 ; strict-align:
306 ;       movs    r2, #16
307 ;       bl      __aeabi_memcpy
309 ; COMMON:           function 'memcpy_16_al2'
310 ; CHECK-NO-SA-NEXT: cost of 8 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
311 ; CHECK-SA-NEXT:    cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
313 entry:
314   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %d, i8* align 2 %s, i32 16, i1 false)
315   ret void
318 define void @memcpy_32_al2(i8* %d, i8* %s, i32 %N) {
320 ; with/without strict-align:
322 ; movs r2, #32
323 ; bl __aeabi_memcpy
325 ; COMMON:      function 'memcpy_32_al2'
326 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
328 entry:
329   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %d, i8* align 2 %s, i32 32, i1 false)
330   ret void
333 define void @memcpy_N_al2(i8* %d, i8* %s, i32 %N) {
335 ; with/without strict-align:
337 ; bl __aeabi_memcpy
339 ; COMMON:      function 'memcpy_N_al2'
340 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
342 entry:
343   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 2 %d, i8* align 2 %s, i32 %N, i1 false)
344   ret void
347 ;;;;;;;;;;;;;
348 ; Align 4, 4
349 ;;;;;;;;;;;;;
351 define void @memcpy_1_al4(i8* %d, i8* %s) {
353 ; with/without strict-align:
355 ; ldrb r1, [r1]
356 ; strb r1, [r0]
358 ; COMMON:      function 'memcpy_1_al4'
359 ; COMMON-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
361 entry:
362   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 4 %s, i32 1, i1 false)
363   ret void
366 define void @memcpy_2_al4(i8* %d, i8* %s) {
368 ; with/without strict-align:
370 ; ldrh r1, [r1]
371 ; strh r1, [r0]
373 ; COMMON:      function 'memcpy_2_al4'
374 ; COMMON-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
376 entry:
377   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 4 %s, i32 2, i1 false)
378   ret void
381 define void @memcpy_3_al4(i8* %d, i8* %s) {
383 ; with/without strict-align:
385 ; ldrb r2, [r1, #2]
386 ; strb r2, [r0, #2]
387 ; ldrh r1, [r1]
388 ; strh r1, [r0]
390 ; COMMON:      function 'memcpy_3_al4'
391 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
393 entry:
394   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 4 %s, i32 3, i1 false)
395   ret void
398 define void @memcpy_4_al4(i8* %d, i8* %s) {
400 ; with/without strict-align:
402 ; ldr r1, [r1]
403 ; str r1, [r0]
405 ; COMMON:      function 'memcpy_4_al4'
406 ; COMMON-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
408 entry:
409   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 4 %s, i32 4, i1 false)
410   ret void
413 define void @memcpy_8_al4(i8* %d, i8* %s) {
415 ; with/without strict-align:
417 ; ldrd r2, r1, [r1]
418 ; strd r2, r1, [r0]
420 ; COMMON:      function 'memcpy_8_al4'
421 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
423 entry:
424   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 4 %s, i32 8, i1 false)
425   ret void
428 define void @memcpy_16_al4(i8* %d, i8* %s) {
430 ; with/without strict-align:
432 ; ldm.w  r1, {r2, r3, r12}
433 ; ldr    r1, [r1, #12]
434 ; stm.w  r0, {r2, r3, r12}
435 ; str    r1, [r0, #12]
437 ; COMMON:      function 'memcpy_16_al4'
438 ; COMMON-NEXT: cost of 8 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
440 entry:
441   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 4 %s, i32 16, i1 false)
442   ret void
445 define void @memcpy_32_al4(i8* %d, i8* %s, i32 %N) {
447 ; with/without strict-align:
449 ; ldm.w  r1!, {r2, r3, r12, lr}
450 ; stm.w  r0!, {r2, r3, r12, lr}
451 ; ldm.w  r1, {r2, r3, r12, lr}
452 ; stm.w  r0, {r2, r3, r12, lr}
454 ; COMMON:      function 'memcpy_32_al4'
455 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
457 entry:
458   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 4 %s, i32 32, i1 false)
459   ret void
462 define void @memcpy_N_al4(i8* %d, i8* %s, i32 %N) {
464 ; with/without strict-align:
466 ; bl  __aeabi_memcpy4
468 ; COMMON:      function 'memcpy_N_al4'
469 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
471 entry:
472   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 4 %s, i32 %N, i1 false)
473   ret void
476 ;;;;;;;;;;;;;
477 ; Align 1, 4
478 ;;;;;;;;;;;;;
480 define void @memcpy_1_al14(i8* %d, i8* %s) {
482 ; with/without strict-align:
484 ; ldrb r1, [r1]
485 ; strb r1, [r0]
487 ; COMMON:       function 'memcpy_1_al14'
488 ; COMMON-NEXT:  cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
490 entry:
491   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 4 %s, i32 1, i1 false)
492   ret void
495 define void @memcpy_2_al14(i8* %d, i8* %s) {
497 ; no strict-align:
499 ; ldrh r1, [r1]
500 ; strh r1, [r0]
502 ; strict-align:
504 ; ldrb  r2, [r1]
505 ; ldrb  r1, [r1, #1]
506 ; strb  r1, [r0, #1]
507 ; strb  r2, [r0]
509 ; COMMON:           function 'memcpy_2_al14'
510 ; CHECK-NO-SA-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
511 ; CHECK-SA-NEXT:    cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
513 entry:
514   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 4 %s, i32 2, i1 false)
515   ret void
518 define void @memcpy_3_al14(i8* %d, i8* %s) {
520 ; no strict-align:
522 ; ldrb r2, [r1, #2]
523 ; strb r2, [r0, #2]
524 ; ldrh r1, [r1]
525 ; strh r1, [r0]
527 ; strict-align:
529 ; ldrb  r2, [r1]
530 ; ldrb  r3, [r1, #1]
531 ; ldrb  r1, [r1, #2]
532 ; strb  r1, [r0, #2]
533 ; strb  r3, [r0, #1]
534 ; strb  r2, [r0]
536 ; COMMON:           function 'memcpy_3_al14'
537 ; CHECK-NO-SA-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
538 ; CHECK-SA-NEXT:    cost of 6 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
540 entry:
541   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 4 %s, i32 3, i1 false)
542   ret void
545 define void @memcpy_4_al14(i8* %d, i8* %s) {
547 ; no strict-align:
549 ; ldr r1, [r1]
550 ; str r1, [r0]
552 ; strict-align:
554 ; ldrb.w        r12, [r1]
555 ; ldrb  r3, [r1, #1]
556 ; ldrb  r2, [r1, #2]
557 ; ldrb  r1, [r1, #3]
558 ; strb  r1, [r0, #3]
559 ; strb  r2, [r0, #2]
560 ; strb  r3, [r0, #1]
561 ; strb.w        r12, [r0]
563 ; COMMON:      function 'memcpy_4_al14'
564 ; CHECK-NO-SA-NEXT: cost of 2 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
565 ; CHECK-SA-NEXT:    cost of 8 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
567 entry:
568   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 4 %s, i32 4, i1 false)
569   ret void
572 define void @memcpy_8_al14(i8* %d, i8* %s) {
574 ; no strict-align:
576 ; ldr r2, [r1]
577 ; ldr r1, [r1, #4]
578 ; str r1, [r0, #4]
579 ; str r2, [r0]
581 ; strict-align:
583 ; push  {r7, lr}
584 ; movs  r2, #8
585 ; bl  __aeabi_memcpy
586 ; pop {r7, pc}
588 ; COMMON:      function 'memcpy_8_al14'
589 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
591 entry:
592   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 4 %s, i32 8, i1 false)
593   ret void
596 define void @memcpy_16_al14(i8* %d, i8* %s) {
598 ; no strict-align:
600 ; ldr.w r12, [r1]
601 ; ldr   r3, [r1, #4]
602 ; ldr   r2, [r1, #8]
603 ; ldr   r1, [r1, #12]
604 ; str   r1, [r0, #12]
605 ; str   r2, [r0, #8]
606 ; str   r3, [r0, #4]
607 ; str.w r12, [r0]
609 ; strict-align:
611 ;       movs    r2, #16
612 ;       bl      __aeabi_memcpy
614 ; COMMON:           function 'memcpy_16_al14'
615 ; CHECK-NO-SA-NEXT: cost of 8 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
616 ; CHECK-SA-NEXT:    cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
618 entry:
619   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 4 %s, i32 16, i1 false)
620   ret void
623 define void @memcpy_32_al14(i8* %d, i8* %s) {
625 ; with/without strict-align:
627 ; movs r2, #32
628 ; bl   __aeabi_memcpy
630 ; COMMON:      function 'memcpy_32_al14'
631 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
633 entry:
634   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 4 %s, i32 32, i1 false)
635   ret void
638 define void @memcpy_N_al14(i8* %d, i8* %s, i32 %N) {
640 ; with/without strict-align:
642 ; bl  __aeabi_memcpy4
644 ; COMMON:      function 'memcpy_N_al14'
645 ; COMMON-NEXT: cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
647 entry:
648   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %d, i8* align 4 %s, i32 %N, i1 false)
649   ret void
652 ;;;;;;;;;;;;;
653 ; Align 4, 1
654 ;;;;;;;;;;;;;
656 define void @memcpy_1_al41(i8* %d, i8* %s) {
658 ; with/without strict-align:
660 ; ldrb  r1, [r1]
661 ; strb  r1, [r0]
663 ; COMMON:       function 'memcpy_1_al41'
664 ; COMMON-NEXT:  cost of 4 for instruction: call void @llvm.memcpy.p0i8.p0i8.i32
666 entry:
667   call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %d, i8* align 1 %s, i32 1, i1 false)
668   ret void
671 declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i1) #1