Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / pr38738.ll
blob753b7ce33d2bebac49b735539c33abf2cfcb40e3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -o - -mattr=-x87,+sse,-sse2 %s  | FileCheck --check-prefixes=X64SSE %s
3 ; RUN: llc -mtriple=i686-unknown-linux-gnu -o - -mattr=-x87,+sse,-sse2 %s    | FileCheck --check-prefixes=X86SSE %s
4 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -o - -mattr=-x87,+sse2,-sse3 %s | FileCheck --check-prefixes=X64SSE2 %s
5 ; RUN: llc -mtriple=i686-unknown-linux-gnu -o - -mattr=-x87,+sse2,-sse3 %s   | FileCheck --check-prefixes=X86SSE2 %s
6 ; RUN: llc -mtriple=x86_64-unknown-linux-gnu -o - -mattr=-x87,+avx,-avx2 %s  | FileCheck --check-prefixes=X64AVX %s
7 ; RUN: llc -mtriple=i686-unknown-linux-gnu -o - -mattr=-x87,+avx,-avx2 %s    | FileCheck --check-prefixes=X86AVX %s
10 %struct.params = type { double, double }
12 define i32 @pr38738() {
13 ; X64SSE-LABEL: pr38738:
14 ; X64SSE:       # %bb.0: # %entry
15 ; X64SSE-NEXT:    xorps %xmm0, %xmm0
16 ; X64SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
17 ; X64SSE-NEXT:    movl $0, -{{[0-9]+}}(%rsp)
18 ; X64SSE-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
19 ; X64SSE-NEXT:    retq
21 ; X86SSE-LABEL: pr38738:
22 ; X86SSE:       # %bb.0: # %entry
23 ; X86SSE-NEXT:    subl $28, %esp
24 ; X86SSE-NEXT:    .cfi_def_cfa_offset 32
25 ; X86SSE-NEXT:    movl $0, {{[0-9]+}}(%esp)
26 ; X86SSE-NEXT:    movl $0, {{[0-9]+}}(%esp)
27 ; X86SSE-NEXT:    movl $0, {{[0-9]+}}(%esp)
28 ; X86SSE-NEXT:    movl $0, (%esp)
29 ; X86SSE-NEXT:    movl $0, {{[0-9]+}}(%esp)
30 ; X86SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
31 ; X86SSE-NEXT:    addl $28, %esp
32 ; X86SSE-NEXT:    .cfi_def_cfa_offset 4
33 ; X86SSE-NEXT:    retl
35 ; X64SSE2-LABEL: pr38738:
36 ; X64SSE2:       # %bb.0: # %entry
37 ; X64SSE2-NEXT:    xorps %xmm0, %xmm0
38 ; X64SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
39 ; X64SSE2-NEXT:    movl $0, -{{[0-9]+}}(%rsp)
40 ; X64SSE2-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
41 ; X64SSE2-NEXT:    retq
43 ; X86SSE2-LABEL: pr38738:
44 ; X86SSE2:       # %bb.0: # %entry
45 ; X86SSE2-NEXT:    subl $44, %esp
46 ; X86SSE2-NEXT:    .cfi_def_cfa_offset 48
47 ; X86SSE2-NEXT:    xorps %xmm0, %xmm0
48 ; X86SSE2-NEXT:    movaps %xmm0, {{[0-9]+}}(%esp)
49 ; X86SSE2-NEXT:    movl $0, {{[0-9]+}}(%esp)
50 ; X86SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
51 ; X86SSE2-NEXT:    addl $44, %esp
52 ; X86SSE2-NEXT:    .cfi_def_cfa_offset 4
53 ; X86SSE2-NEXT:    retl
55 ; X64AVX-LABEL: pr38738:
56 ; X64AVX:       # %bb.0: # %entry
57 ; X64AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
58 ; X64AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
59 ; X64AVX-NEXT:    movl $0, -{{[0-9]+}}(%rsp)
60 ; X64AVX-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
61 ; X64AVX-NEXT:    retq
63 ; X86AVX-LABEL: pr38738:
64 ; X86AVX:       # %bb.0: # %entry
65 ; X86AVX-NEXT:    subl $44, %esp
66 ; X86AVX-NEXT:    .cfi_def_cfa_offset 48
67 ; X86AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
68 ; X86AVX-NEXT:    vmovaps %xmm0, {{[0-9]+}}(%esp)
69 ; X86AVX-NEXT:    movl $0, {{[0-9]+}}(%esp)
70 ; X86AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
71 ; X86AVX-NEXT:    addl $44, %esp
72 ; X86AVX-NEXT:    .cfi_def_cfa_offset 4
73 ; X86AVX-NEXT:    retl
74 entry:
75   %retval = alloca i32, align 4
76   %dlg_sys_param = alloca %struct.params, align 8
77   %total_active_bw = alloca float, align 4
78   call void @llvm.memset.p0.i64(ptr align 8 %dlg_sys_param, i8 0, i64 16, i1 false)
79   store float 0.000000e+00, ptr %total_active_bw, align 4
80   %0 = load i32, ptr %retval, align 4
81   ret i32 %0
84 define void @tryset(ptr nocapture %x) {
85 ; X64SSE-LABEL: tryset:
86 ; X64SSE:       # %bb.0:
87 ; X64SSE-NEXT:    movq $0, 56(%rdi)
88 ; X64SSE-NEXT:    movq $0, 48(%rdi)
89 ; X64SSE-NEXT:    movq $0, 40(%rdi)
90 ; X64SSE-NEXT:    movq $0, 32(%rdi)
91 ; X64SSE-NEXT:    movq $0, 24(%rdi)
92 ; X64SSE-NEXT:    movq $0, 16(%rdi)
93 ; X64SSE-NEXT:    movq $0, 8(%rdi)
94 ; X64SSE-NEXT:    movq $0, (%rdi)
95 ; X64SSE-NEXT:    retq
97 ; X86SSE-LABEL: tryset:
98 ; X86SSE:       # %bb.0:
99 ; X86SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
100 ; X86SSE-NEXT:    movl $0, 60(%eax)
101 ; X86SSE-NEXT:    movl $0, 56(%eax)
102 ; X86SSE-NEXT:    movl $0, 52(%eax)
103 ; X86SSE-NEXT:    movl $0, 48(%eax)
104 ; X86SSE-NEXT:    movl $0, 44(%eax)
105 ; X86SSE-NEXT:    movl $0, 40(%eax)
106 ; X86SSE-NEXT:    movl $0, 36(%eax)
107 ; X86SSE-NEXT:    movl $0, 32(%eax)
108 ; X86SSE-NEXT:    movl $0, 28(%eax)
109 ; X86SSE-NEXT:    movl $0, 24(%eax)
110 ; X86SSE-NEXT:    movl $0, 20(%eax)
111 ; X86SSE-NEXT:    movl $0, 16(%eax)
112 ; X86SSE-NEXT:    movl $0, 12(%eax)
113 ; X86SSE-NEXT:    movl $0, 8(%eax)
114 ; X86SSE-NEXT:    movl $0, 4(%eax)
115 ; X86SSE-NEXT:    movl $0, (%eax)
116 ; X86SSE-NEXT:    retl
118 ; X64SSE2-LABEL: tryset:
119 ; X64SSE2:       # %bb.0:
120 ; X64SSE2-NEXT:    movq $0, 56(%rdi)
121 ; X64SSE2-NEXT:    movq $0, 48(%rdi)
122 ; X64SSE2-NEXT:    movq $0, 40(%rdi)
123 ; X64SSE2-NEXT:    movq $0, 32(%rdi)
124 ; X64SSE2-NEXT:    movq $0, 24(%rdi)
125 ; X64SSE2-NEXT:    movq $0, 16(%rdi)
126 ; X64SSE2-NEXT:    movq $0, 8(%rdi)
127 ; X64SSE2-NEXT:    movq $0, (%rdi)
128 ; X64SSE2-NEXT:    retq
130 ; X86SSE2-LABEL: tryset:
131 ; X86SSE2:       # %bb.0:
132 ; X86SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
133 ; X86SSE2-NEXT:    movl $0, 4(%eax)
134 ; X86SSE2-NEXT:    movl $0, (%eax)
135 ; X86SSE2-NEXT:    movl $0, 12(%eax)
136 ; X86SSE2-NEXT:    movl $0, 8(%eax)
137 ; X86SSE2-NEXT:    movl $0, 20(%eax)
138 ; X86SSE2-NEXT:    movl $0, 16(%eax)
139 ; X86SSE2-NEXT:    movl $0, 28(%eax)
140 ; X86SSE2-NEXT:    movl $0, 24(%eax)
141 ; X86SSE2-NEXT:    movl $0, 36(%eax)
142 ; X86SSE2-NEXT:    movl $0, 32(%eax)
143 ; X86SSE2-NEXT:    movl $0, 44(%eax)
144 ; X86SSE2-NEXT:    movl $0, 40(%eax)
145 ; X86SSE2-NEXT:    movl $0, 52(%eax)
146 ; X86SSE2-NEXT:    movl $0, 48(%eax)
147 ; X86SSE2-NEXT:    movl $0, 60(%eax)
148 ; X86SSE2-NEXT:    movl $0, 56(%eax)
149 ; X86SSE2-NEXT:    retl
151 ; X64AVX-LABEL: tryset:
152 ; X64AVX:       # %bb.0:
153 ; X64AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
154 ; X64AVX-NEXT:    vmovups %ymm0, 32(%rdi)
155 ; X64AVX-NEXT:    vmovups %ymm0, (%rdi)
156 ; X64AVX-NEXT:    vzeroupper
157 ; X64AVX-NEXT:    retq
159 ; X86AVX-LABEL: tryset:
160 ; X86AVX:       # %bb.0:
161 ; X86AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
162 ; X86AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
163 ; X86AVX-NEXT:    vmovups %ymm0, 32(%eax)
164 ; X86AVX-NEXT:    vmovups %ymm0, (%eax)
165 ; X86AVX-NEXT:    vzeroupper
166 ; X86AVX-NEXT:    retl
167   tail call void @llvm.memset.p0.i64(ptr align 1 %x, i8 0, i64 64, i1 false)
168   ret void
171 define void @trycpy(ptr nocapture %x, ptr nocapture readonly %y) {
172 ; X64SSE-LABEL: trycpy:
173 ; X64SSE:       # %bb.0:
174 ; X64SSE-NEXT:    movq 24(%rsi), %rax
175 ; X64SSE-NEXT:    movq %rax, 24(%rdi)
176 ; X64SSE-NEXT:    movq 16(%rsi), %rax
177 ; X64SSE-NEXT:    movq %rax, 16(%rdi)
178 ; X64SSE-NEXT:    movq (%rsi), %rax
179 ; X64SSE-NEXT:    movq 8(%rsi), %rcx
180 ; X64SSE-NEXT:    movq %rcx, 8(%rdi)
181 ; X64SSE-NEXT:    movq %rax, (%rdi)
182 ; X64SSE-NEXT:    retq
184 ; X86SSE-LABEL: trycpy:
185 ; X86SSE:       # %bb.0:
186 ; X86SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
187 ; X86SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
188 ; X86SSE-NEXT:    movl 28(%ecx), %edx
189 ; X86SSE-NEXT:    movl %edx, 28(%eax)
190 ; X86SSE-NEXT:    movl 24(%ecx), %edx
191 ; X86SSE-NEXT:    movl %edx, 24(%eax)
192 ; X86SSE-NEXT:    movl 20(%ecx), %edx
193 ; X86SSE-NEXT:    movl %edx, 20(%eax)
194 ; X86SSE-NEXT:    movl 16(%ecx), %edx
195 ; X86SSE-NEXT:    movl %edx, 16(%eax)
196 ; X86SSE-NEXT:    movl 12(%ecx), %edx
197 ; X86SSE-NEXT:    movl %edx, 12(%eax)
198 ; X86SSE-NEXT:    movl 8(%ecx), %edx
199 ; X86SSE-NEXT:    movl %edx, 8(%eax)
200 ; X86SSE-NEXT:    movl (%ecx), %edx
201 ; X86SSE-NEXT:    movl 4(%ecx), %ecx
202 ; X86SSE-NEXT:    movl %ecx, 4(%eax)
203 ; X86SSE-NEXT:    movl %edx, (%eax)
204 ; X86SSE-NEXT:    retl
206 ; X64SSE2-LABEL: trycpy:
207 ; X64SSE2:       # %bb.0:
208 ; X64SSE2-NEXT:    movq 24(%rsi), %rax
209 ; X64SSE2-NEXT:    movq %rax, 24(%rdi)
210 ; X64SSE2-NEXT:    movq 16(%rsi), %rax
211 ; X64SSE2-NEXT:    movq %rax, 16(%rdi)
212 ; X64SSE2-NEXT:    movq (%rsi), %rax
213 ; X64SSE2-NEXT:    movq 8(%rsi), %rcx
214 ; X64SSE2-NEXT:    movq %rcx, 8(%rdi)
215 ; X64SSE2-NEXT:    movq %rax, (%rdi)
216 ; X64SSE2-NEXT:    retq
218 ; X86SSE2-LABEL: trycpy:
219 ; X86SSE2:       # %bb.0:
220 ; X86SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
221 ; X86SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
222 ; X86SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
223 ; X86SSE2-NEXT:    movsd %xmm0, 24(%eax)
224 ; X86SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
225 ; X86SSE2-NEXT:    movsd %xmm0, 16(%eax)
226 ; X86SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
227 ; X86SSE2-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
228 ; X86SSE2-NEXT:    movsd %xmm1, 8(%eax)
229 ; X86SSE2-NEXT:    movsd %xmm0, (%eax)
230 ; X86SSE2-NEXT:    retl
232 ; X64AVX-LABEL: trycpy:
233 ; X64AVX:       # %bb.0:
234 ; X64AVX-NEXT:    vmovups (%rsi), %ymm0
235 ; X64AVX-NEXT:    vmovups %ymm0, (%rdi)
236 ; X64AVX-NEXT:    vzeroupper
237 ; X64AVX-NEXT:    retq
239 ; X86AVX-LABEL: trycpy:
240 ; X86AVX:       # %bb.0:
241 ; X86AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
242 ; X86AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
243 ; X86AVX-NEXT:    vmovups (%ecx), %ymm0
244 ; X86AVX-NEXT:    vmovups %ymm0, (%eax)
245 ; X86AVX-NEXT:    vzeroupper
246 ; X86AVX-NEXT:    retl
247   tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %x, ptr align 1 %y, i64 32, i1 false)
248   ret void
251 declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1) argmemonly nounwind
252 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1) #2