[ARM64] Support aggressive fastcc/tailcallopt breaking ABI by popping out argument...
[oota-llvm.git] / test / CodeGen / AArch64 / fastcc.ll
1 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -tailcallopt | FileCheck %s -check-prefix CHECK-TAIL
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=arm64-none-linux-gnu -tailcallopt | FileCheck %s -check-prefix CHECK-ARM64-TAIL
3 ; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %s
4 ; RUN: llc -verify-machineinstrs < %s -mtriple=arm64-none-linux-gnu | FileCheck --check-prefix=CHECK-ARM64 %s
5
6 ; Without tailcallopt fastcc still means the caller cleans up the
7 ; stack, so try to make sure this is respected.
8
9 define fastcc void @func_stack0() {
10 ; CHECK-LABEL: func_stack0:
11 ; CHECK: sub sp, sp, #48
12
13 ; CHECK-ARM64-LABEL: func_stack0:
14 ; CHECK-ARM64: stp x29, x30, [sp, #-16]!
15 ; CHECK-ARM64-NEXT: mov x29, sp
16 ; CHECK-ARM64-NEXT: sub sp, sp, #32
17
18 ; CHECK-TAIL-LABEL: func_stack0:
19 ; CHECK-TAIL: sub sp, sp, #48
20
21 ; CHECK-ARM64-TAIL-LABEL: func_stack0:
22 ; CHECK-ARM64-TAIL: stp x29, x30, [sp, #-16]!
23 ; CHECK-ARM64-TAIL-NEXT: mov x29, sp
24 ; CHECK-ARM64-TAIL-NEXT: sub sp, sp, #32
25
26
27   call fastcc void @func_stack8([8 x i32] undef, i32 42)
28 ; CHECK:  bl func_stack8
29 ; CHECK-NOT: sub sp, sp,
30
31 ; CHECK-ARM64:  bl func_stack8
32 ; CHECK-ARM64-NOT: sub sp, sp,
33
34 ; CHECK-TAIL: bl func_stack8
35 ; CHECK-TAIL: sub sp, sp, #16
36
37 ; CHECK-ARM64-TAIL: bl func_stack8
38 ; CHECK-ARM64-TAIL: sub sp, sp, #16
39
40
41   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
42 ; CHECK: bl func_stack32
43 ; CHECK-NOT: sub sp, sp,
44
45 ; CHECK-ARM64: bl func_stack32
46 ; CHECK-ARM64-NOT: sub sp, sp,
47
48 ; CHECK-TAIL: bl func_stack32
49 ; CHECK-TAIL: sub sp, sp, #32
50
51 ; CHECK-ARM64-TAIL: bl func_stack32
52 ; CHECK-ARM64-TAIL: sub sp, sp, #32
53
54
55   call fastcc void @func_stack0()
56 ; CHECK: bl func_stack0
57 ; CHECK-NOT: sub sp, sp
58
59 ; CHECK-ARM64: bl func_stack0
60 ; CHECK-ARM64-NOT: sub sp, sp
61
62 ; CHECK-TAIL: bl func_stack0
63 ; CHECK-TAIL-NOT: sub sp, sp
64
65 ; CHECK-ARM64-TAIL: bl func_stack0
66 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
67
68   ret void
69 ; CHECK: add sp, sp, #48
70 ; CHECK-NEXT: ret
71
72 ; CHECK-ARM64: mov sp, x29
73 ; CHECK-ARM64-NEXT: ldp     x29, x30, [sp], #16
74 ; CHECK-ARM64-NEXT: ret
75
76 ; CHECK-TAIL: add sp, sp, #48
77 ; CHECK-TAIL-NEXT: ret
78
79 ; CHECK-ARM64-TAIL: mov sp, x29
80 ; CHECK-ARM64-TAIL-NEXT: ldp     x29, x30, [sp], #16
81 ; CHECK-ARM64-TAIL-NEXT: ret
82 }
83
84 define fastcc void @func_stack8([8 x i32], i32 %stacked) {
85 ; CHECK-LABEL: func_stack8:
86 ; CHECK: sub sp, sp, #48
87
88 ; CHECK-ARM64-LABEL: func_stack8:
89 ; CHECK-ARM64: stp x29, x30, [sp, #-16]!
90 ; CHECK-ARM64: mov x29, sp
91 ; CHECK-ARM64: sub sp, sp, #32
92
93 ; CHECK-TAIL-LABEL: func_stack8:
94 ; CHECK-TAIL: sub sp, sp, #48
95
96 ; CHECK-ARM64-TAIL-LABEL: func_stack8:
97 ; CHECK-ARM64-TAIL: stp x29, x30, [sp, #-16]!
98 ; CHECK-ARM64-TAIL: mov x29, sp
99 ; CHECK-ARM64-TAIL: sub sp, sp, #32
100
101
102   call fastcc void @func_stack8([8 x i32] undef, i32 42)
103 ; CHECK:  bl func_stack8
104 ; CHECK-NOT: sub sp, sp,
105
106 ; CHECK-ARM64:  bl func_stack8
107 ; CHECK-ARM64-NOT: sub sp, sp,
108
109 ; CHECK-TAIL: bl func_stack8
110 ; CHECK-TAIL: sub sp, sp, #16
111
112 ; CHECK-ARM64-TAIL: bl func_stack8
113 ; CHECK-ARM64-TAIL: sub sp, sp, #16
114
115
116   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
117 ; CHECK: bl func_stack32
118 ; CHECK-NOT: sub sp, sp,
119
120 ; CHECK-ARM64: bl func_stack32
121 ; CHECK-ARM64-NOT: sub sp, sp,
122
123 ; CHECK-TAIL: bl func_stack32
124 ; CHECK-TAIL: sub sp, sp, #32
125
126 ; CHECK-ARM64-TAIL: bl func_stack32
127 ; CHECK-ARM64-TAIL: sub sp, sp, #32
128
129
130   call fastcc void @func_stack0()
131 ; CHECK: bl func_stack0
132 ; CHECK-NOT: sub sp, sp
133
134 ; CHECK-ARM64: bl func_stack0
135 ; CHECK-ARM64-NOT: sub sp, sp
136
137 ; CHECK-TAIL: bl func_stack0
138 ; CHECK-TAIL-NOT: sub sp, sp
139
140 ; CHECK-ARM64-TAIL: bl func_stack0
141 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
142
143   ret void
144 ; CHECK: add sp, sp, #48
145 ; CHECK-NEXT: ret
146
147 ; CHECK-ARM64: mov sp, x29
148 ; CHECK-ARM64-NEXT: ldp     x29, x30, [sp], #16
149 ; CHECK-ARM64-NEXT: ret
150
151 ; CHECK-TAIL: add sp, sp, #64
152 ; CHECK-TAIL-NEXT: ret
153
154 ; CHECK-ARM64-TAIL: mov sp, x29
155 ; CHECK-ARM64-TAIL-NEXT: ldp     x29, x30, [sp], #16
156 ; CHECK-ARM64-TAIL-NEXT: ret
157 }
158
159 define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
160 ; CHECK-LABEL: func_stack32:
161 ; CHECK: sub sp, sp, #48
162
163 ; CHECK-ARM64-LABEL: func_stack32:
164 ; CHECK-ARM64: mov x29, sp
165
166 ; CHECK-TAIL-LABEL: func_stack32:
167 ; CHECK-TAIL: sub sp, sp, #48
168
169 ; CHECK-ARM64-TAIL-LABEL: func_stack32:
170 ; CHECK-ARM64-TAIL: mov x29, sp
171
172
173   call fastcc void @func_stack8([8 x i32] undef, i32 42)
174 ; CHECK:  bl func_stack8
175 ; CHECK-NOT: sub sp, sp,
176
177 ; CHECK-ARM64:  bl func_stack8
178 ; CHECK-ARM64-NOT: sub sp, sp,
179
180 ; CHECK-TAIL: bl func_stack8
181 ; CHECK-TAIL: sub sp, sp, #16
182
183 ; CHECK-ARM64-TAIL: bl func_stack8
184 ; CHECK-ARM64-TAIL: sub sp, sp, #16
185
186
187   call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
188 ; CHECK: bl func_stack32
189 ; CHECK-NOT: sub sp, sp,
190
191 ; CHECK-ARM64: bl func_stack32
192 ; CHECK-ARM64-NOT: sub sp, sp,
193
194 ; CHECK-TAIL: bl func_stack32
195 ; CHECK-TAIL: sub sp, sp, #32
196
197 ; CHECK-ARM64-TAIL: bl func_stack32
198 ; CHECK-ARM64-TAIL: sub sp, sp, #32
199
200
201   call fastcc void @func_stack0()
202 ; CHECK: bl func_stack0
203 ; CHECK-NOT: sub sp, sp
204
205 ; CHECK-ARM64: bl func_stack0
206 ; CHECK-ARM64-NOT: sub sp, sp
207
208 ; CHECK-TAIL: bl func_stack0
209 ; CHECK-TAIL-NOT: sub sp, sp
210
211 ; CHECK-ARM64-TAIL: bl func_stack0
212 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
213
214   ret void
215 ; CHECK: add sp, sp, #48
216 ; CHECK-NEXT: ret
217
218 ; CHECK-ARM64: mov sp, x29
219 ; CHECK-ARM64-NEXT: ldp     x29, x30, [sp], #16
220 ; CHECK-ARM64-NEXT: ret
221
222 ; CHECK-TAIL: add sp, sp, #80
223 ; CHECK-TAIL-NEXT: ret
224
225 ; CHECK-ARM64-TAIL: mov sp, x29
226 ; CHECK-ARM64-TAIL-NEXT: ldp     x29, x30, [sp], #16
227 ; CHECK-ARM64-TAIL-NEXT: ret
228 }