blob: f021eb2326188e60443f4fd9c8a21fc414d0692b [file] [log] [blame]
Tim Northover3b0846e2014-05-24 12:50:23 +00001; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu -tailcallopt | FileCheck %s -check-prefix CHECK-TAIL
2; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-none-linux-gnu | FileCheck %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 Northover3b0846e2014-05-24 12:50:23 +00009; CHECK: mov x29, sp
Chad Rosier11c825f2015-09-30 19:44:40 +000010; CHECK: str w{{[0-9]+}}, [sp, #-32]!
Jiangning Liu09cc5642014-05-15 01:33:17 +000011
Stephen Lind24ab202013-07-14 06:24:09 +000012; CHECK-TAIL-LABEL: func_stack0:
Tim Northover3b0846e2014-05-24 12:50:23 +000013; CHECK-TAIL: stp x29, x30, [sp, #-16]!
14; CHECK-TAIL-NEXT: mov x29, sp
Chad Rosier11c825f2015-09-30 19:44:40 +000015; CHECK-TAIL: str w{{[0-9]+}}, [sp, #-32]!
Jiangning Liu09cc5642014-05-15 01:33:17 +000016
Tim Northovere0e3aef2013-01-31 12:12:40 +000017
18 call fastcc void @func_stack8([8 x i32] undef, i32 42)
19; CHECK: bl func_stack8
20; CHECK-NOT: sub sp, sp,
21
22; CHECK-TAIL: bl func_stack8
23; CHECK-TAIL: sub sp, sp, #16
24
25
26 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
27; CHECK: bl func_stack32
28; CHECK-NOT: sub sp, sp,
29
Jiangning Liu09cc5642014-05-15 01:33:17 +000030
Tim Northovere0e3aef2013-01-31 12:12:40 +000031; CHECK-TAIL: bl func_stack32
32; CHECK-TAIL: sub sp, sp, #32
33
34
35 call fastcc void @func_stack0()
36; CHECK: bl func_stack0
37; CHECK-NOT: sub sp, sp
38
Jiangning Liu09cc5642014-05-15 01:33:17 +000039
Tim Northovere0e3aef2013-01-31 12:12:40 +000040; CHECK-TAIL: bl func_stack0
41; CHECK-TAIL-NOT: sub sp, sp
42
43 ret void
Tim Northover3b0846e2014-05-24 12:50:23 +000044; CHECK: mov sp, x29
45; CHECK-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +000046; CHECK-NEXT: ret
47
Jiangning Liu09cc5642014-05-15 01:33:17 +000048
Tim Northover3b0846e2014-05-24 12:50:23 +000049; CHECK-TAIL: mov sp, x29
50; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +000051; CHECK-TAIL-NEXT: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +000052}
53
54define fastcc void @func_stack8([8 x i32], i32 %stacked) {
Stephen Lind24ab202013-07-14 06:24:09 +000055; CHECK-LABEL: func_stack8:
Tim Northover3b0846e2014-05-24 12:50:23 +000056; CHECK: stp x29, x30, [sp, #-16]!
57; CHECK: mov x29, sp
Chad Rosier11c825f2015-09-30 19:44:40 +000058; CHECK: str w{{[0-9]+}}, [sp, #-32]!
Tim Northovere0e3aef2013-01-31 12:12:40 +000059
Jiangning Liu09cc5642014-05-15 01:33:17 +000060
Stephen Lind24ab202013-07-14 06:24:09 +000061; CHECK-TAIL-LABEL: func_stack8:
Tim Northover3b0846e2014-05-24 12:50:23 +000062; CHECK-TAIL: stp x29, x30, [sp, #-16]!
63; CHECK-TAIL: mov x29, sp
Chad Rosier11c825f2015-09-30 19:44:40 +000064; CHECK-TAIL: str w{{[0-9]+}}, [sp, #-32]!
Jiangning Liu09cc5642014-05-15 01:33:17 +000065
Tim Northovere0e3aef2013-01-31 12:12:40 +000066
67 call fastcc void @func_stack8([8 x i32] undef, i32 42)
68; CHECK: bl func_stack8
69; CHECK-NOT: sub sp, sp,
70
Jiangning Liu09cc5642014-05-15 01:33:17 +000071
Tim Northovere0e3aef2013-01-31 12:12:40 +000072; CHECK-TAIL: bl func_stack8
73; CHECK-TAIL: sub sp, sp, #16
74
75
76 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
77; CHECK: bl func_stack32
78; CHECK-NOT: sub sp, sp,
79
Jiangning Liu09cc5642014-05-15 01:33:17 +000080
Tim Northovere0e3aef2013-01-31 12:12:40 +000081; CHECK-TAIL: bl func_stack32
82; CHECK-TAIL: sub sp, sp, #32
83
84
85 call fastcc void @func_stack0()
86; CHECK: bl func_stack0
87; CHECK-NOT: sub sp, sp
88
89; CHECK-TAIL: bl func_stack0
90; CHECK-TAIL-NOT: sub sp, sp
91
92 ret void
Tim Northover3b0846e2014-05-24 12:50:23 +000093; CHECK: mov sp, x29
94; CHECK-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +000095; CHECK-NEXT: ret
96
Jiangning Liu09cc5642014-05-15 01:33:17 +000097
Tim Northover3b0846e2014-05-24 12:50:23 +000098; CHECK-TAIL: mov sp, x29
99; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000100; CHECK-TAIL-NEXT: ret
101}
102
103define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
Stephen Lind24ab202013-07-14 06:24:09 +0000104; CHECK-LABEL: func_stack32:
Tim Northover3b0846e2014-05-24 12:50:23 +0000105; CHECK: mov x29, sp
Jiangning Liu09cc5642014-05-15 01:33:17 +0000106
Stephen Lind24ab202013-07-14 06:24:09 +0000107; CHECK-TAIL-LABEL: func_stack32:
Tim Northover3b0846e2014-05-24 12:50:23 +0000108; CHECK-TAIL: mov x29, sp
Jiangning Liu09cc5642014-05-15 01:33:17 +0000109
Tim Northovere0e3aef2013-01-31 12:12:40 +0000110
111 call fastcc void @func_stack8([8 x i32] undef, i32 42)
112; CHECK: bl func_stack8
113; CHECK-NOT: sub sp, sp,
114
115; CHECK-TAIL: bl func_stack8
116; CHECK-TAIL: sub sp, sp, #16
117
118
119 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
120; CHECK: bl func_stack32
121; CHECK-NOT: sub sp, sp,
122
Jiangning Liu09cc5642014-05-15 01:33:17 +0000123
Tim Northovere0e3aef2013-01-31 12:12:40 +0000124; CHECK-TAIL: bl func_stack32
125; CHECK-TAIL: sub sp, sp, #32
126
127
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
Tim Northovere0e3aef2013-01-31 12:12:40 +0000133; CHECK-TAIL: bl func_stack0
134; CHECK-TAIL-NOT: sub sp, sp
135
136 ret void
Tim Northover3b0846e2014-05-24 12:50:23 +0000137; CHECK: mov sp, x29
138; CHECK-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000139; CHECK-NEXT: ret
140
Tim Northover3b0846e2014-05-24 12:50:23 +0000141; CHECK-TAIL: mov sp, x29
142; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
Tim Northovere0e3aef2013-01-31 12:12:40 +0000143; CHECK-TAIL-NEXT: ret
Tim Northovere0e3aef2013-01-31 12:12:40 +0000144}