blob: 635f2ab82d880bc71e0f0cccddcdf0ffee2ce852 [file] [log] [blame]
Simon Dardis57f4ae42016-08-04 09:17:07 +00001; RUN: llc -march=mipsel -relocation-model=pic \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +00002; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=PIC32
Simon Dardis57f4ae42016-08-04 09:17:07 +00003; RUN: llc -march=mipsel -relocation-model=static \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +00004; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=STATIC32
Simon Dardis57f4ae42016-08-04 09:17:07 +00005; RUN: llc -march=mips64el -mcpu=mips64r2 \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +00006; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=N64
Daniel Sanders8008de52015-10-15 14:34:23 +00007; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +00008; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | \
Daniel Sandersde7816b2016-06-16 10:20:59 +00009; RUN: FileCheck %s -check-prefix=PIC16
Akira Hatanaka90131ac2012-10-19 21:47:33 +000010
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000011; RUN: llc -march=mipsel -relocation-model=pic -mattr=+micromips -mips-tail-calls=1 < %s | \
Simon Dardis57f4ae42016-08-04 09:17:07 +000012; RUN: FileCheck %s -check-prefix=PIC32
13; RUN: llc -march=mipsel -relocation-model=static -mattr=+micromips \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000014; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=STATIC32
Simon Dardis57f4ae42016-08-04 09:17:07 +000015
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000016; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -mips-tail-calls=1 < %s | \
Simon Dardis57f4ae42016-08-04 09:17:07 +000017; RUN: FileCheck %s -check-prefix=PIC32
18; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r6 \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000019; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=STATIC32
Simon Dardis57f4ae42016-08-04 09:17:07 +000020; RUN: llc -march=mips64el -mcpu=mips64r6 \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000021; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=N64
Simon Dardis57f4ae42016-08-04 09:17:07 +000022
23; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -mattr=+micromips \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000024; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=PIC32
Simon Dardis57f4ae42016-08-04 09:17:07 +000025; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r6 \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000026; RUN: -mattr=+micromips -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=STATIC32
27; RUN: llc -march=mips64el -mcpu=mips64r6 -mattr=+micromips -mips-tail-calls=1 < %s \
Simon Dardis57f4ae42016-08-04 09:17:07 +000028; RUN: | FileCheck %s -check-prefix=N64
29
Akira Hatanaka90131ac2012-10-19 21:47:33 +000030@g0 = common global i32 0, align 4
31@g1 = common global i32 0, align 4
32@g2 = common global i32 0, align 4
33@g3 = common global i32 0, align 4
34@g4 = common global i32 0, align 4
35@g5 = common global i32 0, align 4
36@g6 = common global i32 0, align 4
37@g7 = common global i32 0, align 4
38@g8 = common global i32 0, align 4
39@g9 = common global i32 0, align 4
40
41define i32 @caller1(i32 %a0) nounwind {
42entry:
43; PIC32-NOT: jalr
44; STATIC32-NOT: jal
45; N64-NOT: jalr
Akira Hatanakac096c882012-10-31 17:25:23 +000046; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000047
48 %call = tail call i32 @callee1(i32 1, i32 1, i32 1, i32 %a0) nounwind
49 ret i32 %call
50}
51
52declare i32 @callee1(i32, i32, i32, i32)
53
54define i32 @caller2(i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind {
55entry:
56; PIC32: jalr
57; STATIC32: jal
58; N64-NOT: jalr
Akira Hatanakac096c882012-10-31 17:25:23 +000059; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000060
61 %call = tail call i32 @callee2(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind
62 ret i32 %call
63}
64
65declare i32 @callee2(i32, i32, i32, i32, i32)
66
67define i32 @caller3(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind {
68entry:
69; PIC32: jalr
70; STATIC32: jal
71; N64-NOT: jalr
Akira Hatanakac096c882012-10-31 17:25:23 +000072; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000073
74 %call = tail call i32 @callee3(i32 1, i32 1, i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind
75 ret i32 %call
76}
77
78declare i32 @callee3(i32, i32, i32, i32, i32, i32, i32, i32)
79
80define i32 @caller4(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind {
81entry:
82; PIC32: jalr
83; STATIC32: jal
84; N64: jalr
Akira Hatanakac096c882012-10-31 17:25:23 +000085; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000086
87 %call = tail call i32 @callee4(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind
88 ret i32 %call
89}
90
91declare i32 @callee4(i32, i32, i32, i32, i32, i32, i32, i32, i32)
92
93define i32 @caller5() nounwind readonly {
94entry:
Akira Hatanaka6a124a82012-10-27 00:56:56 +000095; PIC32: .ent caller5
Simon Dardis57f4ae42016-08-04 09:17:07 +000096; PIC32-NOT: jalr $25
Akira Hatanaka6a124a82012-10-27 00:56:56 +000097; PIC32: .end caller5
98; STATIC32: .ent caller5
Akira Hatanaka90131ac2012-10-19 21:47:33 +000099; STATIC32-NOT: jal
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000100; STATIC32: .end caller5
101; N64: .ent caller5
Simon Dardis57f4ae42016-08-04 09:17:07 +0000102; N64-NOT: jalr $25
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000103; N64: .end caller5
Akira Hatanakac096c882012-10-31 17:25:23 +0000104; PIC16: .ent caller5
105; PIC16: jalrc
106; PIC16: .end caller5
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000107
David Blaikiea79ac142015-02-27 21:17:42 +0000108 %0 = load i32, i32* @g0, align 4
109 %1 = load i32, i32* @g1, align 4
110 %2 = load i32, i32* @g2, align 4
111 %3 = load i32, i32* @g3, align 4
112 %4 = load i32, i32* @g4, align 4
113 %5 = load i32, i32* @g5, align 4
114 %6 = load i32, i32* @g6, align 4
115 %7 = load i32, i32* @g7, align 4
116 %8 = load i32, i32* @g8, align 4
117 %9 = load i32, i32* @g9, align 4
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000118 %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)
119 ret i32 %call
120}
121
122define 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 {
123entry:
124 %add = add nsw i32 %a1, %a0
125 %add1 = add nsw i32 %add, %a2
126 %add2 = add nsw i32 %add1, %a3
127 %add3 = add nsw i32 %add2, %a4
128 %add4 = add nsw i32 %add3, %a5
129 %add5 = add nsw i32 %add4, %a6
130 %add6 = add nsw i32 %add5, %a7
131 %add7 = add nsw i32 %add6, %a8
132 %add8 = add nsw i32 %add7, %a9
133 ret i32 %add8
134}
135
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000136declare i32 @callee8(i32, ...)
137
138define i32 @caller8_0() nounwind {
139entry:
Simon Dardis57f4ae42016-08-04 09:17:07 +0000140; PIC32: .ent caller8_0
141; PIC32: jr
142; PIC32: .end caller8_0
143; STATIC32: .ent caller8_0
144; STATIC32: j
145; STATIC32: .end caller8_0
146; N64: .ent caller8_0
147; N64-NOT: jalr $25
148; N64: .end caller8_0
149; PIC16: .ent caller8_0
150; PIC16: jalrc
151; PIC16: .end caller8_0
152
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000153 %call = tail call fastcc i32 @caller8_1()
154 ret i32 %call
155}
156
157define internal fastcc i32 @caller8_1() nounwind noinline {
158entry:
159; PIC32: .ent caller8_1
160; PIC32: jalr
161; PIC32: .end caller8_1
162; STATIC32: .ent caller8_1
163; STATIC32: jal
164; STATIC32: .end caller8_1
165; N64: .ent caller8_1
Simon Dardis57f4ae42016-08-04 09:17:07 +0000166; N64-NOT: jalr $25
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000167; N64: .end caller8_1
Akira Hatanakac096c882012-10-31 17:25:23 +0000168; PIC16: .ent caller8_1
169; PIC16: jalrc
170; PIC16: .end caller8_1
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000171
David Blaikie23af6482015-04-16 23:24:18 +0000172 %call = tail call i32 (i32, ...) @callee8(i32 2, i32 1) nounwind
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000173 ret i32 %call
174}
175
176%struct.S = type { [2 x i32] }
177
178@gs1 = external global %struct.S
179
180declare i32 @callee9(%struct.S* byval)
181
182define i32 @caller9_0() nounwind {
183entry:
Simon Dardis57f4ae42016-08-04 09:17:07 +0000184; PIC32: .ent caller9_0
185; PIC32: jr
186; PIC32: .end caller9_0
187; STATIC32: .ent caller9_0
188; STATIC32: j
189; STATIC32: .end caller9_0
190; N64: .ent caller9_0
191; N64-NOT: jalr $25
192; N64: .end caller9_0
193; PIC16: .ent caller9_0
194; PIC16: jalrc
195; PIC16: .end caller9_0
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000196 %call = tail call fastcc i32 @caller9_1()
197 ret i32 %call
198}
199
200define internal fastcc i32 @caller9_1() nounwind noinline {
201entry:
202; PIC32: .ent caller9_1
203; PIC32: jalr
204; PIC32: .end caller9_1
205; STATIC32: .ent caller9_1
206; STATIC32: jal
207; STATIC32: .end caller9_1
208; N64: .ent caller9_1
209; N64: jalr
210; N64: .end caller9_1
Akira Hatanakac096c882012-10-31 17:25:23 +0000211; PIC16: .ent caller9_1
212; PIC16: jalrc
213; PIC16: .end caller9_1
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000214
215 %call = tail call i32 @callee9(%struct.S* byval @gs1) nounwind
216 ret i32 %call
217}
218
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000219declare i32 @callee10(i32, i32, i32, i32, i32, i32, i32, i32, i32)
220
221define i32 @caller10(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8) nounwind {
222entry:
223; PIC32: .ent caller10
Simon Dardis57f4ae42016-08-04 09:17:07 +0000224; PIC32-NOT: jalr $25
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000225; STATIC32: .ent caller10
226; STATIC32-NOT: jal
227; N64: .ent caller10
Simon Dardis57f4ae42016-08-04 09:17:07 +0000228; N64-NOT: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000229; PIC16: .ent caller10
230; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000231
232 %call = tail call i32 @callee10(i32 %a8, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind
233 ret i32 %call
234}
235
236declare i32 @callee11(%struct.S* byval)
237
238define i32 @caller11() nounwind noinline {
239entry:
240; PIC32: .ent caller11
241; PIC32: jalr
242; STATIC32: .ent caller11
243; STATIC32: jal
244; N64: .ent caller11
245; N64: jalr
Akira Hatanakac096c882012-10-31 17:25:23 +0000246; PIC16: .ent caller11
247; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000248
249 %call = tail call i32 @callee11(%struct.S* byval @gs1) nounwind
250 ret i32 %call
251}
252
253declare i32 @callee12()
254
Pete Cooper67cf9a72015-11-19 05:56:52 +0000255declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000256
257define i32 @caller12(%struct.S* nocapture byval %a0) nounwind {
258entry:
259; PIC32: .ent caller12
260; PIC32: jalr
261; STATIC32: .ent caller12
262; STATIC32: jal
263; N64: .ent caller12
264; N64: jalr
Akira Hatanakac096c882012-10-31 17:25:23 +0000265; PIC16: .ent caller12
266; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000267
268 %0 = bitcast %struct.S* %a0 to i8*
Pete Cooper67cf9a72015-11-19 05:56:52 +0000269 tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* bitcast (%struct.S* @gs1 to i8*), i8* %0, i32 8, i32 4, i1 false)
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000270 %call = tail call i32 @callee12() nounwind
271 ret i32 %call
272}
273
274declare i32 @callee13(i32, ...)
275
276define i32 @caller13() nounwind {
277entry:
278; PIC32: .ent caller13
279; PIC32-NOT: jalr
280; STATIC32: .ent caller13
281; STATIC32-NOT: jal
282; N64: .ent caller13
Simon Dardis57f4ae42016-08-04 09:17:07 +0000283; N64-NOT: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000284; PIC16: .ent caller13
285; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000286
David Blaikie23af6482015-04-16 23:24:18 +0000287 %call = tail call i32 (i32, ...) @callee13(i32 1, i32 2) nounwind
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000288 ret i32 %call
289}
290
Akira Hatanakad1c58ed2013-11-09 02:38:51 +0000291; Check that there is a chain edge between the load and store nodes.
292;
293; PIC32-LABEL: caller14:
294; PIC32: lw ${{[0-9]+}}, 16($sp)
295; PIC32: sw $4, 16($sp)
296
297define void @caller14(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
298entry:
299 tail call void @callee14(i32 %e, i32 %b, i32 %c, i32 %d, i32 %a)
300 ret void
301}
302
303declare void @callee14(i32, i32, i32, i32, i32)