blob: a4cd37858ee4a8d53c625713a937c19ea490ba97 [file] [log] [blame]
Tim Northovere3d42362013-02-01 11:40:47 +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 Northovere0e3aef2013-01-31 12:12:40 +00009; CHECK: sub sp, sp, #48
10
Stephen Lind24ab202013-07-14 06:24:09 +000011; CHECK-TAIL-LABEL: func_stack0:
Tim Northovere0e3aef2013-01-31 12:12:40 +000012; CHECK-TAIL: sub sp, sp, #48
13
14
15 call fastcc void @func_stack8([8 x i32] undef, i32 42)
16; CHECK: bl func_stack8
17; CHECK-NOT: sub sp, sp,
18
19; CHECK-TAIL: bl func_stack8
20; CHECK-TAIL: sub sp, sp, #16
21
22
23 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
24; CHECK: bl func_stack32
25; CHECK-NOT: sub sp, sp,
26
27; CHECK-TAIL: bl func_stack32
28; CHECK-TAIL: sub sp, sp, #32
29
30
31 call fastcc void @func_stack0()
32; CHECK: bl func_stack0
33; CHECK-NOT: sub sp, sp
34
35; CHECK-TAIL: bl func_stack0
36; CHECK-TAIL-NOT: sub sp, sp
37
38 ret void
39; CHECK: add sp, sp, #48
40; CHECK-NEXT: ret
41
42; CHECK-TAIL: add sp, sp, #48
43; CHECK-TAIL-NEXT: ret
44
45}
46
47define fastcc void @func_stack8([8 x i32], i32 %stacked) {
Stephen Lind24ab202013-07-14 06:24:09 +000048; CHECK-LABEL: func_stack8:
Tim Northovere0e3aef2013-01-31 12:12:40 +000049; CHECK: sub sp, sp, #48
50
Stephen Lind24ab202013-07-14 06:24:09 +000051; CHECK-TAIL-LABEL: func_stack8:
Tim Northovere0e3aef2013-01-31 12:12:40 +000052; CHECK-TAIL: sub sp, sp, #48
53
54
55 call fastcc void @func_stack8([8 x i32] undef, i32 42)
56; CHECK: bl func_stack8
57; CHECK-NOT: sub sp, sp,
58
59; CHECK-TAIL: bl func_stack8
60; CHECK-TAIL: sub sp, sp, #16
61
62
63 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
64; CHECK: bl func_stack32
65; CHECK-NOT: sub sp, sp,
66
67; CHECK-TAIL: bl func_stack32
68; CHECK-TAIL: sub sp, sp, #32
69
70
71 call fastcc void @func_stack0()
72; CHECK: bl func_stack0
73; CHECK-NOT: sub sp, sp
74
75; CHECK-TAIL: bl func_stack0
76; CHECK-TAIL-NOT: sub sp, sp
77
78 ret void
79; CHECK: add sp, sp, #48
80; CHECK-NEXT: ret
81
82; CHECK-TAIL: add sp, sp, #64
83; CHECK-TAIL-NEXT: ret
84}
85
86define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
Stephen Lind24ab202013-07-14 06:24:09 +000087; CHECK-LABEL: func_stack32:
Tim Northovere0e3aef2013-01-31 12:12:40 +000088; CHECK: sub sp, sp, #48
89
Stephen Lind24ab202013-07-14 06:24:09 +000090; CHECK-TAIL-LABEL: func_stack32:
Tim Northovere0e3aef2013-01-31 12:12:40 +000091; CHECK-TAIL: sub sp, sp, #48
92
93
94 call fastcc void @func_stack8([8 x i32] undef, i32 42)
95; CHECK: bl func_stack8
96; CHECK-NOT: sub sp, sp,
97
98; CHECK-TAIL: bl func_stack8
99; CHECK-TAIL: sub sp, sp, #16
100
101
102 call fastcc void @func_stack32([8 x i32] undef, i128 0, i128 9)
103; CHECK: bl func_stack32
104; CHECK-NOT: sub sp, sp,
105
106; CHECK-TAIL: bl func_stack32
107; CHECK-TAIL: sub sp, sp, #32
108
109
110 call fastcc void @func_stack0()
111; CHECK: bl func_stack0
112; CHECK-NOT: sub sp, sp
113
114; CHECK-TAIL: bl func_stack0
115; CHECK-TAIL-NOT: sub sp, sp
116
117 ret void
118; CHECK: add sp, sp, #48
119; CHECK-NEXT: ret
120
121; CHECK-TAIL: add sp, sp, #80
122; CHECK-TAIL-NEXT: ret
123}