blob: b0ac28d819cf737b4befd5fb359cb2e5bcc0731d [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 Dardis57f4ae42016-08-04 09:17:07 +00005; RUN: llc -march=mips64el -mcpu=mips64r2 \
Simon Dardis1dcb9112016-11-20 21:23:08 +00006; RUN: -verify-machineinstrs -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,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 | \
Simon Dardis1dcb9112016-11-20 21:23:08 +00009; RUN: FileCheck %s -check-prefixes=ALL,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 Dardis1dcb9112016-11-20 21:23:08 +000012; RUN: FileCheck %s -check-prefixes=ALL,PIC32MM
Simon Dardis57f4ae42016-08-04 09:17:07 +000013; RUN: llc -march=mipsel -relocation-model=static -mattr=+micromips \
Simon Dardis1dcb9112016-11-20 21:23:08 +000014; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,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 Dardis1dcb9112016-11-20 21:23:08 +000017; RUN: FileCheck %s -check-prefixes=ALL,PIC32R6
Simon Dardis57f4ae42016-08-04 09:17:07 +000018; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r6 \
Simon Dardis1dcb9112016-11-20 21:23:08 +000019; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32
Simon Dardis57f4ae42016-08-04 09:17:07 +000020; RUN: llc -march=mips64el -mcpu=mips64r6 \
Simon Dardis1dcb9112016-11-20 21:23:08 +000021; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,N64R6
Simon Dardis57f4ae42016-08-04 09:17:07 +000022
23; RUN: llc -march=mipsel -relocation-model=pic -mcpu=mips32r6 -mattr=+micromips \
Simon Dardis1dcb9112016-11-20 21:23:08 +000024; RUN: -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,PIC32MM
Simon Dardis57f4ae42016-08-04 09:17:07 +000025; RUN: llc -march=mipsel -relocation-model=static -mcpu=mips32r6 \
Simon Dardis1dcb9112016-11-20 21:23:08 +000026; RUN: -mattr=+micromips -mips-tail-calls=1 < %s | FileCheck %s -check-prefixes=ALL,STATIC32
Simon Dardisd2ed8ab2016-09-27 13:15:54 +000027; RUN: llc -march=mips64el -mcpu=mips64r6 -mattr=+micromips -mips-tail-calls=1 < %s \
Simon Dardis1dcb9112016-11-20 21:23:08 +000028; RUN: | FileCheck %s -check-prefixes=ALL,N64
Simon Dardis57f4ae42016-08-04 09:17:07 +000029
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:
Simon Dardis1dcb9112016-11-20 21:23:08 +000043; ALL-LABEL: caller1:
44; PIC32: jalr $25
45; PIC32MM: jalr $25
46; PIC32R6: jalr $25
47; STATIC32: jal
48; N64: jalr $25
49; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +000050; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000051
52 %call = tail call i32 @callee1(i32 1, i32 1, i32 1, i32 %a0) nounwind
53 ret i32 %call
54}
55
56declare i32 @callee1(i32, i32, i32, i32)
57
58define i32 @caller2(i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind {
59entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +000060; ALL-LABEL: caller2
61; PIC32: jalr $25
62; PIC32MM: jalr $25
63; PIC32R6: jalr $25
Akira Hatanaka90131ac2012-10-19 21:47:33 +000064; STATIC32: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +000065; N64: jalr $25
66; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +000067; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000068
69 %call = tail call i32 @callee2(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3) nounwind
70 ret i32 %call
71}
72
73declare i32 @callee2(i32, i32, i32, i32, i32)
74
75define i32 @caller3(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind {
76entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +000077; ALL-LABEL: caller3:
78; PIC32: jalr $25
79; PIC32R6: jalr $25
80; PIC32MM: jalr $25
Akira Hatanaka90131ac2012-10-19 21:47:33 +000081; STATIC32: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +000082; N64: jalr $25
83; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +000084; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +000085
86 %call = tail call i32 @callee3(i32 1, i32 1, i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4) nounwind
87 ret i32 %call
88}
89
90declare i32 @callee3(i32, i32, i32, i32, i32, i32, i32, i32)
91
92define i32 @caller4(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind {
93entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +000094; ALL-LABEL: caller4:
95; PIC32: jalr $25
96; PIC32R6: jalr $25
97; PIC32MM: jalr $25
Akira Hatanaka90131ac2012-10-19 21:47:33 +000098; STATIC32: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +000099; N64: jalr $25
100; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000101; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000102
103 %call = tail call i32 @callee4(i32 1, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind
104 ret i32 %call
105}
106
107declare i32 @callee4(i32, i32, i32, i32, i32, i32, i32, i32, i32)
108
109define i32 @caller5() nounwind readonly {
110entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000111; ALL-LABEL: caller5:
112; PIC32: jr $25
113; PIC32R6: jr $25
114; PIC32MM: jr
115; STATIC32: j
116; N64: jr $25
117; N64R6: jr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000118; PIC16: jalrc
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000119
David Blaikiea79ac142015-02-27 21:17:42 +0000120 %0 = load i32, i32* @g0, align 4
121 %1 = load i32, i32* @g1, align 4
122 %2 = load i32, i32* @g2, align 4
123 %3 = load i32, i32* @g3, align 4
124 %4 = load i32, i32* @g4, align 4
125 %5 = load i32, i32* @g5, align 4
126 %6 = load i32, i32* @g6, align 4
127 %7 = load i32, i32* @g7, align 4
128 %8 = load i32, i32* @g8, align 4
129 %9 = load i32, i32* @g9, align 4
Akira Hatanaka90131ac2012-10-19 21:47:33 +0000130 %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)
131 ret i32 %call
132}
133
134define 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 {
135entry:
136 %add = add nsw i32 %a1, %a0
137 %add1 = add nsw i32 %add, %a2
138 %add2 = add nsw i32 %add1, %a3
139 %add3 = add nsw i32 %add2, %a4
140 %add4 = add nsw i32 %add3, %a5
141 %add5 = add nsw i32 %add4, %a6
142 %add6 = add nsw i32 %add5, %a7
143 %add7 = add nsw i32 %add6, %a8
144 %add8 = add nsw i32 %add7, %a9
145 ret i32 %add8
146}
147
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000148declare i32 @callee8(i32, ...)
149
150define i32 @caller8_0() nounwind {
151entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000152; ALL-LABEL: caller8_0:
153; PIC32: jr $25
154; PIC32R6: jrc $25
155; PIC32MM: jrc
Simon Dardis57f4ae42016-08-04 09:17:07 +0000156; STATIC32: j
Simon Dardis1dcb9112016-11-20 21:23:08 +0000157; N64: jr $25
158; N64R6: jrc $25
Simon Dardis57f4ae42016-08-04 09:17:07 +0000159; PIC16: jalrc
Simon Dardis57f4ae42016-08-04 09:17:07 +0000160
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000161 %call = tail call fastcc i32 @caller8_1()
162 ret i32 %call
163}
164
165define internal fastcc i32 @caller8_1() nounwind noinline {
166entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000167; ALL-LABEL: caller8_1:
168; PIC32: jalr $25
169; PIC32R6: jalr $25
170; PIC32MM: jalr $25
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000171; STATIC32: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +0000172; N64: jalr $25
173; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000174; PIC16: jalrc
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000175
David Blaikie23af6482015-04-16 23:24:18 +0000176 %call = tail call i32 (i32, ...) @callee8(i32 2, i32 1) nounwind
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000177 ret i32 %call
178}
179
180%struct.S = type { [2 x i32] }
181
182@gs1 = external global %struct.S
183
184declare i32 @callee9(%struct.S* byval)
185
186define i32 @caller9_0() nounwind {
187entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000188; ALL-LABEL: caller9_0:
189; PIC32: jr $25
190; PIC32R6: jrc $25
191; PIC32MM: jrc
Simon Dardis57f4ae42016-08-04 09:17:07 +0000192; STATIC32: j
Simon Dardis1dcb9112016-11-20 21:23:08 +0000193; N64: jr $25
194; N64R6: jrc $25
Simon Dardis57f4ae42016-08-04 09:17:07 +0000195; PIC16: jalrc
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:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000202; ALL-LABEL: caller9_1:
203; PIC32: jalr $25
204; PIC32R6: jalrc $25
205; PIC32MM: jalr $25
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000206; STATIC32: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +0000207; N64: jalr $25
208; N64R6: jalrc $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000209; PIC16: jalrc
Akira Hatanaka6a124a82012-10-27 00:56:56 +0000210
211 %call = tail call i32 @callee9(%struct.S* byval @gs1) nounwind
212 ret i32 %call
213}
214
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000215declare i32 @callee10(i32, i32, i32, i32, i32, i32, i32, i32, i32)
216
217define i32 @caller10(i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8) nounwind {
218entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000219; ALL-LABEL: caller10:
220; PIC32: jalr $25
221; PIC32R6: jalr $25
222; PIC32MM: jalr $25
223; STATIC32: jal
224; N64: jalr $25
225; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000226; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000227
228 %call = tail call i32 @callee10(i32 %a8, i32 %a0, i32 %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7) nounwind
229 ret i32 %call
230}
231
232declare i32 @callee11(%struct.S* byval)
233
234define i32 @caller11() nounwind noinline {
235entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000236; ALL-LABEL: caller11:
237; PIC32: jalr $25
238; PIC32R6: jalrc $25
239; PIC32MM: jalr $25
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000240; STATIC32: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +0000241; N64: jalr $25
242; N64R6: jalrc $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000243; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000244
245 %call = tail call i32 @callee11(%struct.S* byval @gs1) nounwind
246 ret i32 %call
247}
248
249declare i32 @callee12()
250
Pete Cooper67cf9a72015-11-19 05:56:52 +0000251declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000252
253define i32 @caller12(%struct.S* nocapture byval %a0) nounwind {
254entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000255; ALL-LABEL: caller12:
256; PIC32: jalr $25
257; PIC32R6: jalrc $25
258; PIC32MM: jalr $25
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000259; STATIC32: jal
Simon Dardis1dcb9112016-11-20 21:23:08 +0000260; N64: jalr $25
261; N64R6: jalrc $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000262; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000263
264 %0 = bitcast %struct.S* %a0 to i8*
Pete Cooper67cf9a72015-11-19 05:56:52 +0000265 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 +0000266 %call = tail call i32 @callee12() nounwind
267 ret i32 %call
268}
269
270declare i32 @callee13(i32, ...)
271
272define i32 @caller13() nounwind {
273entry:
Simon Dardis1dcb9112016-11-20 21:23:08 +0000274; ALL-LABEL: caller13
275; PIC32: jalr $25
276; PIC32R6: jalr $25
277; PIC32MM: jalr $25
278; STATIC32: jal
279; N64: jalr $25
280; N64R6: jalr $25
Akira Hatanakac096c882012-10-31 17:25:23 +0000281; PIC16: jalrc
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000282
David Blaikie23af6482015-04-16 23:24:18 +0000283 %call = tail call i32 (i32, ...) @callee13(i32 1, i32 2) nounwind
Akira Hatanaka9c962c02012-10-30 20:16:31 +0000284 ret i32 %call
285}
286
Akira Hatanakad1c58ed2013-11-09 02:38:51 +0000287; Check that there is a chain edge between the load and store nodes.
288;
Simon Dardis1dcb9112016-11-20 21:23:08 +0000289; ALL-LABEL: caller14:
290; PIC32: lw ${{[0-9]+}}, 48($sp)
Akira Hatanakad1c58ed2013-11-09 02:38:51 +0000291; PIC32: sw $4, 16($sp)
292
Simon Dardis1dcb9112016-11-20 21:23:08 +0000293; PIC32MM: lw ${{[0-9]+}}, 48($sp)
294; PIC32MM: sw16 $4, 16(${{[0-9]+}})
295
Akira Hatanakad1c58ed2013-11-09 02:38:51 +0000296define void @caller14(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
297entry:
298 tail call void @callee14(i32 %e, i32 %b, i32 %c, i32 %d, i32 %a)
299 ret void
300}
301
302declare void @callee14(i32, i32, i32, i32, i32)