blob: c23d91ed361f84bc7c849550f74a71eedcf2c649 [file] [log] [blame]
Geoff Berry62c1a1e2016-03-02 17:58:31 +00001; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -disable-fp-elim -tailcallopt | FileCheck %s -check-prefix CHECK-TAIL
2; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -disable-fp-elim | FileCheck %s
3; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -disable-fp-elim -tailcallopt -aarch64-redzone | FileCheck %s -check-prefix CHECK-TAIL-RZ
Tim Northovere0e3aef2013-01-31 12:12:40 +00004
5; Without tailcallopt fastcc still means the caller cleans up the
6; stack, so try to make sure this is respected.
7
8define fastcc void @func_stack0() {
Stephen Lind24ab202013-07-14 06:24:09 +00009; CHECK-LABEL: func_stack0:
Tim Northover3b0846e2014-05-24 12:50:23 +000010; CHECK: mov x29, sp
Chad Rosier11c825f2015-09-30 19:44:40 +000011; CHECK: str w{{[0-9]+}}, [sp, #-32]!
Jiangning Liu09cc5642014-05-15 01:33:17 +000012
Stephen Lind24ab202013-07-14 06:24:09 +000013; CHECK-TAIL-LABEL: func_stack0:
Tim Northover3b0846e2014-05-24 12:50:23 +000014; CHECK-TAIL: stp x29, x30, [sp, #-16]!
15; CHECK-TAIL-NEXT: mov x29, sp
Chad Rosier11c825f2015-09-30 19:44:40 +000016; CHECK-TAIL: str w{{[0-9]+}}, [sp, #-32]!
Jiangning Liu09cc5642014-05-15 01:33:17 +000017
Tim Northovere0e3aef2013-01-31 12:12:40 +000018
19 call fastcc void @func_stack8([8 x i32] undef, i32 42)
20; CHECK: bl func_stack8
21; CHECK-NOT: sub sp, sp,
22
23; CHECK-TAIL: bl func_stack8
24; CHECK-TAIL: sub sp, sp, #16
25
26
27 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
28; CHECK: bl func_stack32
29; CHECK-NOT: sub sp, sp,
30
Jiangning Liu09cc5642014-05-15 01:33:17 +000031
Tim Northovere0e3aef2013-01-31 12:12:40 +000032; CHECK-TAIL: bl func_stack32
33; CHECK-TAIL: sub sp, sp, #32
34
35
36 call fastcc void @func_stack0()
37; CHECK: bl func_stack0
38; CHECK-NOT: sub sp, sp
39
Jiangning Liu09cc5642014-05-15 01:33:17 +000040
Tim Northovere0e3aef2013-01-31 12:12:40 +000041; CHECK-TAIL: bl func_stack0
42; CHECK-TAIL-NOT: sub sp, sp
43
44 ret void
Chad Rosier6d986552016-03-14 18:17:41 +000045; CHECK: add sp, sp, #32
Tim Northover3b0846e2014-05-24 12:50:23 +000046; CHECK-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +000047; CHECK-NEXT: ret
48
Jiangning Liu09cc5642014-05-15 01:33:17 +000049
Chad Rosier6d986552016-03-14 18:17:41 +000050; CHECK-TAIL: add sp, sp, #32
Tim Northover3b0846e2014-05-24 12:50:23 +000051; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +000052; CHECK-TAIL-NEXT: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +000053}
54
55define fastcc void @func_stack8([8 x i32], i32 %stacked) {
Stephen Lind24ab202013-07-14 06:24:09 +000056; CHECK-LABEL: func_stack8:
Tim Northover3b0846e2014-05-24 12:50:23 +000057; CHECK: stp x29, x30, [sp, #-16]!
58; CHECK: mov x29, sp
Chad Rosier11c825f2015-09-30 19:44:40 +000059; CHECK: str w{{[0-9]+}}, [sp, #-32]!
Tim Northovere0e3aef2013-01-31 12:12:40 +000060
Jiangning Liu09cc5642014-05-15 01:33:17 +000061
Stephen Lind24ab202013-07-14 06:24:09 +000062; CHECK-TAIL-LABEL: func_stack8:
Tim Northover3b0846e2014-05-24 12:50:23 +000063; CHECK-TAIL: stp x29, x30, [sp, #-16]!
64; CHECK-TAIL: mov x29, sp
Chad Rosier11c825f2015-09-30 19:44:40 +000065; CHECK-TAIL: str w{{[0-9]+}}, [sp, #-32]!
Jiangning Liu09cc5642014-05-15 01:33:17 +000066
Tim Northovere0e3aef2013-01-31 12:12:40 +000067
68 call fastcc void @func_stack8([8 x i32] undef, i32 42)
69; CHECK: bl func_stack8
70; CHECK-NOT: sub sp, sp,
71
Jiangning Liu09cc5642014-05-15 01:33:17 +000072
Tim Northovere0e3aef2013-01-31 12:12:40 +000073; CHECK-TAIL: bl func_stack8
74; CHECK-TAIL: sub sp, sp, #16
75
76
77 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
78; CHECK: bl func_stack32
79; CHECK-NOT: sub sp, sp,
80
Jiangning Liu09cc5642014-05-15 01:33:17 +000081
Tim Northovere0e3aef2013-01-31 12:12:40 +000082; CHECK-TAIL: bl func_stack32
83; CHECK-TAIL: sub sp, sp, #32
84
85
86 call fastcc void @func_stack0()
87; CHECK: bl func_stack0
88; CHECK-NOT: sub sp, sp
89
90; CHECK-TAIL: bl func_stack0
91; CHECK-TAIL-NOT: sub sp, sp
92
93 ret void
Chad Rosier6d986552016-03-14 18:17:41 +000094; CHECK: add sp, sp, #32
Tim Northover3b0846e2014-05-24 12:50:23 +000095; CHECK-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +000096; CHECK-NEXT: ret
97
Jiangning Liu09cc5642014-05-15 01:33:17 +000098
Chad Rosier6d986552016-03-14 18:17:41 +000099; CHECK-TAIL: add sp, sp, #32
Tim Northover3b0846e2014-05-24 12:50:23 +0000100; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
Geoff Berrya1c62692016-02-23 16:54:36 +0000101; CHECK-TAIL-NEXT: add sp, sp, #16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000102; CHECK-TAIL-NEXT: ret
103}
104
105define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
Stephen Lind24ab202013-07-14 06:24:09 +0000106; CHECK-LABEL: func_stack32:
Tim Northover3b0846e2014-05-24 12:50:23 +0000107; CHECK: mov x29, sp
Jiangning Liu09cc5642014-05-15 01:33:17 +0000108
Stephen Lind24ab202013-07-14 06:24:09 +0000109; CHECK-TAIL-LABEL: func_stack32:
Tim Northover3b0846e2014-05-24 12:50:23 +0000110; CHECK-TAIL: mov x29, sp
Jiangning Liu09cc5642014-05-15 01:33:17 +0000111
Tim Northovere0e3aef2013-01-31 12:12:40 +0000112
113 call fastcc void @func_stack8([8 x i32] undef, i32 42)
114; CHECK: bl func_stack8
115; CHECK-NOT: sub sp, sp,
116
117; CHECK-TAIL: bl func_stack8
118; CHECK-TAIL: sub sp, sp, #16
119
120
121 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
122; CHECK: bl func_stack32
123; CHECK-NOT: sub sp, sp,
124
Jiangning Liu09cc5642014-05-15 01:33:17 +0000125
Tim Northovere0e3aef2013-01-31 12:12:40 +0000126; CHECK-TAIL: bl func_stack32
127; CHECK-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
Jiangning Liu09cc5642014-05-15 01:33:17 +0000134
Tim Northovere0e3aef2013-01-31 12:12:40 +0000135; CHECK-TAIL: bl func_stack0
136; CHECK-TAIL-NOT: sub sp, sp
137
138 ret void
Chad Rosier6d986552016-03-14 18:17:41 +0000139; CHECK: add sp, sp, #32
Tim Northover3b0846e2014-05-24 12:50:23 +0000140; CHECK-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000141; CHECK-NEXT: ret
142
Chad Rosier6d986552016-03-14 18:17:41 +0000143; CHECK-TAIL: add sp, sp, #32
Tim Northover3b0846e2014-05-24 12:50:23 +0000144; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
Geoff Berrya1c62692016-02-23 16:54:36 +0000145; CHECK-TAIL-NEXT: add sp, sp, #32
Tim Northovere0e3aef2013-01-31 12:12:40 +0000146; CHECK-TAIL-NEXT: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +0000147}
Geoff Berrya1c62692016-02-23 16:54:36 +0000148
149; Check that arg stack pop is done after callee-save restore when no frame pointer is used.
150define fastcc void @func_stack32_leaf([8 x i32], i128 %stacked0, i128 %stacked1) {
151; CHECK-LABEL: func_stack32_leaf:
152; CHECK: str x20, [sp, #-16]!
153; CHECK: nop
154; CHECK-NEXT: //NO_APP
155; CHECK-NEXT: ldr x20, [sp], #16
156; CHECK-NEXT: ret
157
158; CHECK-TAIL-LABEL: func_stack32_leaf:
159; CHECK-TAIL: str x20, [sp, #-16]!
160; CHECK-TAIL: nop
161; CHECK-TAIL-NEXT: //NO_APP
162; CHECK-TAIL-NEXT: ldr x20, [sp], #16
163; CHECK-TAIL-NEXT: add sp, sp, #32
164; CHECK-TAIL-NEXT: ret
165
166; CHECK-TAIL-RZ-LABEL: func_stack32_leaf:
167; CHECK-TAIL-RZ: str x20, [sp, #-16]!
168; CHECK-TAIL-RZ-NOT: sub sp, sp
169; CHECK-TAIL-RZ: nop
170; CHECK-TAIL-RZ-NEXT: //NO_APP
171; CHECK-TAIL-RZ-NEXT: ldr x20, [sp], #16
172; CHECK-TAIL-RZ-NEXT: add sp, sp, #32
173; CHECK-TAIL-RZ-NEXT: ret
174
175 ; Make sure there is a callee-save register to save/restore.
176 call void asm sideeffect "nop", "~{x20}"() nounwind
177 ret void
178}
179
180; Check that arg stack pop is done after callee-save restore when no frame pointer is used.
181define fastcc void @func_stack32_leaf_local([8 x i32], i128 %stacked0, i128 %stacked1) {
182; CHECK-LABEL: func_stack32_leaf_local:
183; CHECK: str x20, [sp, #-16]!
184; CHECK-NEXT: sub sp, sp, #16
185; CHECK: nop
186; CHECK-NEXT: //NO_APP
187; CHECK-NEXT: add sp, sp, #16
188; CHECK-NEXT: ldr x20, [sp], #16
189; CHECK-NEXT: ret
190
191; CHECK-TAIL-LABEL: func_stack32_leaf_local:
192; CHECK-TAIL: str x20, [sp, #-16]!
193; CHECK-TAIL-NEXT: sub sp, sp, #16
194; CHECK-TAIL: nop
195; CHECK-TAIL-NEXT: //NO_APP
196; CHECK-TAIL-NEXT: add sp, sp, #16
197; CHECK-TAIL-NEXT: ldr x20, [sp], #16
198; CHECK-TAIL-NEXT: add sp, sp, #32
199; CHECK-TAIL-NEXT: ret
200
201; CHECK-TAIL-RZ-LABEL: func_stack32_leaf_local:
202; CHECK-TAIL-RZ: str x20, [sp, #-16]!
203; CHECK-TAIL-RZ-NOT: sub sp, sp
204; CHECK-TAIL-RZ: nop
205; CHECK-TAIL-RZ-NEXT: //NO_APP
206; CHECK-TAIL-RZ-NEXT: ldr x20, [sp], #16
207; CHECK-TAIL-RZ-NEXT: add sp, sp, #32
208; CHECK-TAIL-RZ-NEXT: ret
209
210 %val0 = alloca [2 x i64], align 8
211
212 ; Make sure there is a callee-save register to save/restore.
213 call void asm sideeffect "nop", "~{x20}"() nounwind
214 ret void
215}
216
217; Check that arg stack pop is done after callee-save restore when no frame pointer is used.
218define fastcc void @func_stack32_leaf_local_nocs([8 x i32], i128 %stacked0, i128 %stacked1) {
219; CHECK-LABEL: func_stack32_leaf_local_nocs:
220; CHECK: sub sp, sp, #16
221; CHECK: add sp, sp, #16
222; CHECK-NEXT: ret
223
224; CHECK-TAIL-LABEL: func_stack32_leaf_local_nocs:
225; CHECK-TAIL: sub sp, sp, #16
226; CHECK-TAIL: add sp, sp, #48
227; CHECK-TAIL-NEXT: ret
228
229; CHECK-TAIL-RZ-LABEL: func_stack32_leaf_local_nocs:
230; CHECK-TAIL-RZ: add sp, sp, #32
231; CHECK-TAIL-RZ-NEXT: ret
232
233 %val0 = alloca [2 x i64], align 8
234
235 ret void
236}