blob: b641de0ee2902b2a53057157d2e61887b876329c [file] [log] [blame]
Jiangning Liu09cc5642014-05-15 01:33:17 +00001; RUN: llc -verify-machineinstrs < %s -mtriple=arm64-none-linux-gnu -tailcallopt | FileCheck %s -check-prefix CHECK-ARM64-TAIL
Jiangning Liu09cc5642014-05-15 01:33:17 +00002; RUN: llc -verify-machineinstrs < %s -mtriple=arm64-none-linux-gnu | FileCheck --check-prefix=CHECK-ARM64 %s
Tim Northovere0e3aef2013-01-31 12:12:40 +00003
4; Without tailcallopt fastcc still means the caller cleans up the
5; stack, so try to make sure this is respected.
6
7define fastcc void @func_stack0() {
Stephen Lind24ab202013-07-14 06:24:09 +00008; CHECK-LABEL: func_stack0:
Tim Northovere0e3aef2013-01-31 12:12:40 +00009; CHECK: sub sp, sp, #48
10
Jiangning Liu09cc5642014-05-15 01:33:17 +000011; 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
15
Stephen Lind24ab202013-07-14 06:24:09 +000016; CHECK-TAIL-LABEL: func_stack0:
Tim Northovere0e3aef2013-01-31 12:12:40 +000017; CHECK-TAIL: sub sp, sp, #48
18
Jiangning Liu09cc5642014-05-15 01:33:17 +000019; 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
23
Tim Northovere0e3aef2013-01-31 12:12:40 +000024
25 call fastcc void @func_stack8([8 x i32] undef, i32 42)
26; CHECK: bl func_stack8
27; CHECK-NOT: sub sp, sp,
28
Jiangning Liu09cc5642014-05-15 01:33:17 +000029; CHECK-ARM64: bl func_stack8
30; CHECK-ARM64-NOT: sub sp, sp,
31
Tim Northovere0e3aef2013-01-31 12:12:40 +000032; CHECK-TAIL: bl func_stack8
33; CHECK-TAIL: sub sp, sp, #16
34
Jiangning Liu09cc5642014-05-15 01:33:17 +000035; CHECK-ARM64-TAIL: bl func_stack8
36; CHECK-ARM64-TAIL: sub sp, sp, #16
37
Tim Northovere0e3aef2013-01-31 12:12:40 +000038
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,
42
Jiangning Liu09cc5642014-05-15 01:33:17 +000043; CHECK-ARM64: bl func_stack32
44; CHECK-ARM64-NOT: sub sp, sp,
45
Tim Northovere0e3aef2013-01-31 12:12:40 +000046; CHECK-TAIL: bl func_stack32
47; CHECK-TAIL: sub sp, sp, #32
48
Jiangning Liu09cc5642014-05-15 01:33:17 +000049; CHECK-ARM64-TAIL: bl func_stack32
50; CHECK-ARM64-TAIL: sub sp, sp, #32
51
Tim Northovere0e3aef2013-01-31 12:12:40 +000052
53 call fastcc void @func_stack0()
54; CHECK: bl func_stack0
55; CHECK-NOT: sub sp, sp
56
Jiangning Liu09cc5642014-05-15 01:33:17 +000057; CHECK-ARM64: bl func_stack0
58; CHECK-ARM64-NOT: sub sp, sp
59
Tim Northovere0e3aef2013-01-31 12:12:40 +000060; CHECK-TAIL: bl func_stack0
61; CHECK-TAIL-NOT: sub sp, sp
62
Jiangning Liu09cc5642014-05-15 01:33:17 +000063; CHECK-ARM64-TAIL: bl func_stack0
64; CHECK-ARM64-TAIL-NOT: sub sp, sp
65
Tim Northovere0e3aef2013-01-31 12:12:40 +000066 ret void
67; CHECK: add sp, sp, #48
68; CHECK-NEXT: ret
69
Jiangning Liu09cc5642014-05-15 01:33:17 +000070; CHECK-ARM64: mov sp, x29
71; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
72; CHECK-ARM64-NEXT: ret
73
Tim Northovere0e3aef2013-01-31 12:12:40 +000074; CHECK-TAIL: add sp, sp, #48
75; CHECK-TAIL-NEXT: ret
76
Jiangning Liu09cc5642014-05-15 01:33:17 +000077; CHECK-ARM64-TAIL: mov sp, x29
78; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
79; CHECK-ARM64-TAIL-NEXT: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +000080}
81
82define fastcc void @func_stack8([8 x i32], i32 %stacked) {
Stephen Lind24ab202013-07-14 06:24:09 +000083; CHECK-LABEL: func_stack8:
Tim Northovere0e3aef2013-01-31 12:12:40 +000084; CHECK: sub sp, sp, #48
85
Jiangning Liu09cc5642014-05-15 01:33:17 +000086; 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
90
Stephen Lind24ab202013-07-14 06:24:09 +000091; CHECK-TAIL-LABEL: func_stack8:
Tim Northovere0e3aef2013-01-31 12:12:40 +000092; CHECK-TAIL: sub sp, sp, #48
93
Jiangning Liu09cc5642014-05-15 01:33:17 +000094; 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
98
Tim Northovere0e3aef2013-01-31 12:12:40 +000099
100 call fastcc void @func_stack8([8 x i32] undef, i32 42)
101; CHECK: bl func_stack8
102; CHECK-NOT: sub sp, sp,
103
Jiangning Liu09cc5642014-05-15 01:33:17 +0000104; CHECK-ARM64: bl func_stack8
105; CHECK-ARM64-NOT: sub sp, sp,
106
Tim Northovere0e3aef2013-01-31 12:12:40 +0000107; CHECK-TAIL: bl func_stack8
108; CHECK-TAIL: sub sp, sp, #16
109
Jiangning Liu09cc5642014-05-15 01:33:17 +0000110; CHECK-ARM64-TAIL: bl func_stack8
111; CHECK-ARM64-TAIL: sub sp, sp, #16
112
Tim Northovere0e3aef2013-01-31 12:12:40 +0000113
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,
117
Jiangning Liu09cc5642014-05-15 01:33:17 +0000118; CHECK-ARM64: bl func_stack32
119; CHECK-ARM64-NOT: sub sp, sp,
120
Tim Northovere0e3aef2013-01-31 12:12:40 +0000121; CHECK-TAIL: bl func_stack32
122; CHECK-TAIL: sub sp, sp, #32
123
Jiangning Liu09cc5642014-05-15 01:33:17 +0000124; CHECK-ARM64-TAIL: bl func_stack32
125; CHECK-ARM64-TAIL: sub sp, sp, #32
126
Tim Northovere0e3aef2013-01-31 12:12:40 +0000127
128 call fastcc void @func_stack0()
129; CHECK: bl func_stack0
130; CHECK-NOT: sub sp, sp
131
Jiangning Liu09cc5642014-05-15 01:33:17 +0000132; CHECK-ARM64: bl func_stack0
133; CHECK-ARM64-NOT: sub sp, sp
134
Tim Northovere0e3aef2013-01-31 12:12:40 +0000135; CHECK-TAIL: bl func_stack0
136; CHECK-TAIL-NOT: sub sp, sp
137
Jiangning Liu09cc5642014-05-15 01:33:17 +0000138; CHECK-ARM64-TAIL: bl func_stack0
139; CHECK-ARM64-TAIL-NOT: sub sp, sp
140
Tim Northovere0e3aef2013-01-31 12:12:40 +0000141 ret void
142; CHECK: add sp, sp, #48
143; CHECK-NEXT: ret
144
Jiangning Liu09cc5642014-05-15 01:33:17 +0000145; CHECK-ARM64: mov sp, x29
146; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
147; CHECK-ARM64-NEXT: ret
148
Tim Northovere0e3aef2013-01-31 12:12:40 +0000149; CHECK-TAIL: add sp, sp, #64
150; CHECK-TAIL-NEXT: ret
Jiangning Liu09cc5642014-05-15 01:33:17 +0000151
152; CHECK-ARM64-TAIL: mov sp, x29
153; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
154; CHECK-ARM64-TAIL-NEXT: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +0000155}
156
157define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
Stephen Lind24ab202013-07-14 06:24:09 +0000158; CHECK-LABEL: func_stack32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000159; CHECK: sub sp, sp, #48
160
Jiangning Liu09cc5642014-05-15 01:33:17 +0000161; CHECK-ARM64-LABEL: func_stack32:
162; CHECK-ARM64: mov x29, sp
163
Stephen Lind24ab202013-07-14 06:24:09 +0000164; CHECK-TAIL-LABEL: func_stack32:
Tim Northovere0e3aef2013-01-31 12:12:40 +0000165; CHECK-TAIL: sub sp, sp, #48
166
Jiangning Liu09cc5642014-05-15 01:33:17 +0000167; CHECK-ARM64-TAIL-LABEL: func_stack32:
168; CHECK-ARM64-TAIL: mov x29, sp
169
Tim Northovere0e3aef2013-01-31 12:12:40 +0000170
171 call fastcc void @func_stack8([8 x i32] undef, i32 42)
172; CHECK: bl func_stack8
173; CHECK-NOT: sub sp, sp,
174
Jiangning Liu09cc5642014-05-15 01:33:17 +0000175; CHECK-ARM64: bl func_stack8
176; CHECK-ARM64-NOT: sub sp, sp,
177
Tim Northovere0e3aef2013-01-31 12:12:40 +0000178; CHECK-TAIL: bl func_stack8
179; CHECK-TAIL: sub sp, sp, #16
180
Jiangning Liu09cc5642014-05-15 01:33:17 +0000181; CHECK-ARM64-TAIL: bl func_stack8
182; CHECK-ARM64-TAIL: sub sp, sp, #16
183
Tim Northovere0e3aef2013-01-31 12:12:40 +0000184
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,
188
Jiangning Liu09cc5642014-05-15 01:33:17 +0000189; CHECK-ARM64: bl func_stack32
190; CHECK-ARM64-NOT: sub sp, sp,
191
Tim Northovere0e3aef2013-01-31 12:12:40 +0000192; CHECK-TAIL: bl func_stack32
193; CHECK-TAIL: sub sp, sp, #32
194
Jiangning Liu09cc5642014-05-15 01:33:17 +0000195; CHECK-ARM64-TAIL: bl func_stack32
196; CHECK-ARM64-TAIL: sub sp, sp, #32
197
Tim Northovere0e3aef2013-01-31 12:12:40 +0000198
199 call fastcc void @func_stack0()
200; CHECK: bl func_stack0
201; CHECK-NOT: sub sp, sp
202
Jiangning Liu09cc5642014-05-15 01:33:17 +0000203; CHECK-ARM64: bl func_stack0
204; CHECK-ARM64-NOT: sub sp, sp
205
Tim Northovere0e3aef2013-01-31 12:12:40 +0000206; CHECK-TAIL: bl func_stack0
207; CHECK-TAIL-NOT: sub sp, sp
208
Jiangning Liu09cc5642014-05-15 01:33:17 +0000209; CHECK-ARM64-TAIL: bl func_stack0
210; CHECK-ARM64-TAIL-NOT: sub sp, sp
211
Tim Northovere0e3aef2013-01-31 12:12:40 +0000212 ret void
213; CHECK: add sp, sp, #48
214; CHECK-NEXT: ret
215
Jiangning Liu09cc5642014-05-15 01:33:17 +0000216; CHECK-ARM64: mov sp, x29
217; CHECK-ARM64-NEXT: ldp x29, x30, [sp], #16
218; CHECK-ARM64-NEXT: ret
219
Tim Northovere0e3aef2013-01-31 12:12:40 +0000220; CHECK-TAIL: add sp, sp, #80
221; CHECK-TAIL-NEXT: ret
Jiangning Liu09cc5642014-05-15 01:33:17 +0000222
223; CHECK-ARM64-TAIL: mov sp, x29
224; CHECK-ARM64-TAIL-NEXT: ldp x29, x30, [sp], #16
225; CHECK-ARM64-TAIL-NEXT: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +0000226}