xref: /aosp_15_r20/external/llvm/test/CodeGen/Mips/tailcall.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -relocation-model=pic -enable-mips-tail-calls \
2*9880d681SAndroid Build Coastguard Worker; RUN:     -verify-machineinstrs < %s | FileCheck %s -check-prefix=PIC32
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -relocation-model=static -enable-mips-tail-calls \
4*9880d681SAndroid Build Coastguard Worker; RUN:     -verify-machineinstrs < %s | FileCheck %s -check-prefix=STATIC32
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips64r2 -enable-mips-tail-calls \
6*9880d681SAndroid Build Coastguard Worker; RUN:     -verify-machineinstrs < %s | FileCheck %s -check-prefix=N64
7*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic \
8*9880d681SAndroid Build Coastguard Worker; RUN:     -enable-mips-tail-calls -verify-machineinstrs < %s | \
9*9880d681SAndroid Build Coastguard Worker; RUN:     FileCheck %s -check-prefix=PIC16
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker@g0 = common global i32 0, align 4
12*9880d681SAndroid Build Coastguard Worker@g1 = common global i32 0, align 4
13*9880d681SAndroid Build Coastguard Worker@g2 = common global i32 0, align 4
14*9880d681SAndroid Build Coastguard Worker@g3 = common global i32 0, align 4
15*9880d681SAndroid Build Coastguard Worker@g4 = common global i32 0, align 4
16*9880d681SAndroid Build Coastguard Worker@g5 = common global i32 0, align 4
17*9880d681SAndroid Build Coastguard Worker@g6 = common global i32 0, align 4
18*9880d681SAndroid Build Coastguard Worker@g7 = common global i32 0, align 4
19*9880d681SAndroid Build Coastguard Worker@g8 = common global i32 0, align 4
20*9880d681SAndroid Build Coastguard Worker@g9 = common global i32 0, align 4
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerdefine i32 @caller1(i32 %a0) nounwind {
23*9880d681SAndroid Build Coastguard Workerentry:
24*9880d681SAndroid Build Coastguard Worker; PIC32-NOT: jalr
25*9880d681SAndroid Build Coastguard Worker; STATIC32-NOT: jal
26*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr
27*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @callee1(i32 1, i32 1, i32 1, i32 %a0) nounwind
30*9880d681SAndroid Build Coastguard Worker  ret i32 %call
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee1(i32, i32, i32, i32)
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine i32 @caller2(i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker; PIC32: jalr
38*9880d681SAndroid Build Coastguard Worker; STATIC32: jal
39*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr
40*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @callee2(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind
43*9880d681SAndroid Build Coastguard Worker  ret i32 %call
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee2(i32, i32, i32, i32, i32)
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i32 @caller3(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind {
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker; PIC32: jalr
51*9880d681SAndroid Build Coastguard Worker; STATIC32: jal
52*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr
53*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @callee3(i32 1, i32 1, i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind
56*9880d681SAndroid Build Coastguard Worker  ret i32 %call
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee3(i32, i32, i32, i32, i32, i32, i32, i32)
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine i32 @caller4(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind {
62*9880d681SAndroid Build Coastguard Workerentry:
63*9880d681SAndroid Build Coastguard Worker; PIC32: jalr
64*9880d681SAndroid Build Coastguard Worker; STATIC32: jal
65*9880d681SAndroid Build Coastguard Worker; N64: jalr
66*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @callee4(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind
69*9880d681SAndroid Build Coastguard Worker  ret i32 %call
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee4(i32, i32, i32, i32, i32, i32, i32, i32, i32)
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine i32 @caller5() nounwind readonly {
75*9880d681SAndroid Build Coastguard Workerentry:
76*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller5
77*9880d681SAndroid Build Coastguard Worker; PIC32-NOT: jalr
78*9880d681SAndroid Build Coastguard Worker; PIC32: .end caller5
79*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller5
80*9880d681SAndroid Build Coastguard Worker; STATIC32-NOT: jal
81*9880d681SAndroid Build Coastguard Worker; STATIC32: .end caller5
82*9880d681SAndroid Build Coastguard Worker; N64: .ent caller5
83*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr
84*9880d681SAndroid Build Coastguard Worker; N64: .end caller5
85*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller5
86*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
87*9880d681SAndroid Build Coastguard Worker; PIC16: .end caller5
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* @g0, align 4
90*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* @g1, align 4
91*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* @g2, align 4
92*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* @g3, align 4
93*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* @g4, align 4
94*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* @g5, align 4
95*9880d681SAndroid Build Coastguard Worker  %6 = load i32, i32* @g6, align 4
96*9880d681SAndroid Build Coastguard Worker  %7 = load i32, i32* @g7, align 4
97*9880d681SAndroid Build Coastguard Worker  %8 = load i32, i32* @g8, align 4
98*9880d681SAndroid Build Coastguard Worker  %9 = load i32, i32* @g9, align 4
99*9880d681SAndroid Build Coastguard Worker  %call = tail call fastcc i32 @callee5(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9)
100*9880d681SAndroid Build Coastguard Worker  ret i32 %call
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine internal fastcc i32 @callee5(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8, i32 %a9) nounwind readnone noinline {
104*9880d681SAndroid Build Coastguard Workerentry:
105*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %a1, %a0
106*9880d681SAndroid Build Coastguard Worker  %add1 = add nsw i32 %add, %a2
107*9880d681SAndroid Build Coastguard Worker  %add2 = add nsw i32 %add1, %a3
108*9880d681SAndroid Build Coastguard Worker  %add3 = add nsw i32 %add2, %a4
109*9880d681SAndroid Build Coastguard Worker  %add4 = add nsw i32 %add3, %a5
110*9880d681SAndroid Build Coastguard Worker  %add5 = add nsw i32 %add4, %a6
111*9880d681SAndroid Build Coastguard Worker  %add6 = add nsw i32 %add5, %a7
112*9880d681SAndroid Build Coastguard Worker  %add7 = add nsw i32 %add6, %a8
113*9880d681SAndroid Build Coastguard Worker  %add8 = add nsw i32 %add7, %a9
114*9880d681SAndroid Build Coastguard Worker  ret i32 %add8
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee8(i32, ...)
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine i32 @caller8_0() nounwind {
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker  %call = tail call fastcc i32 @caller8_1()
122*9880d681SAndroid Build Coastguard Worker  ret i32 %call
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine internal fastcc i32 @caller8_1() nounwind noinline {
126*9880d681SAndroid Build Coastguard Workerentry:
127*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller8_1
128*9880d681SAndroid Build Coastguard Worker; PIC32: jalr
129*9880d681SAndroid Build Coastguard Worker; PIC32: .end caller8_1
130*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller8_1
131*9880d681SAndroid Build Coastguard Worker; STATIC32: jal
132*9880d681SAndroid Build Coastguard Worker; STATIC32: .end caller8_1
133*9880d681SAndroid Build Coastguard Worker; N64: .ent caller8_1
134*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr
135*9880d681SAndroid Build Coastguard Worker; N64: .end caller8_1
136*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller8_1
137*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
138*9880d681SAndroid Build Coastguard Worker; PIC16: .end caller8_1
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 (i32, ...) @callee8(i32 2, i32 1) nounwind
141*9880d681SAndroid Build Coastguard Worker  ret i32 %call
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker%struct.S = type { [2 x i32] }
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker@gs1 = external global %struct.S
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee9(%struct.S* byval)
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerdefine i32 @caller9_0() nounwind {
151*9880d681SAndroid Build Coastguard Workerentry:
152*9880d681SAndroid Build Coastguard Worker  %call = tail call fastcc i32 @caller9_1()
153*9880d681SAndroid Build Coastguard Worker  ret i32 %call
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerdefine internal fastcc i32 @caller9_1() nounwind noinline {
157*9880d681SAndroid Build Coastguard Workerentry:
158*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller9_1
159*9880d681SAndroid Build Coastguard Worker; PIC32: jalr
160*9880d681SAndroid Build Coastguard Worker; PIC32: .end caller9_1
161*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller9_1
162*9880d681SAndroid Build Coastguard Worker; STATIC32: jal
163*9880d681SAndroid Build Coastguard Worker; STATIC32: .end caller9_1
164*9880d681SAndroid Build Coastguard Worker; N64: .ent caller9_1
165*9880d681SAndroid Build Coastguard Worker; N64: jalr
166*9880d681SAndroid Build Coastguard Worker; N64: .end caller9_1
167*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller9_1
168*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
169*9880d681SAndroid Build Coastguard Worker; PIC16: .end caller9_1
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @callee9(%struct.S* byval @gs1) nounwind
172*9880d681SAndroid Build Coastguard Worker  ret i32 %call
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee10(i32, i32, i32, i32, i32, i32, i32, i32, i32)
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerdefine i32 @caller10(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8) nounwind {
178*9880d681SAndroid Build Coastguard Workerentry:
179*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller10
180*9880d681SAndroid Build Coastguard Worker; PIC32-NOT: jalr
181*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller10
182*9880d681SAndroid Build Coastguard Worker; STATIC32-NOT: jal
183*9880d681SAndroid Build Coastguard Worker; N64: .ent caller10
184*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr
185*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller10
186*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @callee10(i32 %a8, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind
189*9880d681SAndroid Build Coastguard Worker  ret i32 %call
190*9880d681SAndroid Build Coastguard Worker}
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee11(%struct.S* byval)
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine i32 @caller11() nounwind noinline {
195*9880d681SAndroid Build Coastguard Workerentry:
196*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller11
197*9880d681SAndroid Build Coastguard Worker; PIC32: jalr
198*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller11
199*9880d681SAndroid Build Coastguard Worker; STATIC32: jal
200*9880d681SAndroid Build Coastguard Worker; N64: .ent caller11
201*9880d681SAndroid Build Coastguard Worker; N64: jalr
202*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller11
203*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @callee11(%struct.S* byval @gs1) nounwind
206*9880d681SAndroid Build Coastguard Worker  ret i32 %call
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee12()
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdefine i32 @caller12(%struct.S* nocapture byval %a0) nounwind {
214*9880d681SAndroid Build Coastguard Workerentry:
215*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller12
216*9880d681SAndroid Build Coastguard Worker; PIC32: jalr
217*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller12
218*9880d681SAndroid Build Coastguard Worker; STATIC32: jal
219*9880d681SAndroid Build Coastguard Worker; N64: .ent caller12
220*9880d681SAndroid Build Coastguard Worker; N64: jalr
221*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller12
222*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker  %0 = bitcast %struct.S* %a0 to i8*
225*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* bitcast (%struct.S* @gs1 to i8*), i8* %0, i32 8, i32 4, i1 false)
226*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @callee12() nounwind
227*9880d681SAndroid Build Coastguard Worker  ret i32 %call
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Workerdeclare i32 @callee13(i32, ...)
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Workerdefine i32 @caller13() nounwind {
233*9880d681SAndroid Build Coastguard Workerentry:
234*9880d681SAndroid Build Coastguard Worker; PIC32: .ent caller13
235*9880d681SAndroid Build Coastguard Worker; PIC32-NOT: jalr
236*9880d681SAndroid Build Coastguard Worker; STATIC32: .ent caller13
237*9880d681SAndroid Build Coastguard Worker; STATIC32-NOT: jal
238*9880d681SAndroid Build Coastguard Worker; N64: .ent caller13
239*9880d681SAndroid Build Coastguard Worker; N64-NOT: jalr
240*9880d681SAndroid Build Coastguard Worker; PIC16: .ent caller13
241*9880d681SAndroid Build Coastguard Worker; PIC16: jalrc
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 (i32, ...) @callee13(i32 1, i32 2) nounwind
244*9880d681SAndroid Build Coastguard Worker  ret i32 %call
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker; Check that there is a chain edge between the load and store nodes.
248*9880d681SAndroid Build Coastguard Worker;
249*9880d681SAndroid Build Coastguard Worker; PIC32-LABEL: caller14:
250*9880d681SAndroid Build Coastguard Worker; PIC32: lw ${{[0-9]+}}, 16($sp)
251*9880d681SAndroid Build Coastguard Worker; PIC32: sw $4, 16($sp)
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine void @caller14(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
254*9880d681SAndroid Build Coastguard Workerentry:
255*9880d681SAndroid Build Coastguard Worker  tail call void @callee14(i32 %e, i32 %b, i32 %c, i32 %d, i32 %a)
256*9880d681SAndroid Build Coastguard Worker  ret void
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdeclare void @callee14(i32, i32, i32, i32, i32)
260