1 ; RUN: llc -verify-machineinstrs < %s -mtriple=arm64-none-linux-gnu -tailcallopt | FileCheck %s -check-prefix CHECK-ARM64-TAIL
2 ; RUN: llc -verify-machineinstrs < %s -mtriple=arm64-none-linux-gnu | FileCheck --check-prefix=CHECK-ARM64 %s
4 ; Without tailcallopt fastcc still means the caller cleans up the
5 ; stack, so try to make sure this is respected.
7 define fastcc void @func_stack0() {
8 ; CHECK-LABEL: func_stack0:
9 ; CHECK: sub sp, sp, #48
11 ; CHECK-ARM64-LABEL: func_stack0:
12 ; CHECK-ARM64: stp x29, x30, [sp, #-16]!
13 ; CHECK-ARM64-NEXT: mov x29, sp
14 ; CHECK-ARM64-NEXT: sub sp, sp, #32
16 ; CHECK-TAIL-LABEL: func_stack0:
17 ; CHECK-TAIL: sub sp, sp, #48
19 ; CHECK-ARM64-TAIL-LABEL: func_stack0:
20 ; CHECK-ARM64-TAIL: stp x29, x30, [sp, #-16]!
21 ; CHECK-ARM64-TAIL-NEXT: mov x29, sp
22 ; CHECK-ARM64-TAIL-NEXT: sub sp, sp, #32
25 call fastcc void @func_stack8([8 x i32] undef, i32 42)
26 ; CHECK: bl func_stack8
27 ; CHECK-NOT: sub sp, sp,
29 ; CHECK-ARM64: bl func_stack8
30 ; CHECK-ARM64-NOT: sub sp, sp,
32 ; CHECK-TAIL: bl func_stack8
33 ; CHECK-TAIL: sub sp, sp, #16
35 ; CHECK-ARM64-TAIL: bl func_stack8
36 ; CHECK-ARM64-TAIL: sub sp, sp, #16
39 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
40 ; CHECK: bl func_stack32
41 ; CHECK-NOT: sub sp, sp,
43 ; CHECK-ARM64: bl func_stack32
44 ; CHECK-ARM64-NOT: sub sp, sp,
46 ; CHECK-TAIL: bl func_stack32
47 ; CHECK-TAIL: sub sp, sp, #32
49 ; CHECK-ARM64-TAIL: bl func_stack32
50 ; CHECK-ARM64-TAIL: sub sp, sp, #32
53 call fastcc void @func_stack0()
54 ; CHECK: bl func_stack0
55 ; CHECK-NOT: sub sp, sp
57 ; CHECK-ARM64: bl func_stack0
58 ; CHECK-ARM64-NOT: sub sp, sp
60 ; CHECK-TAIL: bl func_stack0
61 ; CHECK-TAIL-NOT: sub sp, sp
63 ; CHECK-ARM64-TAIL: bl func_stack0
64 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
67 ; CHECK: add sp, sp, #48
70 ; CHECK-ARM64: mov sp, x29
71 ; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
72 ; CHECK-ARM64-NEXT: ret
74 ; CHECK-TAIL: add sp, sp, #48
75 ; CHECK-TAIL-NEXT: ret
77 ; CHECK-ARM64-TAIL: mov sp, x29
78 ; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
79 ; CHECK-ARM64-TAIL-NEXT: ret
82 define fastcc void @func_stack8([8 x i32], i32 %stacked) {
83 ; CHECK-LABEL: func_stack8:
84 ; CHECK: sub sp, sp, #48
86 ; CHECK-ARM64-LABEL: func_stack8:
87 ; CHECK-ARM64: stp x29, x30, [sp, #-16]!
88 ; CHECK-ARM64: mov x29, sp
89 ; CHECK-ARM64: sub sp, sp, #32
91 ; CHECK-TAIL-LABEL: func_stack8:
92 ; CHECK-TAIL: sub sp, sp, #48
94 ; CHECK-ARM64-TAIL-LABEL: func_stack8:
95 ; CHECK-ARM64-TAIL: stp x29, x30, [sp, #-16]!
96 ; CHECK-ARM64-TAIL: mov x29, sp
97 ; CHECK-ARM64-TAIL: sub sp, sp, #32
100 call fastcc void @func_stack8([8 x i32] undef, i32 42)
101 ; CHECK: bl func_stack8
102 ; CHECK-NOT: sub sp, sp,
104 ; CHECK-ARM64: bl func_stack8
105 ; CHECK-ARM64-NOT: sub sp, sp,
107 ; CHECK-TAIL: bl func_stack8
108 ; CHECK-TAIL: sub sp, sp, #16
110 ; CHECK-ARM64-TAIL: bl func_stack8
111 ; CHECK-ARM64-TAIL: sub sp, sp, #16
114 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
115 ; CHECK: bl func_stack32
116 ; CHECK-NOT: sub sp, sp,
118 ; CHECK-ARM64: bl func_stack32
119 ; CHECK-ARM64-NOT: sub sp, sp,
121 ; CHECK-TAIL: bl func_stack32
122 ; CHECK-TAIL: sub sp, sp, #32
124 ; CHECK-ARM64-TAIL: bl func_stack32
125 ; CHECK-ARM64-TAIL: sub sp, sp, #32
128 call fastcc void @func_stack0()
129 ; CHECK: bl func_stack0
130 ; CHECK-NOT: sub sp, sp
132 ; CHECK-ARM64: bl func_stack0
133 ; CHECK-ARM64-NOT: sub sp, sp
135 ; CHECK-TAIL: bl func_stack0
136 ; CHECK-TAIL-NOT: sub sp, sp
138 ; CHECK-ARM64-TAIL: bl func_stack0
139 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
142 ; CHECK: add sp, sp, #48
145 ; CHECK-ARM64: mov sp, x29
146 ; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
147 ; CHECK-ARM64-NEXT: ret
149 ; CHECK-TAIL: add sp, sp, #64
150 ; CHECK-TAIL-NEXT: ret
152 ; CHECK-ARM64-TAIL: mov sp, x29
153 ; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
154 ; CHECK-ARM64-TAIL-NEXT: ret
157 define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
158 ; CHECK-LABEL: func_stack32:
159 ; CHECK: sub sp, sp, #48
161 ; CHECK-ARM64-LABEL: func_stack32:
162 ; CHECK-ARM64: mov x29, sp
164 ; CHECK-TAIL-LABEL: func_stack32:
165 ; CHECK-TAIL: sub sp, sp, #48
167 ; CHECK-ARM64-TAIL-LABEL: func_stack32:
168 ; CHECK-ARM64-TAIL: mov x29, sp
171 call fastcc void @func_stack8([8 x i32] undef, i32 42)
172 ; CHECK: bl func_stack8
173 ; CHECK-NOT: sub sp, sp,
175 ; CHECK-ARM64: bl func_stack8
176 ; CHECK-ARM64-NOT: sub sp, sp,
178 ; CHECK-TAIL: bl func_stack8
179 ; CHECK-TAIL: sub sp, sp, #16
181 ; CHECK-ARM64-TAIL: bl func_stack8
182 ; CHECK-ARM64-TAIL: sub sp, sp, #16
185 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
186 ; CHECK: bl func_stack32
187 ; CHECK-NOT: sub sp, sp,
189 ; CHECK-ARM64: bl func_stack32
190 ; CHECK-ARM64-NOT: sub sp, sp,
192 ; CHECK-TAIL: bl func_stack32
193 ; CHECK-TAIL: sub sp, sp, #32
195 ; CHECK-ARM64-TAIL: bl func_stack32
196 ; CHECK-ARM64-TAIL: sub sp, sp, #32
199 call fastcc void @func_stack0()
200 ; CHECK: bl func_stack0
201 ; CHECK-NOT: sub sp, sp
203 ; CHECK-ARM64: bl func_stack0
204 ; CHECK-ARM64-NOT: sub sp, sp
206 ; CHECK-TAIL: bl func_stack0
207 ; CHECK-TAIL-NOT: sub sp, sp
209 ; CHECK-ARM64-TAIL: bl func_stack0
210 ; CHECK-ARM64-TAIL-NOT: sub sp, sp
213 ; CHECK: add sp, sp, #48
216 ; CHECK-ARM64: mov sp, x29
217 ; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
218 ; CHECK-ARM64-NEXT: ret
220 ; CHECK-TAIL: add sp, sp, #80
221 ; CHECK-TAIL-NEXT: ret
223 ; CHECK-ARM64-TAIL: mov sp, x29
224 ; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
225 ; CHECK-ARM64-TAIL-NEXT: ret