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
6 ; Without tailcallopt fastcc still means the caller cleans up the
7 ; stack, so try to make sure this is respected.
9 define fastcc void @func_stack0() {
10 ; CHECK-LABEL: func_stack0:
11 ; CHECK: sub sp, sp, #48
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
18 ; CHECK-TAIL-LABEL: func_stack0:
19 ; CHECK-TAIL: sub sp, sp, #48
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
27 call fastcc void @func_stack8([8 x i32] undef, i32 42)
28 ; CHECK: bl func_stack8
29 ; CHECK-NOT: sub sp, sp,
31 ; CHECK-ARM64: bl func_stack8
32 ; CHECK-ARM64-NOT: sub sp, sp,
34 ; CHECK-TAIL: bl func_stack8
35 ; CHECK-TAIL: sub sp, sp, #16
37 ; CHECK-ARM64-TAIL: bl func_stack8
38 ; CHECK-ARM64-TAIL: sub sp, sp, #16
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,
45 ; CHECK-ARM64: bl func_stack32
46 ; CHECK-ARM64-NOT: sub sp, sp,
48 ; CHECK-TAIL: bl func_stack32
49 ; CHECK-TAIL: sub sp, sp, #32
51 ; CHECK-ARM64-TAIL: bl func_stack32
52 ; CHECK-ARM64-TAIL: sub sp, sp, #32
55 call fastcc void @func_stack0()
56 ; CHECK: bl func_stack0
57 ; CHECK-NOT: sub sp, sp
59 ; CHECK-ARM64: bl func_stack0
60 ; CHECK-ARM64-NOT: sub sp, sp
62 ; CHECK-TAIL: bl func_stack0
63 ; CHECK-TAIL-NOT: sub sp, sp
65 ; CHECK-ARM64-TAIL: bl func_stack0
66 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
69 ; CHECK: add sp, sp, #48
72 ; CHECK-ARM64: mov sp, x29
73 ; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
74 ; CHECK-ARM64-NEXT: ret
76 ; CHECK-TAIL: add sp, sp, #48
77 ; CHECK-TAIL-NEXT: ret
79 ; CHECK-ARM64-TAIL: mov sp, x29
80 ; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
81 ; CHECK-ARM64-TAIL-NEXT: ret
84 define fastcc void @func_stack8([8 x i32], i32 %stacked) {
85 ; CHECK-LABEL: func_stack8:
86 ; CHECK: sub sp, sp, #48
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
93 ; CHECK-TAIL-LABEL: func_stack8:
94 ; CHECK-TAIL: sub sp, sp, #48
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
102 call fastcc void @func_stack8([8 x i32] undef, i32 42)
103 ; CHECK: bl func_stack8
104 ; CHECK-NOT: sub sp, sp,
106 ; CHECK-ARM64: bl func_stack8
107 ; CHECK-ARM64-NOT: sub sp, sp,
109 ; CHECK-TAIL: bl func_stack8
110 ; CHECK-TAIL: sub sp, sp, #16
112 ; CHECK-ARM64-TAIL: bl func_stack8
113 ; CHECK-ARM64-TAIL: sub sp, sp, #16
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,
120 ; CHECK-ARM64: bl func_stack32
121 ; CHECK-ARM64-NOT: sub sp, sp,
123 ; CHECK-TAIL: bl func_stack32
124 ; CHECK-TAIL: sub sp, sp, #32
126 ; CHECK-ARM64-TAIL: bl func_stack32
127 ; CHECK-ARM64-TAIL: sub sp, sp, #32
130 call fastcc void @func_stack0()
131 ; CHECK: bl func_stack0
132 ; CHECK-NOT: sub sp, sp
134 ; CHECK-ARM64: bl func_stack0
135 ; CHECK-ARM64-NOT: sub sp, sp
137 ; CHECK-TAIL: bl func_stack0
138 ; CHECK-TAIL-NOT: sub sp, sp
140 ; CHECK-ARM64-TAIL: bl func_stack0
141 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
144 ; CHECK: add sp, sp, #48
147 ; CHECK-ARM64: mov sp, x29
148 ; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
149 ; CHECK-ARM64-NEXT: ret
151 ; CHECK-TAIL: add sp, sp, #64
152 ; CHECK-TAIL-NEXT: ret
154 ; CHECK-ARM64-TAIL: mov sp, x29
155 ; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
156 ; CHECK-ARM64-TAIL-NEXT: ret
159 define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
160 ; CHECK-LABEL: func_stack32:
161 ; CHECK: sub sp, sp, #48
163 ; CHECK-ARM64-LABEL: func_stack32:
164 ; CHECK-ARM64: mov x29, sp
166 ; CHECK-TAIL-LABEL: func_stack32:
167 ; CHECK-TAIL: sub sp, sp, #48
169 ; CHECK-ARM64-TAIL-LABEL: func_stack32:
170 ; CHECK-ARM64-TAIL: mov x29, sp
173 call fastcc void @func_stack8([8 x i32] undef, i32 42)
174 ; CHECK: bl func_stack8
175 ; CHECK-NOT: sub sp, sp,
177 ; CHECK-ARM64: bl func_stack8
178 ; CHECK-ARM64-NOT: sub sp, sp,
180 ; CHECK-TAIL: bl func_stack8
181 ; CHECK-TAIL: sub sp, sp, #16
183 ; CHECK-ARM64-TAIL: bl func_stack8
184 ; CHECK-ARM64-TAIL: sub sp, sp, #16
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,
191 ; CHECK-ARM64: bl func_stack32
192 ; CHECK-ARM64-NOT: sub sp, sp,
194 ; CHECK-TAIL: bl func_stack32
195 ; CHECK-TAIL: sub sp, sp, #32
197 ; CHECK-ARM64-TAIL: bl func_stack32
198 ; CHECK-ARM64-TAIL: sub sp, sp, #32
201 call fastcc void @func_stack0()
202 ; CHECK: bl func_stack0
203 ; CHECK-NOT: sub sp, sp
205 ; CHECK-ARM64: bl func_stack0
206 ; CHECK-ARM64-NOT: sub sp, sp
208 ; CHECK-TAIL: bl func_stack0
209 ; CHECK-TAIL-NOT: sub sp, sp
211 ; CHECK-ARM64-TAIL: bl func_stack0
212 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
215 ; CHECK: add sp, sp, #48
218 ; CHECK-ARM64: mov sp, x29
219 ; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
220 ; CHECK-ARM64-NEXT: ret
222 ; CHECK-TAIL: add sp, sp, #80
223 ; CHECK-TAIL-NEXT: ret
225 ; CHECK-ARM64-TAIL: mov sp, x29
226 ; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
227 ; CHECK-ARM64-TAIL-NEXT: ret