xref: /llvm-project/llvm/test/CodeGen/X86/zero-call-used-regs.ll (revision f800c1f3b207e7bcdc8b4c7192928d9a078242a0)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i386-unknown-linux-gnu | FileCheck %s --check-prefix=I386
3; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefix=X86-64
4
5@result = dso_local global i32 0, align 4
6
7define dso_local i32 @skip(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="skip" {
8; I386-LABEL: skip:
9; I386:       # %bb.0: # %entry
10; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
11; I386-NEXT:    retl
12;
13; X86-64-LABEL: skip:
14; X86-64:       # %bb.0: # %entry
15; X86-64-NEXT:    movl %edi, %eax
16; X86-64-NEXT:    retq
17
18entry:
19  ret i32 %x
20}
21
22define dso_local i32 @used_gpr_arg(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="used-gpr-arg" {
23; I386-LABEL: used_gpr_arg:
24; I386:       # %bb.0: # %entry
25; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
26; I386-NEXT:    retl
27;
28; X86-64-LABEL: used_gpr_arg:
29; X86-64:       # %bb.0: # %entry
30; X86-64-NEXT:    movl %edi, %eax
31; X86-64-NEXT:    xorl %edi, %edi
32; X86-64-NEXT:    retq
33
34entry:
35  ret i32 %x
36}
37
38define dso_local i32 @used_gpr(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="used-gpr" {
39; I386-LABEL: used_gpr:
40; I386:       # %bb.0: # %entry
41; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
42; I386-NEXT:    retl
43;
44; X86-64-LABEL: used_gpr:
45; X86-64:       # %bb.0: # %entry
46; X86-64-NEXT:    movl %edi, %eax
47; X86-64-NEXT:    xorl %edi, %edi
48; X86-64-NEXT:    retq
49
50entry:
51  ret i32 %x
52}
53
54define dso_local i32 @used_arg(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="used-arg" {
55; I386-LABEL: used_arg:
56; I386:       # %bb.0: # %entry
57; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
58; I386-NEXT:    retl
59;
60; X86-64-LABEL: used_arg:
61; X86-64:       # %bb.0: # %entry
62; X86-64-NEXT:    movl %edi, %eax
63; X86-64-NEXT:    xorl %edi, %edi
64; X86-64-NEXT:    retq
65
66entry:
67  ret i32 %x
68}
69
70define dso_local i32 @used(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="used" {
71; I386-LABEL: used:
72; I386:       # %bb.0: # %entry
73; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
74; I386-NEXT:    retl
75;
76; X86-64-LABEL: used:
77; X86-64:       # %bb.0: # %entry
78; X86-64-NEXT:    movl %edi, %eax
79; X86-64-NEXT:    xorl %edi, %edi
80; X86-64-NEXT:    retq
81
82entry:
83  ret i32 %x
84}
85
86define dso_local i32 @all_gpr_arg(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="all-gpr-arg" {
87; I386-LABEL: all_gpr_arg:
88; I386:       # %bb.0: # %entry
89; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
90; I386-NEXT:    xorl %ecx, %ecx
91; I386-NEXT:    xorl %edx, %edx
92; I386-NEXT:    retl
93;
94; X86-64-LABEL: all_gpr_arg:
95; X86-64:       # %bb.0: # %entry
96; X86-64-NEXT:    movl %edi, %eax
97; X86-64-NEXT:    xorl %ecx, %ecx
98; X86-64-NEXT:    xorl %edi, %edi
99; X86-64-NEXT:    xorl %edx, %edx
100; X86-64-NEXT:    xorl %esi, %esi
101; X86-64-NEXT:    xorl %r8d, %r8d
102; X86-64-NEXT:    xorl %r9d, %r9d
103; X86-64-NEXT:    retq
104
105entry:
106  ret i32 %x
107}
108
109define dso_local i32 @all_gpr(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="all-gpr" {
110; I386-LABEL: all_gpr:
111; I386:       # %bb.0: # %entry
112; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
113; I386-NEXT:    xorl %ecx, %ecx
114; I386-NEXT:    xorl %edx, %edx
115; I386-NEXT:    retl
116;
117; X86-64-LABEL: all_gpr:
118; X86-64:       # %bb.0: # %entry
119; X86-64-NEXT:    movl %edi, %eax
120; X86-64-NEXT:    xorl %ecx, %ecx
121; X86-64-NEXT:    xorl %edi, %edi
122; X86-64-NEXT:    xorl %edx, %edx
123; X86-64-NEXT:    xorl %esi, %esi
124; X86-64-NEXT:    xorl %r8d, %r8d
125; X86-64-NEXT:    xorl %r9d, %r9d
126; X86-64-NEXT:    xorl %r10d, %r10d
127; X86-64-NEXT:    xorl %r11d, %r11d
128; X86-64-NEXT:    retq
129
130entry:
131  ret i32 %x
132}
133
134define dso_local i32 @all_arg(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="all-arg" {
135; I386-LABEL: all_arg:
136; I386:       # %bb.0: # %entry
137; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
138; I386-NEXT:    xorl %ecx, %ecx
139; I386-NEXT:    xorl %edx, %edx
140; I386-NEXT:    retl
141;
142; X86-64-LABEL: all_arg:
143; X86-64:       # %bb.0: # %entry
144; X86-64-NEXT:    movl %edi, %eax
145; X86-64-NEXT:    xorl %ecx, %ecx
146; X86-64-NEXT:    xorl %edi, %edi
147; X86-64-NEXT:    xorl %edx, %edx
148; X86-64-NEXT:    xorl %esi, %esi
149; X86-64-NEXT:    xorl %r8d, %r8d
150; X86-64-NEXT:    xorl %r9d, %r9d
151; X86-64-NEXT:    xorps %xmm0, %xmm0
152; X86-64-NEXT:    xorps %xmm1, %xmm1
153; X86-64-NEXT:    xorps %xmm2, %xmm2
154; X86-64-NEXT:    xorps %xmm3, %xmm3
155; X86-64-NEXT:    xorps %xmm4, %xmm4
156; X86-64-NEXT:    xorps %xmm5, %xmm5
157; X86-64-NEXT:    xorps %xmm6, %xmm6
158; X86-64-NEXT:    xorps %xmm7, %xmm7
159; X86-64-NEXT:    retq
160
161entry:
162  ret i32 %x
163}
164
165define dso_local i32 @all(i32 returned %x) local_unnamed_addr #0 "zero-call-used-regs"="all" {
166; I386-LABEL: all:
167; I386:       # %bb.0: # %entry
168; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
169; I386-NEXT:    fldz
170; I386-NEXT:    fldz
171; I386-NEXT:    fldz
172; I386-NEXT:    fldz
173; I386-NEXT:    fldz
174; I386-NEXT:    fldz
175; I386-NEXT:    fldz
176; I386-NEXT:    fstp %st(0)
177; I386-NEXT:    fstp %st(0)
178; I386-NEXT:    fstp %st(0)
179; I386-NEXT:    fstp %st(0)
180; I386-NEXT:    fstp %st(0)
181; I386-NEXT:    fstp %st(0)
182; I386-NEXT:    fstp %st(0)
183; I386-NEXT:    xorl %ecx, %ecx
184; I386-NEXT:    xorl %edx, %edx
185; I386-NEXT:    xorps %xmm0, %xmm0
186; I386-NEXT:    xorps %xmm1, %xmm1
187; I386-NEXT:    xorps %xmm2, %xmm2
188; I386-NEXT:    xorps %xmm3, %xmm3
189; I386-NEXT:    xorps %xmm4, %xmm4
190; I386-NEXT:    xorps %xmm5, %xmm5
191; I386-NEXT:    xorps %xmm6, %xmm6
192; I386-NEXT:    xorps %xmm7, %xmm7
193; I386-NEXT:    retl
194;
195; X86-64-LABEL: all:
196; X86-64:       # %bb.0: # %entry
197; X86-64-NEXT:    movl %edi, %eax
198; X86-64-NEXT:    fldz
199; X86-64-NEXT:    fldz
200; X86-64-NEXT:    fldz
201; X86-64-NEXT:    fldz
202; X86-64-NEXT:    fldz
203; X86-64-NEXT:    fldz
204; X86-64-NEXT:    fldz
205; X86-64-NEXT:    fldz
206; X86-64-NEXT:    fstp %st(0)
207; X86-64-NEXT:    fstp %st(0)
208; X86-64-NEXT:    fstp %st(0)
209; X86-64-NEXT:    fstp %st(0)
210; X86-64-NEXT:    fstp %st(0)
211; X86-64-NEXT:    fstp %st(0)
212; X86-64-NEXT:    fstp %st(0)
213; X86-64-NEXT:    fstp %st(0)
214; X86-64-NEXT:    xorl %ecx, %ecx
215; X86-64-NEXT:    xorl %edi, %edi
216; X86-64-NEXT:    xorl %edx, %edx
217; X86-64-NEXT:    xorl %esi, %esi
218; X86-64-NEXT:    xorl %r8d, %r8d
219; X86-64-NEXT:    xorl %r9d, %r9d
220; X86-64-NEXT:    xorl %r10d, %r10d
221; X86-64-NEXT:    xorl %r11d, %r11d
222; X86-64-NEXT:    xorps %xmm0, %xmm0
223; X86-64-NEXT:    xorps %xmm1, %xmm1
224; X86-64-NEXT:    xorps %xmm2, %xmm2
225; X86-64-NEXT:    xorps %xmm3, %xmm3
226; X86-64-NEXT:    xorps %xmm4, %xmm4
227; X86-64-NEXT:    xorps %xmm5, %xmm5
228; X86-64-NEXT:    xorps %xmm6, %xmm6
229; X86-64-NEXT:    xorps %xmm7, %xmm7
230; X86-64-NEXT:    xorps %xmm8, %xmm8
231; X86-64-NEXT:    xorps %xmm9, %xmm9
232; X86-64-NEXT:    xorps %xmm10, %xmm10
233; X86-64-NEXT:    xorps %xmm11, %xmm11
234; X86-64-NEXT:    xorps %xmm12, %xmm12
235; X86-64-NEXT:    xorps %xmm13, %xmm13
236; X86-64-NEXT:    xorps %xmm14, %xmm14
237; X86-64-NEXT:    xorps %xmm15, %xmm15
238; X86-64-NEXT:    retq
239
240entry:
241  ret i32 %x
242}
243
244define dso_local void @tailcall(ptr %p) local_unnamed_addr #0 "zero-call-used-regs"="used-gpr" {
245; I386-LABEL: tailcall:
246; I386:       # %bb.0:
247; I386-NEXT:    movl {{[0-9]+}}(%esp), %eax
248; I386-NEXT:    jmpl *(%eax) # TAILCALL
249;
250; X86-64-LABEL: tailcall:
251; X86-64:       # %bb.0:
252; X86-64-NEXT:    jmpq *(%rdi) # TAILCALL
253  %c = load ptr, ptr %p
254  tail call void %c()
255  ret void
256}
257
258; Don't emit zeroing registers in "main" function.
259define dso_local i32 @main() local_unnamed_addr #1 {
260; I386-LABEL: main:
261; I386:       # %bb.0: # %entry
262; I386-NEXT:    xorl %eax, %eax
263; I386-NEXT:    retl
264;
265; X86-64-LABEL: main:
266; X86-64:       # %bb.0: # %entry
267; X86-64-NEXT:    xorl %eax, %eax
268; X86-64-NEXT:    retq
269
270entry:
271  ret i32 0
272}
273
274attributes #0 = { mustprogress nofree norecurse nosync nounwind readnone uwtable willreturn "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
275attributes #1 = { nofree norecurse nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
276