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_3
235 ; MICROMIPSSTATIC-NEXT: nop
236 ; MICROMIPSSTATIC-NEXT: $BB0_2: # %then
237 ; MICROMIPSSTATIC-NEXT: lui $1, %hi(x)
238 ; MICROMIPSSTATIC-NEXT: li16 $2, 1
239 ; MICROMIPSSTATIC-NEXT: sw $2, %lo(x)($1)
240 ; MICROMIPSSTATIC-NEXT: $BB0_3: # %end
241 ; MICROMIPSSTATIC-NEXT: jrc $ra
243 ; MICROMIPSR6STATIC-LABEL: test1:
244 ; MICROMIPSR6STATIC: # %bb.0: # %entry
245 ; MICROMIPSR6STATIC-NEXT: bnezc $4, $BB0_2
246 ; MICROMIPSR6STATIC-NEXT: # %bb.1: # %entry
247 ; MICROMIPSR6STATIC-NEXT: bc $BB0_3
248 ; MICROMIPSR6STATIC-NEXT: $BB0_2: # %then
249 ; MICROMIPSR6STATIC-NEXT: lui $1, %hi(x)
250 ; MICROMIPSR6STATIC-NEXT: li16 $2, 1
251 ; MICROMIPSR6STATIC-NEXT: sw $2, %lo(x)($1)
252 ; MICROMIPSR6STATIC-NEXT: $BB0_3: # %end
253 ; MICROMIPSR6STATIC-NEXT: jrc $ra
255 ; MICROMIPSR6PIC-LABEL: test1:
256 ; MICROMIPSR6PIC: # %bb.0: # %entry
257 ; MICROMIPSR6PIC-NEXT: lui $2, %hi(_gp_disp)
258 ; MICROMIPSR6PIC-NEXT: addiu $2, $2, %lo(_gp_disp)
259 ; MICROMIPSR6PIC-NEXT: addu $2, $2, $25
260 ; MICROMIPSR6PIC-NEXT: bnezc $4, $BB0_3
261 ; MICROMIPSR6PIC-NEXT: # %bb.1: # %entry
262 ; MICROMIPSR6PIC-NEXT: addiu $sp, $sp, -8
263 ; MICROMIPSR6PIC-NEXT: sw $ra, 0($sp)
264 ; MICROMIPSR6PIC-NEXT: lui $1, %hi(($BB0_4)-($BB0_2))
265 ; MICROMIPSR6PIC-NEXT: addiu $1, $1, %lo(($BB0_4)-($BB0_2))
266 ; MICROMIPSR6PIC-NEXT: balc $BB0_2
267 ; MICROMIPSR6PIC-NEXT: $BB0_2: # %entry
268 ; MICROMIPSR6PIC-NEXT: addu $1, $ra, $1
269 ; MICROMIPSR6PIC-NEXT: lw $ra, 0($sp)
270 ; MICROMIPSR6PIC-NEXT: addiu $sp, $sp, 8
271 ; MICROMIPSR6PIC-NEXT: jic $1, 0
272 ; MICROMIPSR6PIC-NEXT: $BB0_3: # %then
273 ; MICROMIPSR6PIC-NEXT: lw $2, %got(x)($2)
274 ; MICROMIPSR6PIC-NEXT: li16 $3, 1
275 ; MICROMIPSR6PIC-NEXT: sw16 $3, 0($2)
276 ; MICROMIPSR6PIC-NEXT: $BB0_4: # %end
277 ; MICROMIPSR6PIC-NEXT: jrc $ra
281 ; NACL-NEXT: lui $2, %hi(_gp_disp)
282 ; NACL-NEXT: addiu $2, $2, %lo(_gp_disp)
283 ; NACL-NEXT: bnez $4, $BB0_3
284 ; NACL-NEXT: addu $2, $2, $25
285 ; NACL-NEXT: # %bb.1:
286 ; NACL-NEXT: addiu $sp, $sp, -8
287 ; NACL-NEXT: sw $ra, 0($sp)
288 ; NACL-NEXT: lui $1, %hi(($BB0_4)-($BB0_2))
289 ; NACL-NEXT: bal $BB0_2
290 ; NACL-NEXT: addiu $1, $1, %lo(($BB0_4)-($BB0_2))
292 ; NACL-NEXT: addu $1, $ra, $1
293 ; NACL-NEXT: lw $ra, 0($sp)
294 ; NACL-NEXT: addiu $sp, $sp, 8
298 ; NACL-NEXT: lw $1, %got(x)($2)
299 ; NACL-NEXT: addiu $2, $zero, 1
300 ; NACL-NEXT: sw $2, 0($1)
301 ; NACL-NEXT: .p2align 4
307 ; Check the NaCl version. Check that sp change is not in the branch delay slot
308 ; of "jr $1" instruction. Check that target of indirect branch "jr $1" is
312 %cmp = icmp eq i32 %s, 0
313 br i1 %cmp, label %end, label %then
316 store i32 1, i32* @x, align 4