1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; Except for the NACL version which isn't parsed by update_llc_test_checks.py
3 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -O3 -relocation-model=pic < %s \
4 ; RUN: | FileCheck %s -check-prefix=NOLONGBRANCH
6 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -force-mips-long-branch -O3 -relocation-model=pic < %s \
7 ; RUN: | FileCheck %s -check-prefix=O32-PIC
8 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -force-mips-long-branch -O3 -relocation-model=static < %s \
9 ; RUN: | FileCheck %s -check-prefix=O32-STATIC
10 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r6 -force-mips-long-branch -O3 \
11 ; RUN: -relocation-model=pic < %s | FileCheck %s -check-prefix=O32-R6-PIC
13 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu -mcpu=mips4 -target-abi=n64 -force-mips-long-branch -O3 -relocation-model=pic \
14 ; RUN: < %s | FileCheck %s -check-prefix=MIPS4
15 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu -mcpu=mips64 -target-abi=n64 -force-mips-long-branch -O3 -relocation-model=pic \
16 ; RUN: < %s | FileCheck %s -check-prefix=MIPS64
17 ; RUN: llc -mtriple=mips64el-unknown-linux-gnu -mcpu=mips64r6 -target-abi=n64 -force-mips-long-branch -O3 \
18 ; RUN: -relocation-model=pic < %s | FileCheck %s -check-prefix=N64-R6
20 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r2 -mattr=micromips \
21 ; RUN: -force-mips-long-branch -O3 -relocation-model=pic < %s | FileCheck %s -check-prefix=MICROMIPS
22 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r2 -mattr=micromips \
23 ; RUN: -force-mips-long-branch -O3 -relocation-model=static < %s | FileCheck %s -check-prefix=MICROMIPSSTATIC
25 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r6 -mattr=micromips \
26 ; RUN: -force-mips-long-branch -O3 -relocation-model=static < %s | FileCheck %s -check-prefix=MICROMIPSR6STATIC
27 ; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32r6 -mattr=micromips \
28 ; RUN: -force-mips-long-branch -O3 -relocation-model=pic < %s | FileCheck %s -check-prefix=MICROMIPSR6PIC
31 ; RUN: llc -mtriple=mipsel-none-nacl -force-mips-long-branch -O3 -relocation-model=pic < %s \
32 ; RUN: | FileCheck %s -check-prefix=NACL
35 @x = external global i32
37 define void @test1(i32 signext %s) {
38 ; NOLONGBRANCH-LABEL: test1:
39 ; NOLONGBRANCH: # %bb.0: # %entry
40 ; NOLONGBRANCH-NEXT: lui $2, %hi(_gp_disp)
41 ; NOLONGBRANCH-NEXT: addiu $2, $2, %lo(_gp_disp)
42 ; NOLONGBRANCH-NEXT: beqz $4, $BB0_2
43 ; NOLONGBRANCH-NEXT: addu $2, $2, $25
44 ; NOLONGBRANCH-NEXT: # %bb.1: # %then
45 ; NOLONGBRANCH-NEXT: lw $1, %got(x)($2)
46 ; NOLONGBRANCH-NEXT: addiu $2, $zero, 1
47 ; NOLONGBRANCH-NEXT: sw $2, 0($1)
48 ; NOLONGBRANCH-NEXT: $BB0_2: # %end
49 ; NOLONGBRANCH-NEXT: jr $ra
50 ; NOLONGBRANCH-NEXT: nop
52 ; O32-PIC-LABEL: test1:
53 ; O32-PIC: # %bb.0: # %entry
54 ; O32-PIC-NEXT: lui $2, %hi(_gp_disp)
55 ; O32-PIC-NEXT: addiu $2, $2, %lo(_gp_disp)
56 ; O32-PIC-NEXT: bnez $4, $BB0_3
57 ; O32-PIC-NEXT: addu $2, $2, $25
58 ; O32-PIC-NEXT: # %bb.1: # %entry
59 ; O32-PIC-NEXT: addiu $sp, $sp, -8
60 ; O32-PIC-NEXT: sw $ra, 0($sp)
61 ; O32-PIC-NEXT: lui $1, %hi(($BB0_4)-($BB0_2))
62 ; O32-PIC-NEXT: bal $BB0_2
63 ; O32-PIC-NEXT: addiu $1, $1, %lo(($BB0_4)-($BB0_2))
64 ; O32-PIC-NEXT: $BB0_2: # %entry
65 ; O32-PIC-NEXT: addu $1, $ra, $1
66 ; O32-PIC-NEXT: lw $ra, 0($sp)
68 ; O32-PIC-NEXT: addiu $sp, $sp, 8
69 ; O32-PIC-NEXT: $BB0_3: # %then
70 ; O32-PIC-NEXT: lw $1, %got(x)($2)
71 ; O32-PIC-NEXT: addiu $2, $zero, 1
72 ; O32-PIC-NEXT: sw $2, 0($1)
73 ; O32-PIC-NEXT: $BB0_4: # %end
74 ; O32-PIC-NEXT: jr $ra
77 ; O32-STATIC-LABEL: test1:
78 ; O32-STATIC: # %bb.0: # %entry
79 ; O32-STATIC-NEXT: bnez $4, $BB0_2
80 ; O32-STATIC-NEXT: nop
81 ; O32-STATIC-NEXT: # %bb.1: # %entry
82 ; O32-STATIC-NEXT: j $BB0_3
83 ; O32-STATIC-NEXT: nop
84 ; O32-STATIC-NEXT: $BB0_2: # %then
85 ; O32-STATIC-NEXT: lui $1, %hi(x)
86 ; O32-STATIC-NEXT: addiu $2, $zero, 1
87 ; O32-STATIC-NEXT: sw $2, %lo(x)($1)
88 ; O32-STATIC-NEXT: $BB0_3: # %end
89 ; O32-STATIC-NEXT: jr $ra
90 ; O32-STATIC-NEXT: nop
92 ; O32-R6-PIC-LABEL: test1:
93 ; O32-R6-PIC: # %bb.0: # %entry
94 ; O32-R6-PIC-NEXT: lui $2, %hi(_gp_disp)
95 ; O32-R6-PIC-NEXT: addiu $2, $2, %lo(_gp_disp)
96 ; O32-R6-PIC-NEXT: bnez $4, $BB0_3
97 ; O32-R6-PIC-NEXT: addu $2, $2, $25
98 ; O32-R6-PIC-NEXT: # %bb.1: # %entry
99 ; O32-R6-PIC-NEXT: addiu $sp, $sp, -8
100 ; O32-R6-PIC-NEXT: sw $ra, 0($sp)
101 ; O32-R6-PIC-NEXT: lui $1, %hi(($BB0_4)-($BB0_2))
102 ; O32-R6-PIC-NEXT: addiu $1, $1, %lo(($BB0_4)-($BB0_2))
103 ; O32-R6-PIC-NEXT: balc $BB0_2
104 ; O32-R6-PIC-NEXT: $BB0_2: # %entry
105 ; O32-R6-PIC-NEXT: addu $1, $ra, $1
106 ; O32-R6-PIC-NEXT: lw $ra, 0($sp)
107 ; O32-R6-PIC-NEXT: addiu $sp, $sp, 8
108 ; O32-R6-PIC-NEXT: jrc $1
109 ; O32-R6-PIC-NEXT: $BB0_3: # %then
110 ; O32-R6-PIC-NEXT: lw $1, %got(x)($2)
111 ; O32-R6-PIC-NEXT: addiu $2, $zero, 1
112 ; O32-R6-PIC-NEXT: sw $2, 0($1)
113 ; O32-R6-PIC-NEXT: $BB0_4: # %end
114 ; O32-R6-PIC-NEXT: jrc $ra
116 ; O32-R6-STATIC-LABEL: test1:
117 ; O32-R6-STATIC: # %bb.0: # %entry
118 ; O32-R6-STATIC-NEXT: bnezc $4, $BB0_2
119 ; O32-R6-STATIC-NEXT: nop
120 ; O32-R6-STATIC-NEXT: # %bb.1: # %entry
121 ; O32-R6-STATIC-NEXT: bc $BB0_3
122 ; O32-R6-STATIC-NEXT: $BB0_2: # %then
123 ; O32-R6-STATIC-NEXT: lui $1, %hi(x)
124 ; O32-R6-STATIC-NEXT: addiu $2, $zero, 1
125 ; O32-R6-STATIC-NEXT: sw $2, %lo(x)($1)
126 ; O32-R6-STATIC-NEXT: $BB0_3: # %end
127 ; O32-R6-STATIC-NEXT: jrc $ra
129 ; MIPS4-LABEL: test1:
130 ; MIPS4: # %bb.0: # %entry
131 ; MIPS4-NEXT: lui $1, %hi(%neg(%gp_rel(test1)))
132 ; MIPS4-NEXT: bnez $4, .LBB0_3
133 ; MIPS4-NEXT: daddu $2, $1, $25
134 ; MIPS4-NEXT: # %bb.1: # %entry
135 ; MIPS4-NEXT: daddiu $sp, $sp, -16
136 ; MIPS4-NEXT: sd $ra, 0($sp)
137 ; MIPS4-NEXT: daddiu $1, $zero, %hi(.LBB0_4-.LBB0_2)
138 ; MIPS4-NEXT: dsll $1, $1, 16
139 ; MIPS4-NEXT: bal .LBB0_2
140 ; MIPS4-NEXT: daddiu $1, $1, %lo(.LBB0_4-.LBB0_2)
141 ; MIPS4-NEXT: .LBB0_2: # %entry
142 ; MIPS4-NEXT: daddu $1, $ra, $1
143 ; MIPS4-NEXT: ld $ra, 0($sp)
145 ; MIPS4-NEXT: daddiu $sp, $sp, 16
146 ; MIPS4-NEXT: .LBB0_3: # %then
147 ; MIPS4-NEXT: daddiu $1, $2, %lo(%neg(%gp_rel(test1)))
148 ; MIPS4-NEXT: addiu $2, $zero, 1
149 ; MIPS4-NEXT: ld $1, %got_disp(x)($1)
150 ; MIPS4-NEXT: sw $2, 0($1)
151 ; MIPS4-NEXT: .LBB0_4: # %end
155 ; MIPS64-LABEL: test1:
156 ; MIPS64: # %bb.0: # %entry
157 ; MIPS64-NEXT: lui $1, %hi(%neg(%gp_rel(test1)))
158 ; MIPS64-NEXT: bnez $4, .LBB0_3
159 ; MIPS64-NEXT: daddu $2, $1, $25
160 ; MIPS64-NEXT: # %bb.1: # %entry
161 ; MIPS64-NEXT: daddiu $sp, $sp, -16
162 ; MIPS64-NEXT: sd $ra, 0($sp)
163 ; MIPS64-NEXT: daddiu $1, $zero, %hi(.LBB0_4-.LBB0_2)
164 ; MIPS64-NEXT: dsll $1, $1, 16
165 ; MIPS64-NEXT: bal .LBB0_2
166 ; MIPS64-NEXT: daddiu $1, $1, %lo(.LBB0_4-.LBB0_2)
167 ; MIPS64-NEXT: .LBB0_2: # %entry
168 ; MIPS64-NEXT: daddu $1, $ra, $1
169 ; MIPS64-NEXT: ld $ra, 0($sp)
171 ; MIPS64-NEXT: daddiu $sp, $sp, 16
172 ; MIPS64-NEXT: .LBB0_3: # %then
173 ; MIPS64-NEXT: daddiu $1, $2, %lo(%neg(%gp_rel(test1)))
174 ; MIPS64-NEXT: addiu $2, $zero, 1
175 ; MIPS64-NEXT: ld $1, %got_disp(x)($1)
176 ; MIPS64-NEXT: sw $2, 0($1)
177 ; MIPS64-NEXT: .LBB0_4: # %end
178 ; MIPS64-NEXT: jr $ra
181 ; N64-R6-LABEL: test1:
182 ; N64-R6: # %bb.0: # %entry
183 ; N64-R6-NEXT: lui $1, %hi(%neg(%gp_rel(test1)))
184 ; N64-R6-NEXT: bnez $4, .LBB0_3
185 ; N64-R6-NEXT: daddu $2, $1, $25
186 ; N64-R6-NEXT: # %bb.1: # %entry
187 ; N64-R6-NEXT: daddiu $sp, $sp, -16
188 ; N64-R6-NEXT: sd $ra, 0($sp)
189 ; N64-R6-NEXT: daddiu $1, $zero, %hi(.LBB0_4-.LBB0_2)
190 ; N64-R6-NEXT: dsll $1, $1, 16
191 ; N64-R6-NEXT: daddiu $1, $1, %lo(.LBB0_4-.LBB0_2)
192 ; N64-R6-NEXT: balc .LBB0_2
193 ; N64-R6-NEXT: .LBB0_2: # %entry
194 ; N64-R6-NEXT: daddu $1, $ra, $1
195 ; N64-R6-NEXT: ld $ra, 0($sp)
196 ; N64-R6-NEXT: daddiu $sp, $sp, 16
197 ; N64-R6-NEXT: jrc $1
198 ; N64-R6-NEXT: .LBB0_3: # %then
199 ; N64-R6-NEXT: daddiu $1, $2, %lo(%neg(%gp_rel(test1)))
200 ; N64-R6-NEXT: addiu $2, $zero, 1
201 ; N64-R6-NEXT: ld $1, %got_disp(x)($1)
202 ; N64-R6-NEXT: sw $2, 0($1)
203 ; N64-R6-NEXT: .LBB0_4: # %end
204 ; N64-R6-NEXT: jrc $ra
206 ; MICROMIPS-LABEL: test1:
207 ; MICROMIPS: # %bb.0: # %entry
208 ; MICROMIPS-NEXT: lui $2, %hi(_gp_disp)
209 ; MICROMIPS-NEXT: addiu $2, $2, %lo(_gp_disp)
210 ; MICROMIPS-NEXT: bnez $4, $BB0_3
211 ; MICROMIPS-NEXT: addu $2, $2, $25
212 ; MICROMIPS-NEXT: # %bb.1: # %entry
213 ; MICROMIPS-NEXT: addiu $sp, $sp, -8
214 ; MICROMIPS-NEXT: sw $ra, 0($sp)
215 ; MICROMIPS-NEXT: lui $1, %hi(($BB0_4)-($BB0_2))
216 ; MICROMIPS-NEXT: bal $BB0_2
217 ; MICROMIPS-NEXT: addiu $1, $1, %lo(($BB0_4)-($BB0_2))
218 ; MICROMIPS-NEXT: $BB0_2: # %entry
219 ; MICROMIPS-NEXT: addu $1, $ra, $1
220 ; MICROMIPS-NEXT: lw $ra, 0($sp)
221 ; MICROMIPS-NEXT: jr $1
222 ; MICROMIPS-NEXT: addiu $sp, $sp, 8
223 ; MICROMIPS-NEXT: $BB0_3: # %then
224 ; MICROMIPS-NEXT: lw $2, %got(x)($2)
225 ; MICROMIPS-NEXT: li16 $3, 1
226 ; MICROMIPS-NEXT: sw16 $3, 0($2)
227 ; MICROMIPS-NEXT: $BB0_4: # %end
228 ; MICROMIPS-NEXT: jrc $ra
230 ; MICROMIPSSTATIC-LABEL: test1:
231 ; MICROMIPSSTATIC: # %bb.0: # %entry
232 ; MICROMIPSSTATIC-NEXT: bnezc $4, $BB0_2
233 ; MICROMIPSSTATIC-NEXT: # %bb.1: # %entry
234 ; MICROMIPSSTATIC-NEXT: j $BB0_4
235 ; MICROMIPSSTATIC-NEXT: nop
236 ; MICROMIPSSTATIC-NEXT: $BB0_2: # %entry
237 ; MICROMIPSSTATIC-NEXT: j $BB0_3
238 ; MICROMIPSSTATIC-NEXT: nop
239 ; MICROMIPSSTATIC-NEXT: $BB0_3: # %then
240 ; MICROMIPSSTATIC-NEXT: lui $1, %hi(x)
241 ; MICROMIPSSTATIC-NEXT: li16 $2, 1
242 ; MICROMIPSSTATIC-NEXT: sw $2, %lo(x)($1)
243 ; MICROMIPSSTATIC-NEXT: $BB0_4: # %end
244 ; MICROMIPSSTATIC-NEXT: jrc $ra
246 ; MICROMIPSR6STATIC-LABEL: test1:
247 ; MICROMIPSR6STATIC: # %bb.0: # %entry
248 ; MICROMIPSR6STATIC-NEXT: bnezc $4, $BB0_2
249 ; MICROMIPSR6STATIC-NEXT: # %bb.1: # %entry
250 ; MICROMIPSR6STATIC-NEXT: bc $BB0_3
251 ; MICROMIPSR6STATIC-NEXT: $BB0_2: # %then
252 ; MICROMIPSR6STATIC-NEXT: lui $1, %hi(x)
253 ; MICROMIPSR6STATIC-NEXT: li16 $2, 1
254 ; MICROMIPSR6STATIC-NEXT: sw $2, %lo(x)($1)
255 ; MICROMIPSR6STATIC-NEXT: $BB0_3: # %end
256 ; MICROMIPSR6STATIC-NEXT: jrc $ra
258 ; MICROMIPSR6PIC-LABEL: test1:
259 ; MICROMIPSR6PIC: # %bb.0: # %entry
260 ; MICROMIPSR6PIC-NEXT: lui $2, %hi(_gp_disp)
261 ; MICROMIPSR6PIC-NEXT: addiu $2, $2, %lo(_gp_disp)
262 ; MICROMIPSR6PIC-NEXT: addu $2, $2, $25
263 ; MICROMIPSR6PIC-NEXT: bnezc $4, $BB0_3
264 ; MICROMIPSR6PIC-NEXT: # %bb.1: # %entry
265 ; MICROMIPSR6PIC-NEXT: addiu $sp, $sp, -8
266 ; MICROMIPSR6PIC-NEXT: sw $ra, 0($sp)
267 ; MICROMIPSR6PIC-NEXT: lui $1, %hi(($BB0_4)-($BB0_2))
268 ; MICROMIPSR6PIC-NEXT: addiu $1, $1, %lo(($BB0_4)-($BB0_2))
269 ; MICROMIPSR6PIC-NEXT: balc $BB0_2
270 ; MICROMIPSR6PIC-NEXT: $BB0_2: # %entry
271 ; MICROMIPSR6PIC-NEXT: addu $1, $ra, $1
272 ; MICROMIPSR6PIC-NEXT: lw $ra, 0($sp)
273 ; MICROMIPSR6PIC-NEXT: addiu $sp, $sp, 8
274 ; MICROMIPSR6PIC-NEXT: jic $1, 0
275 ; MICROMIPSR6PIC-NEXT: $BB0_3: # %then
276 ; MICROMIPSR6PIC-NEXT: lw $2, %got(x)($2)
277 ; MICROMIPSR6PIC-NEXT: li16 $3, 1
278 ; MICROMIPSR6PIC-NEXT: sw16 $3, 0($2)
279 ; MICROMIPSR6PIC-NEXT: $BB0_4: # %end
280 ; MICROMIPSR6PIC-NEXT: jrc $ra
284 ; NACL-NEXT: lui $2, %hi(_gp_disp)
285 ; NACL-NEXT: addiu $2, $2, %lo(_gp_disp)
286 ; NACL-NEXT: bnez $4, $BB0_3
287 ; NACL-NEXT: addu $2, $2, $25
288 ; NACL-NEXT: # %bb.1:
289 ; NACL-NEXT: addiu $sp, $sp, -8
290 ; NACL-NEXT: sw $ra, 0($sp)
291 ; NACL-NEXT: lui $1, %hi(($BB0_4)-($BB0_2))
292 ; NACL-NEXT: bal $BB0_2
293 ; NACL-NEXT: addiu $1, $1, %lo(($BB0_4)-($BB0_2))
295 ; NACL-NEXT: addu $1, $ra, $1
296 ; NACL-NEXT: lw $ra, 0($sp)
297 ; NACL-NEXT: addiu $sp, $sp, 8
301 ; NACL-NEXT: lw $1, %got(x)($2)
302 ; NACL-NEXT: addiu $2, $zero, 1
303 ; NACL-NEXT: sw $2, 0($1)
304 ; NACL-NEXT: .p2align 4
310 ; Check the NaCl version. Check that sp change is not in the branch delay slot
311 ; of "jr $1" instruction. Check that target of indirect branch "jr $1" is
315 %cmp = icmp eq i32 %s, 0
316 br i1 %cmp, label %end, label %then
319 store i32 1, i32* @x, align 4