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
4 ; Without tailcallopt fastcc still means the caller cleans up the
5 ; stack, so try to make sure this is respected.
7 define fastcc void @func_stack0() {
8 ; CHECK-LABEL: func_stack0:
10 ; CHECK-NEXT: sub sp, sp, #32
12 ; CHECK-TAIL-LABEL: func_stack0:
13 ; CHECK-TAIL: stp x29, x30, [sp, #-16]!
14 ; CHECK-TAIL-NEXT: mov x29, sp
15 ; CHECK-TAIL-NEXT: sub sp, sp, #32
18 call fastcc void @func_stack8([8 x i32] undef, i32 42)
19 ; CHECK: bl func_stack8
20 ; CHECK-NOT: sub sp, sp,
22 ; CHECK-TAIL: bl func_stack8
23 ; CHECK-TAIL: sub sp, sp, #16
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,
31 ; CHECK-TAIL: bl func_stack32
32 ; CHECK-TAIL: sub sp, sp, #32
35 call fastcc void @func_stack0()
36 ; CHECK: bl func_stack0
37 ; CHECK-NOT: sub sp, sp
40 ; CHECK-TAIL: bl func_stack0
41 ; CHECK-TAIL-NOT: sub sp, sp
45 ; CHECK-NEXT: ldp x29, x30, [sp], #16
49 ; CHECK-TAIL: mov sp, x29
50 ; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
51 ; CHECK-TAIL-NEXT: ret
54 define fastcc void @func_stack8([8 x i32], i32 %stacked) {
55 ; CHECK-LABEL: func_stack8:
56 ; CHECK: stp x29, x30, [sp, #-16]!
58 ; CHECK: sub sp, sp, #32
61 ; CHECK-TAIL-LABEL: func_stack8:
62 ; CHECK-TAIL: stp x29, x30, [sp, #-16]!
63 ; CHECK-TAIL: mov x29, sp
64 ; CHECK-TAIL: sub sp, sp, #32
67 call fastcc void @func_stack8([8 x i32] undef, i32 42)
68 ; CHECK: bl func_stack8
69 ; CHECK-NOT: sub sp, sp,
72 ; CHECK-TAIL: bl func_stack8
73 ; CHECK-TAIL: sub sp, sp, #16
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,
81 ; CHECK-TAIL: bl func_stack32
82 ; CHECK-TAIL: sub sp, sp, #32
85 call fastcc void @func_stack0()
86 ; CHECK: bl func_stack0
87 ; CHECK-NOT: sub sp, sp
89 ; CHECK-TAIL: bl func_stack0
90 ; CHECK-TAIL-NOT: sub sp, sp
94 ; CHECK-NEXT: ldp x29, x30, [sp], #16
98 ; CHECK-TAIL: mov sp, x29
99 ; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
100 ; CHECK-TAIL-NEXT: ret
103 define fastcc void @func_stack32([8 x i32], i128 %stacked0, i128 %stacked1) {
104 ; CHECK-LABEL: func_stack32:
107 ; CHECK-TAIL-LABEL: func_stack32:
108 ; CHECK-TAIL: mov x29, sp
111 call fastcc void @func_stack8([8 x i32] undef, i32 42)
112 ; CHECK: bl func_stack8
113 ; CHECK-NOT: sub sp, sp,
115 ; CHECK-TAIL: bl func_stack8
116 ; CHECK-TAIL: sub sp, sp, #16
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,
124 ; CHECK-TAIL: bl func_stack32
125 ; CHECK-TAIL: sub sp, sp, #32
128 call fastcc void @func_stack0()
129 ; CHECK: bl func_stack0
130 ; CHECK-NOT: sub sp, sp
133 ; CHECK-TAIL: bl func_stack0
134 ; CHECK-TAIL-NOT: sub sp, sp
138 ; CHECK-NEXT: ldp x29, x30, [sp], #16
141 ; CHECK-TAIL: mov sp, x29
142 ; CHECK-TAIL-NEXT: ldp x29, x30, [sp], #16
143 ; CHECK-TAIL-NEXT: ret