[AArch64] Fix bug in prolog clobbering live reg when shrink wrapping.
[oota-llvm.git] / test / CodeGen / AArch64 / fastcc.ll
1 ; 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
3
4 ; Without tailcallopt fastcc still means the caller cleans up the
5 ; stack, so try to make sure this is respected.
6
7 define fastcc void @func_stack0() {
8 ; CHECK-LABEL: func_stack0:
9 ; CHECK: mov x29, sp
10 ; CHECK: str w{{[0-9]+}}, [sp, #-32]!
11
12 ; CHECK-TAIL-LABEL: func_stack0:
13 ; CHECK-TAIL: stp x29, x30, [sp, #-16]!
14 ; CHECK-TAIL-NEXT: mov x29, sp
15 ; CHECK-TAIL: str w{{[0-9]+}}, [sp, #-32]!
16
17
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
30
31 ; 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
39
40 ; CHECK-TAIL: bl func_stack0
41 ; CHECK-TAIL-NOT: sub sp, sp
42
43   ret void
44 ; CHECK: mov sp, x29
45 ; CHECK-NEXT: ldp     x29, x30, [sp], #16
46 ; CHECK-NEXT: ret
47
48
49 ; CHECK-TAIL: mov sp, x29
50 ; CHECK-TAIL-NEXT: ldp     x29, x30, [sp], #16
51 ; CHECK-TAIL-NEXT: ret
52 }
53
54 define fastcc void @func_stack8([8 x i32], i32 %stacked) {
55 ; CHECK-LABEL: func_stack8:
56 ; CHECK: stp x29, x30, [sp, #-16]!
57 ; CHECK: mov x29, sp
58 ; CHECK: str w{{[0-9]+}}, [sp, #-32]!
59
60
61 ; CHECK-TAIL-LABEL: func_stack8:
62 ; CHECK-TAIL: stp x29, x30, [sp, #-16]!
63 ; CHECK-TAIL: mov x29, sp
64 ; CHECK-TAIL: str w{{[0-9]+}}, [sp, #-32]!
65
66
67   call fastcc void @func_stack8([8 x i32] undef, i32 42)
68 ; CHECK:  bl func_stack8
69 ; CHECK-NOT: sub sp, sp,
70
71
72 ; 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
80
81 ; 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
93 ; CHECK: mov sp, x29
94 ; CHECK-NEXT: ldp     x29, x30, [sp], #16
95 ; CHECK-NEXT: ret
96
97
98 ; CHECK-TAIL: mov sp, x29
99 ; CHECK-TAIL-NEXT: ldp     x29, x30, [sp], #16
100 ; CHECK-TAIL-NEXT: ret
101 }
102
103 define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
104 ; CHECK-LABEL: func_stack32:
105 ; CHECK: mov x29, sp
106
107 ; CHECK-TAIL-LABEL: func_stack32:
108 ; CHECK-TAIL: mov x29, sp
109
110
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
123
124 ; 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
132
133 ; CHECK-TAIL: bl func_stack0
134 ; CHECK-TAIL-NOT: sub sp, sp
135
136   ret void
137 ; CHECK: mov sp, x29
138 ; CHECK-NEXT: ldp     x29, x30, [sp], #16
139 ; CHECK-NEXT: ret
140
141 ; CHECK-TAIL: mov sp, x29
142 ; CHECK-TAIL-NEXT: ldp     x29, x30, [sp], #16
143 ; CHECK-TAIL-NEXT: ret
144 }