Use Align for TFL::TransientStackAlignment
[llvm-core.git] / test / CodeGen / Mips / longbranch.ll
blob43eaa50daf0508bfe5e32553422ec53ac5342765
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)
67 ; O32-PIC-NEXT:    jr $1
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
75 ; O32-PIC-NEXT:    nop
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)
144 ; MIPS4-NEXT:    jr $1
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
152 ; MIPS4-NEXT:    jr $ra
153 ; MIPS4-NEXT:    nop
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)
170 ; MIPS64-NEXT:    jr $1
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
179 ; MIPS64-NEXT:    nop
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
279 ; NACL-LABEL: test1:
280 ; NACL:       # %bb.0:
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))
291 ; NACL-NEXT:  $BB0_2:
292 ; NACL-NEXT:    addu  $1, $ra, $1
293 ; NACL-NEXT:    lw  $ra, 0($sp)
294 ; NACL-NEXT:    addiu $sp, $sp, 8
295 ; NACL-NEXT:    jr  $1
296 ; NACL-NEXT:    nop
297 ; NACL-NEXT:  $BB0_3:
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
302 ; NACL-NEXT:  $BB0_4:
303 ; NACL-NEXT:    jr  $ra
304 ; NACL-NEXT:    nop
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
309 ; bundle aligned.
311 entry:
312   %cmp = icmp eq i32 %s, 0
313   br i1 %cmp, label %end, label %then
315 then:
316   store i32 1, i32* @x, align 4
317   br label %end
319 end:
320   ret void