Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / memcpy.ll
blob6ec9b20163051b392e6f083fad0292c9b64c8549
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin      -mcpu=core2     | FileCheck %s -check-prefix=DARWIN
3 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2     | FileCheck %s -check-prefix=LINUX
4 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=skylake   | FileCheck %s -check-prefix=LINUX-SKL
5 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=skx       | FileCheck %s -check-prefix=LINUX-SKX
6 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=knl       | FileCheck %s -check-prefix=LINUX-KNL
7 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=avx512bw | FileCheck %s -check-prefix=LINUX-AVX512BW
9 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
10 declare void @llvm.memcpy.p256.p256.i64(ptr addrspace(256) nocapture, ptr addrspace(256) nocapture, i64, i1) nounwind
13 ; Variable memcpy's should lower to calls.
14 define ptr @test1(ptr %a, ptr %b, i64 %n) nounwind {
15 ; DARWIN-LABEL: test1:
16 ; DARWIN:       ## %bb.0: ## %entry
17 ; DARWIN-NEXT:    jmp _memcpy ## TAILCALL
19 ; LINUX-LABEL: test1:
20 ; LINUX:       # %bb.0: # %entry
21 ; LINUX-NEXT:    jmp memcpy@PLT # TAILCALL
23 ; LINUX-SKL-LABEL: test1:
24 ; LINUX-SKL:       # %bb.0: # %entry
25 ; LINUX-SKL-NEXT:    jmp memcpy@PLT # TAILCALL
27 ; LINUX-SKX-LABEL: test1:
28 ; LINUX-SKX:       # %bb.0: # %entry
29 ; LINUX-SKX-NEXT:    jmp memcpy@PLT # TAILCALL
31 ; LINUX-KNL-LABEL: test1:
32 ; LINUX-KNL:       # %bb.0: # %entry
33 ; LINUX-KNL-NEXT:    jmp memcpy@PLT # TAILCALL
35 ; LINUX-AVX512BW-LABEL: test1:
36 ; LINUX-AVX512BW:       # %bb.0: # %entry
37 ; LINUX-AVX512BW-NEXT:    jmp memcpy@PLT # TAILCALL
38 entry:
39         tail call void @llvm.memcpy.p0.p0.i64(ptr %a, ptr %b, i64 %n, i1 0 )
40         ret ptr %a
43 ; Variable memcpy's should lower to calls.
44 define ptr @test2(ptr %a, ptr %b, i64 %n) nounwind {
45 ; DARWIN-LABEL: test2:
46 ; DARWIN:       ## %bb.0: ## %entry
47 ; DARWIN-NEXT:    jmp _memcpy ## TAILCALL
49 ; LINUX-LABEL: test2:
50 ; LINUX:       # %bb.0: # %entry
51 ; LINUX-NEXT:    jmp memcpy@PLT # TAILCALL
53 ; LINUX-SKL-LABEL: test2:
54 ; LINUX-SKL:       # %bb.0: # %entry
55 ; LINUX-SKL-NEXT:    jmp memcpy@PLT # TAILCALL
57 ; LINUX-SKX-LABEL: test2:
58 ; LINUX-SKX:       # %bb.0: # %entry
59 ; LINUX-SKX-NEXT:    jmp memcpy@PLT # TAILCALL
61 ; LINUX-KNL-LABEL: test2:
62 ; LINUX-KNL:       # %bb.0: # %entry
63 ; LINUX-KNL-NEXT:    jmp memcpy@PLT # TAILCALL
65 ; LINUX-AVX512BW-LABEL: test2:
66 ; LINUX-AVX512BW:       # %bb.0: # %entry
67 ; LINUX-AVX512BW-NEXT:    jmp memcpy@PLT # TAILCALL
68 entry:
69         tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %a, ptr align 8 %b, i64 %n, i1 0 )
70         ret ptr %a
73 ; Large constant memcpy's should lower to a call when optimizing for size.
74 ; PR6623
76 ; On the other hand, Darwin's definition of -Os is optimizing for size without
77 ; hurting performance so it should just ignore optsize when expanding memcpy.
78 ; rdar://8821501
79 define void @test3(ptr nocapture %A, ptr nocapture %B) nounwind optsize noredzone {
80 ; DARWIN-LABEL: test3:
81 ; DARWIN:       ## %bb.0: ## %entry
82 ; DARWIN-NEXT:    movq 56(%rsi), %rax
83 ; DARWIN-NEXT:    movq %rax, 56(%rdi)
84 ; DARWIN-NEXT:    movq 48(%rsi), %rax
85 ; DARWIN-NEXT:    movq %rax, 48(%rdi)
86 ; DARWIN-NEXT:    movq 40(%rsi), %rax
87 ; DARWIN-NEXT:    movq %rax, 40(%rdi)
88 ; DARWIN-NEXT:    movq 32(%rsi), %rax
89 ; DARWIN-NEXT:    movq %rax, 32(%rdi)
90 ; DARWIN-NEXT:    movq 24(%rsi), %rax
91 ; DARWIN-NEXT:    movq %rax, 24(%rdi)
92 ; DARWIN-NEXT:    movq 16(%rsi), %rax
93 ; DARWIN-NEXT:    movq %rax, 16(%rdi)
94 ; DARWIN-NEXT:    movq (%rsi), %rax
95 ; DARWIN-NEXT:    movq 8(%rsi), %rcx
96 ; DARWIN-NEXT:    movq %rcx, 8(%rdi)
97 ; DARWIN-NEXT:    movq %rax, (%rdi)
98 ; DARWIN-NEXT:    retq
100 ; LINUX-LABEL: test3:
101 ; LINUX:       # %bb.0: # %entry
102 ; LINUX-NEXT:    movl $64, %edx
103 ; LINUX-NEXT:    jmp memcpy@PLT # TAILCALL
105 ; LINUX-SKL-LABEL: test3:
106 ; LINUX-SKL:       # %bb.0: # %entry
107 ; LINUX-SKL-NEXT:    vmovups (%rsi), %ymm0
108 ; LINUX-SKL-NEXT:    vmovups 32(%rsi), %ymm1
109 ; LINUX-SKL-NEXT:    vmovups %ymm1, 32(%rdi)
110 ; LINUX-SKL-NEXT:    vmovups %ymm0, (%rdi)
111 ; LINUX-SKL-NEXT:    vzeroupper
112 ; LINUX-SKL-NEXT:    retq
114 ; LINUX-SKX-LABEL: test3:
115 ; LINUX-SKX:       # %bb.0: # %entry
116 ; LINUX-SKX-NEXT:    vmovups (%rsi), %ymm0
117 ; LINUX-SKX-NEXT:    vmovups 32(%rsi), %ymm1
118 ; LINUX-SKX-NEXT:    vmovups %ymm1, 32(%rdi)
119 ; LINUX-SKX-NEXT:    vmovups %ymm0, (%rdi)
120 ; LINUX-SKX-NEXT:    vzeroupper
121 ; LINUX-SKX-NEXT:    retq
123 ; LINUX-KNL-LABEL: test3:
124 ; LINUX-KNL:       # %bb.0: # %entry
125 ; LINUX-KNL-NEXT:    vmovups (%rsi), %zmm0
126 ; LINUX-KNL-NEXT:    vmovups %zmm0, (%rdi)
127 ; LINUX-KNL-NEXT:    retq
129 ; LINUX-AVX512BW-LABEL: test3:
130 ; LINUX-AVX512BW:       # %bb.0: # %entry
131 ; LINUX-AVX512BW-NEXT:    vmovups (%rsi), %zmm0
132 ; LINUX-AVX512BW-NEXT:    vmovups %zmm0, (%rdi)
133 ; LINUX-AVX512BW-NEXT:    vzeroupper
134 ; LINUX-AVX512BW-NEXT:    retq
135 entry:
136   tail call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 64, i1 false)
137   ret void
140 define void @test3_pgso(ptr nocapture %A, ptr nocapture %B) nounwind noredzone !prof !14 {
141 ; DARWIN-LABEL: test3_pgso:
142 ; DARWIN:       ## %bb.0: ## %entry
143 ; DARWIN-NEXT:    movq 56(%rsi), %rax
144 ; DARWIN-NEXT:    movq %rax, 56(%rdi)
145 ; DARWIN-NEXT:    movq 48(%rsi), %rax
146 ; DARWIN-NEXT:    movq %rax, 48(%rdi)
147 ; DARWIN-NEXT:    movq 40(%rsi), %rax
148 ; DARWIN-NEXT:    movq %rax, 40(%rdi)
149 ; DARWIN-NEXT:    movq 32(%rsi), %rax
150 ; DARWIN-NEXT:    movq %rax, 32(%rdi)
151 ; DARWIN-NEXT:    movq 24(%rsi), %rax
152 ; DARWIN-NEXT:    movq %rax, 24(%rdi)
153 ; DARWIN-NEXT:    movq 16(%rsi), %rax
154 ; DARWIN-NEXT:    movq %rax, 16(%rdi)
155 ; DARWIN-NEXT:    movq (%rsi), %rax
156 ; DARWIN-NEXT:    movq 8(%rsi), %rcx
157 ; DARWIN-NEXT:    movq %rcx, 8(%rdi)
158 ; DARWIN-NEXT:    movq %rax, (%rdi)
159 ; DARWIN-NEXT:    retq
161 ; LINUX-LABEL: test3_pgso:
162 ; LINUX:       # %bb.0: # %entry
163 ; LINUX-NEXT:    movl $64, %edx
164 ; LINUX-NEXT:    jmp memcpy@PLT # TAILCALL
166 ; LINUX-SKL-LABEL: test3_pgso:
167 ; LINUX-SKL:       # %bb.0: # %entry
168 ; LINUX-SKL-NEXT:    vmovups (%rsi), %ymm0
169 ; LINUX-SKL-NEXT:    vmovups 32(%rsi), %ymm1
170 ; LINUX-SKL-NEXT:    vmovups %ymm1, 32(%rdi)
171 ; LINUX-SKL-NEXT:    vmovups %ymm0, (%rdi)
172 ; LINUX-SKL-NEXT:    vzeroupper
173 ; LINUX-SKL-NEXT:    retq
175 ; LINUX-SKX-LABEL: test3_pgso:
176 ; LINUX-SKX:       # %bb.0: # %entry
177 ; LINUX-SKX-NEXT:    vmovups (%rsi), %ymm0
178 ; LINUX-SKX-NEXT:    vmovups 32(%rsi), %ymm1
179 ; LINUX-SKX-NEXT:    vmovups %ymm1, 32(%rdi)
180 ; LINUX-SKX-NEXT:    vmovups %ymm0, (%rdi)
181 ; LINUX-SKX-NEXT:    vzeroupper
182 ; LINUX-SKX-NEXT:    retq
184 ; LINUX-KNL-LABEL: test3_pgso:
185 ; LINUX-KNL:       # %bb.0: # %entry
186 ; LINUX-KNL-NEXT:    vmovups (%rsi), %zmm0
187 ; LINUX-KNL-NEXT:    vmovups %zmm0, (%rdi)
188 ; LINUX-KNL-NEXT:    retq
190 ; LINUX-AVX512BW-LABEL: test3_pgso:
191 ; LINUX-AVX512BW:       # %bb.0: # %entry
192 ; LINUX-AVX512BW-NEXT:    vmovups (%rsi), %zmm0
193 ; LINUX-AVX512BW-NEXT:    vmovups %zmm0, (%rdi)
194 ; LINUX-AVX512BW-NEXT:    vzeroupper
195 ; LINUX-AVX512BW-NEXT:    retq
196 entry:
197   tail call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 64, i1 false)
198   ret void
201 define void @test3_minsize(ptr nocapture %A, ptr nocapture %B) nounwind minsize noredzone {
202 ; DARWIN-LABEL: test3_minsize:
203 ; DARWIN:       ## %bb.0:
204 ; DARWIN-NEXT:    pushq $64
205 ; DARWIN-NEXT:    popq %rdx
206 ; DARWIN-NEXT:    jmp _memcpy ## TAILCALL
208 ; LINUX-LABEL: test3_minsize:
209 ; LINUX:       # %bb.0:
210 ; LINUX-NEXT:    pushq $64
211 ; LINUX-NEXT:    popq %rdx
212 ; LINUX-NEXT:    jmp memcpy@PLT # TAILCALL
214 ; LINUX-SKL-LABEL: test3_minsize:
215 ; LINUX-SKL:       # %bb.0:
216 ; LINUX-SKL-NEXT:    vmovups (%rsi), %ymm0
217 ; LINUX-SKL-NEXT:    vmovups 32(%rsi), %ymm1
218 ; LINUX-SKL-NEXT:    vmovups %ymm1, 32(%rdi)
219 ; LINUX-SKL-NEXT:    vmovups %ymm0, (%rdi)
220 ; LINUX-SKL-NEXT:    vzeroupper
221 ; LINUX-SKL-NEXT:    retq
223 ; LINUX-SKX-LABEL: test3_minsize:
224 ; LINUX-SKX:       # %bb.0:
225 ; LINUX-SKX-NEXT:    vmovups (%rsi), %ymm0
226 ; LINUX-SKX-NEXT:    vmovups 32(%rsi), %ymm1
227 ; LINUX-SKX-NEXT:    vmovups %ymm1, 32(%rdi)
228 ; LINUX-SKX-NEXT:    vmovups %ymm0, (%rdi)
229 ; LINUX-SKX-NEXT:    vzeroupper
230 ; LINUX-SKX-NEXT:    retq
232 ; LINUX-KNL-LABEL: test3_minsize:
233 ; LINUX-KNL:       # %bb.0:
234 ; LINUX-KNL-NEXT:    vmovups (%rsi), %zmm0
235 ; LINUX-KNL-NEXT:    vmovups %zmm0, (%rdi)
236 ; LINUX-KNL-NEXT:    retq
238 ; LINUX-AVX512BW-LABEL: test3_minsize:
239 ; LINUX-AVX512BW:       # %bb.0:
240 ; LINUX-AVX512BW-NEXT:    vmovups (%rsi), %zmm0
241 ; LINUX-AVX512BW-NEXT:    vmovups %zmm0, (%rdi)
242 ; LINUX-AVX512BW-NEXT:    vzeroupper
243 ; LINUX-AVX512BW-NEXT:    retq
244   tail call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 64, i1 false)
245   ret void
248 define void @test3_minsize_optsize(ptr nocapture %A, ptr nocapture %B) nounwind optsize minsize noredzone {
249 ; DARWIN-LABEL: test3_minsize_optsize:
250 ; DARWIN:       ## %bb.0:
251 ; DARWIN-NEXT:    pushq $64
252 ; DARWIN-NEXT:    popq %rdx
253 ; DARWIN-NEXT:    jmp _memcpy ## TAILCALL
255 ; LINUX-LABEL: test3_minsize_optsize:
256 ; LINUX:       # %bb.0:
257 ; LINUX-NEXT:    pushq $64
258 ; LINUX-NEXT:    popq %rdx
259 ; LINUX-NEXT:    jmp memcpy@PLT # TAILCALL
261 ; LINUX-SKL-LABEL: test3_minsize_optsize:
262 ; LINUX-SKL:       # %bb.0:
263 ; LINUX-SKL-NEXT:    vmovups (%rsi), %ymm0
264 ; LINUX-SKL-NEXT:    vmovups 32(%rsi), %ymm1
265 ; LINUX-SKL-NEXT:    vmovups %ymm1, 32(%rdi)
266 ; LINUX-SKL-NEXT:    vmovups %ymm0, (%rdi)
267 ; LINUX-SKL-NEXT:    vzeroupper
268 ; LINUX-SKL-NEXT:    retq
270 ; LINUX-SKX-LABEL: test3_minsize_optsize:
271 ; LINUX-SKX:       # %bb.0:
272 ; LINUX-SKX-NEXT:    vmovups (%rsi), %ymm0
273 ; LINUX-SKX-NEXT:    vmovups 32(%rsi), %ymm1
274 ; LINUX-SKX-NEXT:    vmovups %ymm1, 32(%rdi)
275 ; LINUX-SKX-NEXT:    vmovups %ymm0, (%rdi)
276 ; LINUX-SKX-NEXT:    vzeroupper
277 ; LINUX-SKX-NEXT:    retq
279 ; LINUX-KNL-LABEL: test3_minsize_optsize:
280 ; LINUX-KNL:       # %bb.0:
281 ; LINUX-KNL-NEXT:    vmovups (%rsi), %zmm0
282 ; LINUX-KNL-NEXT:    vmovups %zmm0, (%rdi)
283 ; LINUX-KNL-NEXT:    retq
285 ; LINUX-AVX512BW-LABEL: test3_minsize_optsize:
286 ; LINUX-AVX512BW:       # %bb.0:
287 ; LINUX-AVX512BW-NEXT:    vmovups (%rsi), %zmm0
288 ; LINUX-AVX512BW-NEXT:    vmovups %zmm0, (%rdi)
289 ; LINUX-AVX512BW-NEXT:    vzeroupper
290 ; LINUX-AVX512BW-NEXT:    retq
291   tail call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 64, i1 false)
292   ret void
295 ; Large constant memcpy's should be inlined when not optimizing for size.
296 define void @test4(ptr nocapture %A, ptr nocapture %B) nounwind noredzone {
297 ; DARWIN-LABEL: test4:
298 ; DARWIN:       ## %bb.0: ## %entry
299 ; DARWIN-NEXT:    movq 56(%rsi), %rax
300 ; DARWIN-NEXT:    movq %rax, 56(%rdi)
301 ; DARWIN-NEXT:    movq 48(%rsi), %rax
302 ; DARWIN-NEXT:    movq %rax, 48(%rdi)
303 ; DARWIN-NEXT:    movq 40(%rsi), %rax
304 ; DARWIN-NEXT:    movq %rax, 40(%rdi)
305 ; DARWIN-NEXT:    movq 32(%rsi), %rax
306 ; DARWIN-NEXT:    movq %rax, 32(%rdi)
307 ; DARWIN-NEXT:    movq 24(%rsi), %rax
308 ; DARWIN-NEXT:    movq %rax, 24(%rdi)
309 ; DARWIN-NEXT:    movq 16(%rsi), %rax
310 ; DARWIN-NEXT:    movq %rax, 16(%rdi)
311 ; DARWIN-NEXT:    movq (%rsi), %rax
312 ; DARWIN-NEXT:    movq 8(%rsi), %rcx
313 ; DARWIN-NEXT:    movq %rcx, 8(%rdi)
314 ; DARWIN-NEXT:    movq %rax, (%rdi)
315 ; DARWIN-NEXT:    retq
317 ; LINUX-LABEL: test4:
318 ; LINUX:       # %bb.0: # %entry
319 ; LINUX-NEXT:    movq 56(%rsi), %rax
320 ; LINUX-NEXT:    movq %rax, 56(%rdi)
321 ; LINUX-NEXT:    movq 48(%rsi), %rax
322 ; LINUX-NEXT:    movq %rax, 48(%rdi)
323 ; LINUX-NEXT:    movq 40(%rsi), %rax
324 ; LINUX-NEXT:    movq %rax, 40(%rdi)
325 ; LINUX-NEXT:    movq 32(%rsi), %rax
326 ; LINUX-NEXT:    movq %rax, 32(%rdi)
327 ; LINUX-NEXT:    movq 24(%rsi), %rax
328 ; LINUX-NEXT:    movq %rax, 24(%rdi)
329 ; LINUX-NEXT:    movq 16(%rsi), %rax
330 ; LINUX-NEXT:    movq %rax, 16(%rdi)
331 ; LINUX-NEXT:    movq (%rsi), %rax
332 ; LINUX-NEXT:    movq 8(%rsi), %rcx
333 ; LINUX-NEXT:    movq %rcx, 8(%rdi)
334 ; LINUX-NEXT:    movq %rax, (%rdi)
335 ; LINUX-NEXT:    retq
337 ; LINUX-SKL-LABEL: test4:
338 ; LINUX-SKL:       # %bb.0: # %entry
339 ; LINUX-SKL-NEXT:    vmovups (%rsi), %ymm0
340 ; LINUX-SKL-NEXT:    vmovups 32(%rsi), %ymm1
341 ; LINUX-SKL-NEXT:    vmovups %ymm1, 32(%rdi)
342 ; LINUX-SKL-NEXT:    vmovups %ymm0, (%rdi)
343 ; LINUX-SKL-NEXT:    vzeroupper
344 ; LINUX-SKL-NEXT:    retq
346 ; LINUX-SKX-LABEL: test4:
347 ; LINUX-SKX:       # %bb.0: # %entry
348 ; LINUX-SKX-NEXT:    vmovups (%rsi), %ymm0
349 ; LINUX-SKX-NEXT:    vmovups 32(%rsi), %ymm1
350 ; LINUX-SKX-NEXT:    vmovups %ymm1, 32(%rdi)
351 ; LINUX-SKX-NEXT:    vmovups %ymm0, (%rdi)
352 ; LINUX-SKX-NEXT:    vzeroupper
353 ; LINUX-SKX-NEXT:    retq
355 ; LINUX-KNL-LABEL: test4:
356 ; LINUX-KNL:       # %bb.0: # %entry
357 ; LINUX-KNL-NEXT:    vmovups (%rsi), %zmm0
358 ; LINUX-KNL-NEXT:    vmovups %zmm0, (%rdi)
359 ; LINUX-KNL-NEXT:    retq
361 ; LINUX-AVX512BW-LABEL: test4:
362 ; LINUX-AVX512BW:       # %bb.0: # %entry
363 ; LINUX-AVX512BW-NEXT:    vmovups (%rsi), %zmm0
364 ; LINUX-AVX512BW-NEXT:    vmovups %zmm0, (%rdi)
365 ; LINUX-AVX512BW-NEXT:    vzeroupper
366 ; LINUX-AVX512BW-NEXT:    retq
367 entry:
368   tail call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 64, i1 false)
369   ret void
373 @.str = private unnamed_addr constant [30 x i8] c"\00aaaaaaaaaaaaaaaaaaaaaaaaaaaa\00", align 1
375 define void @test5(ptr nocapture %C) nounwind uwtable ssp {
376 ; DARWIN-LABEL: test5:
377 ; DARWIN:       ## %bb.0: ## %entry
378 ; DARWIN-NEXT:    movabsq $7016996765293437281, %rax ## imm = 0x6161616161616161
379 ; DARWIN-NEXT:    movq %rax, 8(%rdi)
380 ; DARWIN-NEXT:    movabsq $7016996765293437184, %rax ## imm = 0x6161616161616100
381 ; DARWIN-NEXT:    movq %rax, (%rdi)
382 ; DARWIN-NEXT:    retq
384 ; LINUX-LABEL: test5:
385 ; LINUX:       # %bb.0: # %entry
386 ; LINUX-NEXT:    movabsq $7016996765293437281, %rax # imm = 0x6161616161616161
387 ; LINUX-NEXT:    movq %rax, 8(%rdi)
388 ; LINUX-NEXT:    movabsq $7016996765293437184, %rax # imm = 0x6161616161616100
389 ; LINUX-NEXT:    movq %rax, (%rdi)
390 ; LINUX-NEXT:    retq
392 ; LINUX-SKL-LABEL: test5:
393 ; LINUX-SKL:       # %bb.0: # %entry
394 ; LINUX-SKL-NEXT:    vmovups .L.str(%rip), %xmm0
395 ; LINUX-SKL-NEXT:    vmovups %xmm0, (%rdi)
396 ; LINUX-SKL-NEXT:    retq
398 ; LINUX-SKX-LABEL: test5:
399 ; LINUX-SKX:       # %bb.0: # %entry
400 ; LINUX-SKX-NEXT:    vmovups .L.str(%rip), %xmm0
401 ; LINUX-SKX-NEXT:    vmovups %xmm0, (%rdi)
402 ; LINUX-SKX-NEXT:    retq
404 ; LINUX-KNL-LABEL: test5:
405 ; LINUX-KNL:       # %bb.0: # %entry
406 ; LINUX-KNL-NEXT:    vmovups .L.str(%rip), %xmm0
407 ; LINUX-KNL-NEXT:    vmovups %xmm0, (%rdi)
408 ; LINUX-KNL-NEXT:    retq
410 ; LINUX-AVX512BW-LABEL: test5:
411 ; LINUX-AVX512BW:       # %bb.0: # %entry
412 ; LINUX-AVX512BW-NEXT:    vmovups .L.str(%rip), %xmm0
413 ; LINUX-AVX512BW-NEXT:    vmovups %xmm0, (%rdi)
414 ; LINUX-AVX512BW-NEXT:    retq
415 entry:
416   tail call void @llvm.memcpy.p0.p0.i64(ptr %C, ptr @.str, i64 16, i1 false)
417   ret void
421 ; PR14896
422 @.str2 = private unnamed_addr constant [2 x i8] c"x\00", align 1
424 define void @test6() nounwind uwtable {
425 ; DARWIN-LABEL: test6:
426 ; DARWIN:       ## %bb.0: ## %entry
427 ; DARWIN-NEXT:    movw $0, 8
428 ; DARWIN-NEXT:    movq $120, 0
429 ; DARWIN-NEXT:    retq
431 ; LINUX-LABEL: test6:
432 ; LINUX:       # %bb.0: # %entry
433 ; LINUX-NEXT:    movw $0, 8
434 ; LINUX-NEXT:    movq $120, 0
435 ; LINUX-NEXT:    retq
437 ; LINUX-SKL-LABEL: test6:
438 ; LINUX-SKL:       # %bb.0: # %entry
439 ; LINUX-SKL-NEXT:    movw $0, 8
440 ; LINUX-SKL-NEXT:    movq $120, 0
441 ; LINUX-SKL-NEXT:    retq
443 ; LINUX-SKX-LABEL: test6:
444 ; LINUX-SKX:       # %bb.0: # %entry
445 ; LINUX-SKX-NEXT:    movw $0, 8
446 ; LINUX-SKX-NEXT:    movq $120, 0
447 ; LINUX-SKX-NEXT:    retq
449 ; LINUX-KNL-LABEL: test6:
450 ; LINUX-KNL:       # %bb.0: # %entry
451 ; LINUX-KNL-NEXT:    movw $0, 8
452 ; LINUX-KNL-NEXT:    movq $120, 0
453 ; LINUX-KNL-NEXT:    retq
455 ; LINUX-AVX512BW-LABEL: test6:
456 ; LINUX-AVX512BW:       # %bb.0: # %entry
457 ; LINUX-AVX512BW-NEXT:    movw $0, 8
458 ; LINUX-AVX512BW-NEXT:    movq $120, 0
459 ; LINUX-AVX512BW-NEXT:    retq
460 entry:
461   tail call void @llvm.memcpy.p0.p0.i64(ptr null, ptr @.str2, i64 10, i1 false)
462   ret void
465 define void @PR15348(ptr %a, ptr %b) {
466 ; Ensure that alignment of '0' in an @llvm.memcpy intrinsic results in
467 ; unaligned loads and stores.
468 ; DARWIN-LABEL: PR15348:
469 ; DARWIN:       ## %bb.0:
470 ; DARWIN-NEXT:    movzbl 16(%rsi), %eax
471 ; DARWIN-NEXT:    movb %al, 16(%rdi)
472 ; DARWIN-NEXT:    movq (%rsi), %rax
473 ; DARWIN-NEXT:    movq 8(%rsi), %rcx
474 ; DARWIN-NEXT:    movq %rcx, 8(%rdi)
475 ; DARWIN-NEXT:    movq %rax, (%rdi)
476 ; DARWIN-NEXT:    retq
478 ; LINUX-LABEL: PR15348:
479 ; LINUX:       # %bb.0:
480 ; LINUX-NEXT:    movzbl 16(%rsi), %eax
481 ; LINUX-NEXT:    movb %al, 16(%rdi)
482 ; LINUX-NEXT:    movq (%rsi), %rax
483 ; LINUX-NEXT:    movq 8(%rsi), %rcx
484 ; LINUX-NEXT:    movq %rcx, 8(%rdi)
485 ; LINUX-NEXT:    movq %rax, (%rdi)
486 ; LINUX-NEXT:    retq
488 ; LINUX-SKL-LABEL: PR15348:
489 ; LINUX-SKL:       # %bb.0:
490 ; LINUX-SKL-NEXT:    movzbl 16(%rsi), %eax
491 ; LINUX-SKL-NEXT:    movb %al, 16(%rdi)
492 ; LINUX-SKL-NEXT:    vmovups (%rsi), %xmm0
493 ; LINUX-SKL-NEXT:    vmovups %xmm0, (%rdi)
494 ; LINUX-SKL-NEXT:    retq
496 ; LINUX-SKX-LABEL: PR15348:
497 ; LINUX-SKX:       # %bb.0:
498 ; LINUX-SKX-NEXT:    movzbl 16(%rsi), %eax
499 ; LINUX-SKX-NEXT:    movb %al, 16(%rdi)
500 ; LINUX-SKX-NEXT:    vmovups (%rsi), %xmm0
501 ; LINUX-SKX-NEXT:    vmovups %xmm0, (%rdi)
502 ; LINUX-SKX-NEXT:    retq
504 ; LINUX-KNL-LABEL: PR15348:
505 ; LINUX-KNL:       # %bb.0:
506 ; LINUX-KNL-NEXT:    movzbl 16(%rsi), %eax
507 ; LINUX-KNL-NEXT:    movb %al, 16(%rdi)
508 ; LINUX-KNL-NEXT:    vmovups (%rsi), %xmm0
509 ; LINUX-KNL-NEXT:    vmovups %xmm0, (%rdi)
510 ; LINUX-KNL-NEXT:    retq
512 ; LINUX-AVX512BW-LABEL: PR15348:
513 ; LINUX-AVX512BW:       # %bb.0:
514 ; LINUX-AVX512BW-NEXT:    movzbl 16(%rsi), %eax
515 ; LINUX-AVX512BW-NEXT:    movb %al, 16(%rdi)
516 ; LINUX-AVX512BW-NEXT:    vmovups (%rsi), %xmm0
517 ; LINUX-AVX512BW-NEXT:    vmovups %xmm0, (%rdi)
518 ; LINUX-AVX512BW-NEXT:    retq
519   call void @llvm.memcpy.p0.p0.i64(ptr %a, ptr %b, i64 17, i1 false)
520   ret void
523 ; Memcpys from / to address space 256 should be lowered to appropriate loads /
524 ; stores if small enough.
525 define void @addrspace256(ptr addrspace(256) %a, ptr addrspace(256) %b) nounwind {
526 ; DARWIN-LABEL: addrspace256:
527 ; DARWIN:       ## %bb.0:
528 ; DARWIN-NEXT:    movq %gs:(%rsi), %rax
529 ; DARWIN-NEXT:    movq %gs:8(%rsi), %rcx
530 ; DARWIN-NEXT:    movq %rcx, %gs:8(%rdi)
531 ; DARWIN-NEXT:    movq %rax, %gs:(%rdi)
532 ; DARWIN-NEXT:    retq
534 ; LINUX-LABEL: addrspace256:
535 ; LINUX:       # %bb.0:
536 ; LINUX-NEXT:    movq %gs:(%rsi), %rax
537 ; LINUX-NEXT:    movq %gs:8(%rsi), %rcx
538 ; LINUX-NEXT:    movq %rcx, %gs:8(%rdi)
539 ; LINUX-NEXT:    movq %rax, %gs:(%rdi)
540 ; LINUX-NEXT:    retq
542 ; LINUX-SKL-LABEL: addrspace256:
543 ; LINUX-SKL:       # %bb.0:
544 ; LINUX-SKL-NEXT:    vmovups %gs:(%rsi), %xmm0
545 ; LINUX-SKL-NEXT:    vmovups %xmm0, %gs:(%rdi)
546 ; LINUX-SKL-NEXT:    retq
548 ; LINUX-SKX-LABEL: addrspace256:
549 ; LINUX-SKX:       # %bb.0:
550 ; LINUX-SKX-NEXT:    vmovups %gs:(%rsi), %xmm0
551 ; LINUX-SKX-NEXT:    vmovups %xmm0, %gs:(%rdi)
552 ; LINUX-SKX-NEXT:    retq
554 ; LINUX-KNL-LABEL: addrspace256:
555 ; LINUX-KNL:       # %bb.0:
556 ; LINUX-KNL-NEXT:    vmovups %gs:(%rsi), %xmm0
557 ; LINUX-KNL-NEXT:    vmovups %xmm0, %gs:(%rdi)
558 ; LINUX-KNL-NEXT:    retq
560 ; LINUX-AVX512BW-LABEL: addrspace256:
561 ; LINUX-AVX512BW:       # %bb.0:
562 ; LINUX-AVX512BW-NEXT:    vmovups %gs:(%rsi), %xmm0
563 ; LINUX-AVX512BW-NEXT:    vmovups %xmm0, %gs:(%rdi)
564 ; LINUX-AVX512BW-NEXT:    retq
565   tail call void @llvm.memcpy.p256.p256.i64(ptr addrspace(256) align 8 %a, ptr addrspace(256) align 8 %b, i64 16, i1 false)
566   ret void
569 !llvm.module.flags = !{!0}
570 !0 = !{i32 1, !"ProfileSummary", !1}
571 !1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
572 !2 = !{!"ProfileFormat", !"InstrProf"}
573 !3 = !{!"TotalCount", i64 10000}
574 !4 = !{!"MaxCount", i64 10}
575 !5 = !{!"MaxInternalCount", i64 1}
576 !6 = !{!"MaxFunctionCount", i64 1000}
577 !7 = !{!"NumCounts", i64 3}
578 !8 = !{!"NumFunctions", i64 3}
579 !9 = !{!"DetailedSummary", !10}
580 !10 = !{!11, !12, !13}
581 !11 = !{i32 10000, i64 100, i32 1}
582 !12 = !{i32 999000, i64 100, i32 1}
583 !13 = !{i32 999999, i64 1, i32 2}
584 !14 = !{!"function_entry_count", i64 0}