blob: b17f9efd7a0c44c37e264cd9e7eb9fbc42dfe2c6 [file] [log] [blame]
Simon Dardis57f4ae42016-08-04 09:17:07 +00001; RUN: llc -march=mipsel -relocation-model=pic \
Simon Dardis1dcb9112016-11-20 21:23:08 +00002; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,PIC32
Simon Dardis57f4ae42016-08-04 09:17:07 +00003; RUN: llc -march=mipsel -relocation-model=static \
Simon Dardis1dcb9112016-11-20 21:23:08 +00004; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32
Simon Dardisca74dd72017-01-27 11:36:52 +00005; RUN: llc -march=mips64el -mcpu=mips64r2 -relocation-model=pic \
6; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,PIC64
7; RUN: llc -march=mips64el -mcpu=mips64r2 -relocation-model=static \
8; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC64
Daniel Sanders8008de52015-10-15 14:34:23 +00009; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic \
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000010; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | \
Simon Dardis1dcb9112016-11-20 21:23:08 +000011; RUN: FileCheck %s -check-prefixes=ALL,PIC16
Akira Hatanaka90131ac2012-10-19 21:47:33 +000012
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000013; RUN: llc -march=mipsel -relocation-model=pic -mattr=+micromips -mips-tail-calls=1 < %s | \
Simon Dardis1dcb9112016-11-20 21:23:08 +000014; RUN: FileCheck %s -check-prefixes=ALL,PIC32MM
Simon Dardis57f4ae42016-08-04 09:17:07 +000015; RUN: llc -march=mipsel -relocation-model=static -mattr=+micromips \
Simon Dardis1dcb9112016-11-20 21:23:08 +000016; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32
Simon Dardis57f4ae42016-08-04 09:17:07 +000017
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000018; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -mips-tail-calls=1 < %s | \
Simon Dardis1dcb9112016-11-20 21:23:08 +000019; RUN: FileCheck %s -check-prefixes=ALL,PIC32R6
Simon Dardisca74dd72017-01-27 11:36:52 +000020; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r2 \
Simon Dardis1dcb9112016-11-20 21:23:08 +000021; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32
Simon Dardisca74dd72017-01-27 11:36:52 +000022; RUN: llc -march=mips64el -relocation-model=pic -mcpu=mips64r2 \
23; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=PIC64
24; RUN: llc -march=mips64el -relocation-model=pic -mcpu=mips64r6 \
25; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefix=STATIC64
Simon Dardis57f4ae42016-08-04 09:17:07 +000026
27; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -mattr=+micromips \
Simon Dardis1dcb9112016-11-20 21:23:08 +000028; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,PIC32MM
Simon Dardis57f4ae42016-08-04 09:17:07 +000029; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r6 \
Simon Dardis789f7ca2017-11-08 11:13:44 +000030; RUN: -mattr=+micromips -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32MMR6
Simon Dardis57f4ae42016-08-04 09:17:07 +000031
Akira Hatanaka90131ac2012-10-19 21:47:33 +000032@g0 = common global i32 0, align 4
33@g1 = common global i32 0, align 4
34@g2 = common global i32 0, align 4
35@g3 = common global i32 0, align 4
36@g4 = common global i32 0, align 4
37@g5 = common global i32 0, align 4
38@g6 = common global i32 0, align 4
39@g7 = common global i32 0, align 4
40@g8 = common global i32 0, align 4
41@g9 = common global i32 0, align 4
42
43define i32 @caller1(i32 %a0) nounwind {
44entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +000045; ALL-LABEL: caller1:
46; PIC32: jalr $25
47; PIC32MM: jalr $25
48; PIC32R6: jalr $25
49; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +000050; STATIC32MMR6: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +000051; N64: jalr $25
52; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +000053; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000054
55 %call = tail call i32 @callee1(i32 1, i32 1, i32 1, i32 %a0) nounwind
56 ret i32 %call
57}
58
59declare i32 @callee1(i32, i32, i32, i32)
60
61define i32 @caller2(i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind {
62entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +000063; ALL-LABEL: caller2
64; PIC32: jalr $25
65; PIC32MM: jalr $25
66; PIC32R6: jalr $25
Akira Hatanaka90131ac2012-10-19 21:47:33 +000067; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +000068; STATIC32MMR6: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +000069; N64: jalr $25
70; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +000071; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000072
73 %call = tail call i32 @callee2(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind
74 ret i32 %call
75}
76
77declare i32 @callee2(i32, i32, i32, i32, i32)
78
79define i32 @caller3(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind {
80entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +000081; ALL-LABEL: caller3:
82; PIC32: jalr $25
83; PIC32R6: jalr $25
84; PIC32MM: jalr $25
Akira Hatanaka90131ac2012-10-19 21:47:33 +000085; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +000086; STATIC32MMR6: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +000087; N64: jalr $25
88; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +000089; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000090
91 %call = tail call i32 @callee3(i32 1, i32 1, i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind
92 ret i32 %call
93}
94
95declare i32 @callee3(i32, i32, i32, i32, i32, i32, i32, i32)
96
97define i32 @caller4(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind {
98entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +000099; ALL-LABEL: caller4:
100; PIC32: jalr $25
101; PIC32R6: jalr $25
102; PIC32MM: jalr $25
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000103; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +0000104; SATATIC32MMR6: jal
Simon Dardisca74dd72017-01-27 11:36:52 +0000105; PIC64: jalr $25
106; STATIC64: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +0000107; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000108; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000109
110 %call = tail call i32 @callee4(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind
111 ret i32 %call
112}
113
114declare i32 @callee4(i32, i32, i32, i32, i32, i32, i32, i32, i32)
115
116define i32 @caller5() nounwind readonly {
117entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000118; ALL-LABEL: caller5:
119; PIC32: jr $25
120; PIC32R6: jr $25
121; PIC32MM: jr
122; STATIC32: j
Simon Dardis789f7ca2017-11-08 11:13:44 +0000123; STATIC32MMR6: bc
Simon Dardisca74dd72017-01-27 11:36:52 +0000124; PIC64: jr $25
125; STATIC64: j
Akira Hatanakac096c882012-10-31 17:25:23 +0000126; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000127
David Blaikiea79ac142015-02-27 21:17:42 +0000128 %0 = load i32, i32* @g0, align 4
129 %1 = load i32, i32* @g1, align 4
130 %2 = load i32, i32* @g2, align 4
131 %3 = load i32, i32* @g3, align 4
132 %4 = load i32, i32* @g4, align 4
133 %5 = load i32, i32* @g5, align 4
134 %6 = load i32, i32* @g6, align 4
135 %7 = load i32, i32* @g7, align 4
136 %8 = load i32, i32* @g8, align 4
137 %9 = load i32, i32* @g9, align 4
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000138 %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)
139 ret i32 %call
140}
141
142define 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 {
143entry:
144 %add = add nsw i32 %a1, %a0
145 %add1 = add nsw i32 %add, %a2
146 %add2 = add nsw i32 %add1, %a3
147 %add3 = add nsw i32 %add2, %a4
148 %add4 = add nsw i32 %add3, %a5
149 %add5 = add nsw i32 %add4, %a6
150 %add6 = add nsw i32 %add5, %a7
151 %add7 = add nsw i32 %add6, %a8
152 %add8 = add nsw i32 %add7, %a9
153 ret i32 %add8
154}
155
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000156declare i32 @callee8(i32, ...)
157
158define i32 @caller8_0() nounwind {
159entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000160; ALL-LABEL: caller8_0:
161; PIC32: jr $25
162; PIC32R6: jrc $25
163; PIC32MM: jrc
Simon Dardis57f4ae42016-08-04 09:17:07 +0000164; STATIC32: j
Simon Dardis789f7ca2017-11-08 11:13:44 +0000165; STATIC32MMR6: bc
Simon Dardisca74dd72017-01-27 11:36:52 +0000166; PIC64: jr $25
167; PIC64R6: jrc $25
Simon Dardisca74dd72017-01-27 11:36:52 +0000168; STATIC64: j
Simon Dardis57f4ae42016-08-04 09:17:07 +0000169; PIC16: jalrc
Simon Dardis57f4ae42016-08-04 09:17:07 +0000170
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000171 %call = tail call fastcc i32 @caller8_1()
172 ret i32 %call
173}
174
175define internal fastcc i32 @caller8_1() nounwind noinline {
176entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000177; ALL-LABEL: caller8_1:
178; PIC32: jalr $25
179; PIC32R6: jalr $25
Simon Dardis7c96ba12017-06-07 11:21:37 +0000180; PIC32MM: jalr $25
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000181; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +0000182; STATIC32MMR6: jal
Simon Dardisca74dd72017-01-27 11:36:52 +0000183; PIC64: jalr $25
184; STATIC64: jal
Akira Hatanakac096c882012-10-31 17:25:23 +0000185; PIC16: jalrc
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000186
David Blaikie23af6482015-04-16 23:24:18 +0000187 %call = tail call i32 (i32, ...) @callee8(i32 2, i32 1) nounwind
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000188 ret i32 %call
189}
190
191%struct.S = type { [2 x i32] }
192
193@gs1 = external global %struct.S
194
195declare i32 @callee9(%struct.S* byval)
196
197define i32 @caller9_0() nounwind {
198entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000199; ALL-LABEL: caller9_0:
200; PIC32: jr $25
201; PIC32R6: jrc $25
202; PIC32MM: jrc
Simon Dardis57f4ae42016-08-04 09:17:07 +0000203; STATIC32: j
Simon Dardis789f7ca2017-11-08 11:13:44 +0000204; STATIC32MMR6: bc
Simon Dardisca74dd72017-01-27 11:36:52 +0000205; PIC64: jr $25
206; STATIC64: j
207; PIC64R6: jrc $25
Simon Dardis57f4ae42016-08-04 09:17:07 +0000208; PIC16: jalrc
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000209 %call = tail call fastcc i32 @caller9_1()
210 ret i32 %call
211}
212
213define internal fastcc i32 @caller9_1() nounwind noinline {
214entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000215; ALL-LABEL: caller9_1:
216; PIC32: jalr $25
217; PIC32R6: jalrc $25
218; PIC32MM: jalr $25
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000219; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +0000220; STATIC32MMR6: jal
Simon Dardisca74dd72017-01-27 11:36:52 +0000221; STATIC64: jal
222; PIC64: jalr $25
223; PIC64R6: jalrc $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000224; PIC16: jalrc
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000225
226 %call = tail call i32 @callee9(%struct.S* byval @gs1) nounwind
227 ret i32 %call
228}
229
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000230declare i32 @callee10(i32, i32, i32, i32, i32, i32, i32, i32, i32)
231
232define i32 @caller10(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8) nounwind {
233entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000234; ALL-LABEL: caller10:
235; PIC32: jalr $25
236; PIC32R6: jalr $25
237; PIC32MM: jalr $25
238; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +0000239; STATIC32MMR6: jal
Simon Dardisca74dd72017-01-27 11:36:52 +0000240; STATIC64: jal
241; PIC64: jalr $25
242; PIC64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000243; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000244
245 %call = tail call i32 @callee10(i32 %a8, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind
246 ret i32 %call
247}
248
249declare i32 @callee11(%struct.S* byval)
250
251define i32 @caller11() nounwind noinline {
252entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000253; ALL-LABEL: caller11:
254; PIC32: jalr $25
255; PIC32R6: jalrc $25
256; PIC32MM: jalr $25
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000257; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +0000258; STATIC32MMR6: jal
Simon Dardisca74dd72017-01-27 11:36:52 +0000259; STATIC64: jal
260; PIC64: jalr $25
261; PIC64R6: jalrc $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000262; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000263
264 %call = tail call i32 @callee11(%struct.S* byval @gs1) nounwind
265 ret i32 %call
266}
267
268declare i32 @callee12()
269
Daniel Neilson1e687242018-01-19 17:13:12 +0000270declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i1) nounwind
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000271
272define i32 @caller12(%struct.S* nocapture byval %a0) nounwind {
273entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000274; ALL-LABEL: caller12:
275; PIC32: jalr $25
276; PIC32R6: jalrc $25
277; PIC32MM: jalr $25
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000278; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +0000279; STATIC32MMR6: jal
Simon Dardisca74dd72017-01-27 11:36:52 +0000280; STATIC64: jal
281; PIC64: jalr $25
282; PIC64R6: jalrc $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000283; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000284
285 %0 = bitcast %struct.S* %a0 to i8*
Daniel Neilson1e687242018-01-19 17:13:12 +0000286 tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 bitcast (%struct.S* @gs1 to i8*), i8* align 4 %0, i32 8, i1 false)
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000287 %call = tail call i32 @callee12() nounwind
288 ret i32 %call
289}
290
291declare i32 @callee13(i32, ...)
292
293define i32 @caller13() nounwind {
294entry:
Simon Dardisca74dd72017-01-27 11:36:52 +0000295; ALL-LABEL: caller13:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000296; PIC32: jalr $25
297; PIC32R6: jalr $25
Simon Dardis7c96ba12017-06-07 11:21:37 +0000298; PIC32MM: jalr $25
Simon Dardis1dcb9112016-11-20 21:23:08 +0000299; STATIC32: jal
Simon Dardis789f7ca2017-11-08 11:13:44 +0000300; STATIC32MMR6: jal
Simon Dardisca74dd72017-01-27 11:36:52 +0000301; STATIC64: jal
302; PIC64R6: jalr $25
303; PIC64: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000304; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000305
David Blaikie23af6482015-04-16 23:24:18 +0000306 %call = tail call i32 (i32, ...) @callee13(i32 1, i32 2) nounwind
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000307 ret i32 %call
308}
309
Akira Hatanakad1c58ed2013-11-09 02:38:51 +0000310; Check that there is a chain edge between the load and store nodes.
311;
Simon Dardis1dcb9112016-11-20 21:23:08 +0000312; ALL-LABEL: caller14:
313; PIC32: lw ${{[0-9]+}}, 48($sp)
Akira Hatanakad1c58ed2013-11-09 02:38:51 +0000314; PIC32: sw $4, 16($sp)
315
Simon Dardis1dcb9112016-11-20 21:23:08 +0000316; PIC32MM: lw ${{[0-9]+}}, 48($sp)
317; PIC32MM: sw16 $4, 16(${{[0-9]+}})
318
Akira Hatanakad1c58ed2013-11-09 02:38:51 +0000319define void @caller14(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
320entry:
321 tail call void @callee14(i32 %e, i32 %b, i32 %c, i32 %d, i32 %a)
322 ret void
323}
324
325declare void @callee14(i32, i32, i32, i32, i32)