xref: /llvm-project/llvm/test/CodeGen/X86/pr38738.ll (revision 22df0886a1575439d0bf595f2b3a31c5255e9de6)
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
8
9
10%struct.params = type { double, double }
11
12define 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
20;
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
34;
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
42;
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
54;
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
62;
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
74entry:
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
82}
83
84define 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
96;
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
117;
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
129;
130; X86SSE2-LABEL: tryset:
131; X86SSE2:       # %bb.0:
132; X86SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
133; X86SSE2-NEXT:    xorps %xmm0, %xmm0
134; X86SSE2-NEXT:    movsd %xmm0, 56(%eax)
135; X86SSE2-NEXT:    movsd %xmm0, 48(%eax)
136; X86SSE2-NEXT:    movsd %xmm0, 40(%eax)
137; X86SSE2-NEXT:    movsd %xmm0, 32(%eax)
138; X86SSE2-NEXT:    movsd %xmm0, 24(%eax)
139; X86SSE2-NEXT:    movsd %xmm0, 16(%eax)
140; X86SSE2-NEXT:    movsd %xmm0, 8(%eax)
141; X86SSE2-NEXT:    movsd %xmm0, (%eax)
142; X86SSE2-NEXT:    retl
143;
144; X64AVX-LABEL: tryset:
145; X64AVX:       # %bb.0:
146; X64AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
147; X64AVX-NEXT:    vmovups %ymm0, 32(%rdi)
148; X64AVX-NEXT:    vmovups %ymm0, (%rdi)
149; X64AVX-NEXT:    vzeroupper
150; X64AVX-NEXT:    retq
151;
152; X86AVX-LABEL: tryset:
153; X86AVX:       # %bb.0:
154; X86AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
155; X86AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm0
156; X86AVX-NEXT:    vmovups %ymm0, 32(%eax)
157; X86AVX-NEXT:    vmovups %ymm0, (%eax)
158; X86AVX-NEXT:    vzeroupper
159; X86AVX-NEXT:    retl
160  tail call void @llvm.memset.p0.i64(ptr align 1 %x, i8 0, i64 64, i1 false)
161  ret void
162}
163
164define void @trycpy(ptr nocapture %x, ptr nocapture readonly %y) {
165; X64SSE-LABEL: trycpy:
166; X64SSE:       # %bb.0:
167; X64SSE-NEXT:    movq 24(%rsi), %rax
168; X64SSE-NEXT:    movq %rax, 24(%rdi)
169; X64SSE-NEXT:    movq 16(%rsi), %rax
170; X64SSE-NEXT:    movq %rax, 16(%rdi)
171; X64SSE-NEXT:    movq (%rsi), %rax
172; X64SSE-NEXT:    movq 8(%rsi), %rcx
173; X64SSE-NEXT:    movq %rcx, 8(%rdi)
174; X64SSE-NEXT:    movq %rax, (%rdi)
175; X64SSE-NEXT:    retq
176;
177; X86SSE-LABEL: trycpy:
178; X86SSE:       # %bb.0:
179; X86SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
180; X86SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
181; X86SSE-NEXT:    movl 28(%ecx), %edx
182; X86SSE-NEXT:    movl %edx, 28(%eax)
183; X86SSE-NEXT:    movl 24(%ecx), %edx
184; X86SSE-NEXT:    movl %edx, 24(%eax)
185; X86SSE-NEXT:    movl 20(%ecx), %edx
186; X86SSE-NEXT:    movl %edx, 20(%eax)
187; X86SSE-NEXT:    movl 16(%ecx), %edx
188; X86SSE-NEXT:    movl %edx, 16(%eax)
189; X86SSE-NEXT:    movl 12(%ecx), %edx
190; X86SSE-NEXT:    movl %edx, 12(%eax)
191; X86SSE-NEXT:    movl 8(%ecx), %edx
192; X86SSE-NEXT:    movl %edx, 8(%eax)
193; X86SSE-NEXT:    movl (%ecx), %edx
194; X86SSE-NEXT:    movl 4(%ecx), %ecx
195; X86SSE-NEXT:    movl %ecx, 4(%eax)
196; X86SSE-NEXT:    movl %edx, (%eax)
197; X86SSE-NEXT:    retl
198;
199; X64SSE2-LABEL: trycpy:
200; X64SSE2:       # %bb.0:
201; X64SSE2-NEXT:    movq 24(%rsi), %rax
202; X64SSE2-NEXT:    movq %rax, 24(%rdi)
203; X64SSE2-NEXT:    movq 16(%rsi), %rax
204; X64SSE2-NEXT:    movq %rax, 16(%rdi)
205; X64SSE2-NEXT:    movq (%rsi), %rax
206; X64SSE2-NEXT:    movq 8(%rsi), %rcx
207; X64SSE2-NEXT:    movq %rcx, 8(%rdi)
208; X64SSE2-NEXT:    movq %rax, (%rdi)
209; X64SSE2-NEXT:    retq
210;
211; X86SSE2-LABEL: trycpy:
212; X86SSE2:       # %bb.0:
213; X86SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
214; X86SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
215; X86SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
216; X86SSE2-NEXT:    movsd %xmm0, 24(%eax)
217; X86SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
218; X86SSE2-NEXT:    movsd %xmm0, 16(%eax)
219; X86SSE2-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
220; X86SSE2-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
221; X86SSE2-NEXT:    movsd %xmm1, 8(%eax)
222; X86SSE2-NEXT:    movsd %xmm0, (%eax)
223; X86SSE2-NEXT:    retl
224;
225; X64AVX-LABEL: trycpy:
226; X64AVX:       # %bb.0:
227; X64AVX-NEXT:    vmovups (%rsi), %ymm0
228; X64AVX-NEXT:    vmovups %ymm0, (%rdi)
229; X64AVX-NEXT:    vzeroupper
230; X64AVX-NEXT:    retq
231;
232; X86AVX-LABEL: trycpy:
233; X86AVX:       # %bb.0:
234; X86AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
235; X86AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
236; X86AVX-NEXT:    vmovups (%ecx), %ymm0
237; X86AVX-NEXT:    vmovups %ymm0, (%eax)
238; X86AVX-NEXT:    vzeroupper
239; X86AVX-NEXT:    retl
240  tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 %x, ptr align 1 %y, i64 32, i1 false)
241  ret void
242}
243
244declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1) argmemonly nounwind
245declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1) #2
246
247