xref: /llvm-project/llvm/test/CodeGen/ARM/tail-call-results.ll (revision 1eb160fe8dc4c3359289853415730a73bfe4bb23)
1*1eb160feSEli Friedman; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*1eb160feSEli Friedman; RUN: llc -mtriple=thumbv7-linux-gnueabihf %s -o - | FileCheck %s
3*1eb160feSEli Friedman; RUN: llc -mtriple=thumbv7-linux-gnueabi %s -o - | FileCheck -check-prefix=SOFTFLOAT %s
4*1eb160feSEli Friedman; RUN: llc -mtriple=thumbv7-linux-gnueabihf -disable-tail-calls %s -o - | FileCheck -check-prefix=HF-NOTAIL %s
5*1eb160feSEli Friedman
6*1eb160feSEli Friedman; On hard-float targets, the register used to store a float return value
7*1eb160feSEli Friedman; changes if the call signature is varargs. The HF-NOTAIL lines are there to
8*1eb160feSEli Friedman; easily see when this happens.
9*1eb160feSEli Friedman
10*1eb160feSEli Friedmandeclare float @callee_float()
11*1eb160feSEli Friedmandeclare i32 @callee_int()
12*1eb160feSEli Friedmandeclare float @callee_float_vararg(i32, ...)
13*1eb160feSEli Friedmandeclare i32 @callee_int_vararg(i32, ...)
14*1eb160feSEli Friedman
15*1eb160feSEli Friedmandefine float @caller_float__callee_float() {
16*1eb160feSEli Friedman; CHECK-LABEL: caller_float__callee_float:
17*1eb160feSEli Friedman; CHECK:       @ %bb.0:
18*1eb160feSEli Friedman; CHECK-NEXT:    b callee_float
19*1eb160feSEli Friedman;
20*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_float__callee_float:
21*1eb160feSEli Friedman; SOFTFLOAT:       @ %bb.0:
22*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    b callee_float
23*1eb160feSEli Friedman;
24*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_float__callee_float:
25*1eb160feSEli Friedman; HF-NOTAIL:       @ %bb.0:
26*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    .save {r7, lr}
27*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    push {r7, lr}
28*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    bl callee_float
29*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    pop {r7, pc}
30*1eb160feSEli Friedman  %r = tail call float @callee_float()
31*1eb160feSEli Friedman  ret float %r
32*1eb160feSEli Friedman}
33*1eb160feSEli Friedman
34*1eb160feSEli Friedmandefine float @caller_float__callee_float_vararg() {
35*1eb160feSEli Friedman; CHECK-LABEL: caller_float__callee_float_vararg:
36*1eb160feSEli Friedman; CHECK:       @ %bb.0:
37*1eb160feSEli Friedman; CHECK-NEXT:    .save {r7, lr}
38*1eb160feSEli Friedman; CHECK-NEXT:    push {r7, lr}
39*1eb160feSEli Friedman; CHECK-NEXT:    movs r0, #0
40*1eb160feSEli Friedman; CHECK-NEXT:    bl callee_float_vararg
41*1eb160feSEli Friedman; CHECK-NEXT:    vmov s0, r0
42*1eb160feSEli Friedman; CHECK-NEXT:    pop {r7, pc}
43*1eb160feSEli Friedman;
44*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_float__callee_float_vararg:
45*1eb160feSEli Friedman; SOFTFLOAT:       @ %bb.0:
46*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    movs r0, #0
47*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    b callee_float_vararg
48*1eb160feSEli Friedman;
49*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_float__callee_float_vararg:
50*1eb160feSEli Friedman; HF-NOTAIL:       @ %bb.0:
51*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    .save {r7, lr}
52*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    push {r7, lr}
53*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    movs r0, #0
54*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    bl callee_float_vararg
55*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    vmov s0, r0
56*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    pop {r7, pc}
57*1eb160feSEli Friedman  %r = tail call float (i32, ...) @callee_float_vararg(i32 0)
58*1eb160feSEli Friedman  ret float %r
59*1eb160feSEli Friedman}
60*1eb160feSEli Friedman
61*1eb160feSEli Friedmandefine float @caller_float_vararg__callee_float(i32, ...) {
62*1eb160feSEli Friedman; CHECK-LABEL: caller_float_vararg__callee_float:
63*1eb160feSEli Friedman; CHECK:       @ %bb.0:
64*1eb160feSEli Friedman; CHECK-NEXT:    .save {r7, lr}
65*1eb160feSEli Friedman; CHECK-NEXT:    push {r7, lr}
66*1eb160feSEli Friedman; CHECK-NEXT:    bl callee_float
67*1eb160feSEli Friedman; CHECK-NEXT:    vmov r0, s0
68*1eb160feSEli Friedman; CHECK-NEXT:    pop {r7, pc}
69*1eb160feSEli Friedman;
70*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_float_vararg__callee_float:
71*1eb160feSEli Friedman; SOFTFLOAT:       @ %bb.0:
72*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    b callee_float
73*1eb160feSEli Friedman;
74*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_float_vararg__callee_float:
75*1eb160feSEli Friedman; HF-NOTAIL:       @ %bb.0:
76*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    .save {r7, lr}
77*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    push {r7, lr}
78*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    bl callee_float
79*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    vmov r0, s0
80*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    pop {r7, pc}
81*1eb160feSEli Friedman  %r = tail call float @callee_float()
82*1eb160feSEli Friedman  ret float %r
83*1eb160feSEli Friedman}
84*1eb160feSEli Friedman
85*1eb160feSEli Friedmandefine float @caller_float_vararg__callee_float_vararg(i32, ...) {
86*1eb160feSEli Friedman; CHECK-LABEL: caller_float_vararg__callee_float_vararg:
87*1eb160feSEli Friedman; CHECK:       @ %bb.0:
88*1eb160feSEli Friedman; CHECK-NEXT:    movs r0, #0
89*1eb160feSEli Friedman; CHECK-NEXT:    b callee_float_vararg
90*1eb160feSEli Friedman;
91*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_float_vararg__callee_float_vararg:
92*1eb160feSEli Friedman; SOFTFLOAT:       @ %bb.0:
93*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    movs r0, #0
94*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    b callee_float_vararg
95*1eb160feSEli Friedman;
96*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_float_vararg__callee_float_vararg:
97*1eb160feSEli Friedman; HF-NOTAIL:       @ %bb.0:
98*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    .save {r7, lr}
99*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    push {r7, lr}
100*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    movs r0, #0
101*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    bl callee_float_vararg
102*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    pop {r7, pc}
103*1eb160feSEli Friedman  %r = tail call float (i32, ...) @callee_float_vararg(i32 0)
104*1eb160feSEli Friedman  ret float %r
105*1eb160feSEli Friedman}
106*1eb160feSEli Friedman
107*1eb160feSEli Friedmandefine i32 @caller_int__callee_int() {
108*1eb160feSEli Friedman; CHECK-LABEL: caller_int__callee_int:
109*1eb160feSEli Friedman; CHECK:       @ %bb.0:
110*1eb160feSEli Friedman; CHECK-NEXT:    b callee_int
111*1eb160feSEli Friedman;
112*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_int__callee_int:
113*1eb160feSEli Friedman; SOFTFLOAT:       @ %bb.0:
114*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    b callee_int
115*1eb160feSEli Friedman;
116*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_int__callee_int:
117*1eb160feSEli Friedman; HF-NOTAIL:       @ %bb.0:
118*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    .save {r7, lr}
119*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    push {r7, lr}
120*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    bl callee_int
121*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    pop {r7, pc}
122*1eb160feSEli Friedman  %r = tail call i32 @callee_int()
123*1eb160feSEli Friedman  ret i32 %r
124*1eb160feSEli Friedman}
125*1eb160feSEli Friedman
126*1eb160feSEli Friedmandefine i32 @caller_int__callee_int_vararg() {
127*1eb160feSEli Friedman; CHECK-LABEL: caller_int__callee_int_vararg:
128*1eb160feSEli Friedman; CHECK:       @ %bb.0:
129*1eb160feSEli Friedman; CHECK-NEXT:    movs r0, #0
130*1eb160feSEli Friedman; CHECK-NEXT:    b callee_int_vararg
131*1eb160feSEli Friedman;
132*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_int__callee_int_vararg:
133*1eb160feSEli Friedman; SOFTFLOAT:       @ %bb.0:
134*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    movs r0, #0
135*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    b callee_int_vararg
136*1eb160feSEli Friedman;
137*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_int__callee_int_vararg:
138*1eb160feSEli Friedman; HF-NOTAIL:       @ %bb.0:
139*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    .save {r7, lr}
140*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    push {r7, lr}
141*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    movs r0, #0
142*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    bl callee_int_vararg
143*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    pop {r7, pc}
144*1eb160feSEli Friedman  %r = tail call i32 (i32, ...) @callee_int_vararg(i32 0)
145*1eb160feSEli Friedman  ret i32 %r
146*1eb160feSEli Friedman}
147*1eb160feSEli Friedman
148*1eb160feSEli Friedmandefine i32 @caller_int_vararg__callee_int(i32, ...) {
149*1eb160feSEli Friedman; CHECK-LABEL: caller_int_vararg__callee_int:
150*1eb160feSEli Friedman; CHECK:       @ %bb.0:
151*1eb160feSEli Friedman; CHECK-NEXT:    b callee_int
152*1eb160feSEli Friedman;
153*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_int_vararg__callee_int:
154*1eb160feSEli Friedman; SOFTFLOAT:       @ %bb.0:
155*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    b callee_int
156*1eb160feSEli Friedman;
157*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_int_vararg__callee_int:
158*1eb160feSEli Friedman; HF-NOTAIL:       @ %bb.0:
159*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    .save {r7, lr}
160*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    push {r7, lr}
161*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    bl callee_int
162*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    pop {r7, pc}
163*1eb160feSEli Friedman  %r = tail call i32 @callee_int()
164*1eb160feSEli Friedman  ret i32 %r
165*1eb160feSEli Friedman}
166*1eb160feSEli Friedman
167*1eb160feSEli Friedmandefine i32 @caller_int_vararg__callee_int_vararg(i32, ...) {
168*1eb160feSEli Friedman; CHECK-LABEL: caller_int_vararg__callee_int_vararg:
169*1eb160feSEli Friedman; CHECK:       @ %bb.0:
170*1eb160feSEli Friedman; CHECK-NEXT:    movs r0, #0
171*1eb160feSEli Friedman; CHECK-NEXT:    b callee_int_vararg
172*1eb160feSEli Friedman;
173*1eb160feSEli Friedman; SOFTFLOAT-LABEL: caller_int_vararg__callee_int_vararg:
174*1eb160feSEli Friedman; SOFTFLOAT:       @ %bb.0:
175*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    movs r0, #0
176*1eb160feSEli Friedman; SOFTFLOAT-NEXT:    b callee_int_vararg
177*1eb160feSEli Friedman;
178*1eb160feSEli Friedman; HF-NOTAIL-LABEL: caller_int_vararg__callee_int_vararg:
179*1eb160feSEli Friedman; HF-NOTAIL:       @ %bb.0:
180*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    .save {r7, lr}
181*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    push {r7, lr}
182*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    movs r0, #0
183*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    bl callee_int_vararg
184*1eb160feSEli Friedman; HF-NOTAIL-NEXT:    pop {r7, pc}
185*1eb160feSEli Friedman  %r = tail call i32 (i32, ...) @callee_int_vararg(i32 0)
186*1eb160feSEli Friedman  ret i32 %r
187*1eb160feSEli Friedman}
188