Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / LoongArch / sextw-removal.ll
blob2bb39395c1d1b643272c4ad35d9a0e1c5b66a735
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s --mtriple=loongarch64 | FileCheck %s --check-prefixes=CHECK
3 ; RUN: llc < %s --mtriple=loongarch64 --loongarch-disable-sextw-removal | \
4 ; RUN:   FileCheck %s --check-prefix=NORMV
6 define void @test1(i32 signext %arg, i32 signext %arg1) nounwind {
7 ; CHECK-LABEL: test1:
8 ; CHECK:       # %bb.0: # %bb
9 ; CHECK-NEXT:    addi.d $sp, $sp, -32
10 ; CHECK-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
11 ; CHECK-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
12 ; CHECK-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
13 ; CHECK-NEXT:    move $fp, $a1
14 ; CHECK-NEXT:    sra.w $s0, $a0, $a1
15 ; CHECK-NEXT:    .p2align 4, , 16
16 ; CHECK-NEXT:  .LBB0_1: # %bb2
17 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
18 ; CHECK-NEXT:    move $a0, $s0
19 ; CHECK-NEXT:    bl %plt(bar)
20 ; CHECK-NEXT:    sll.w $s0, $s0, $fp
21 ; CHECK-NEXT:    bnez $a0, .LBB0_1
22 ; CHECK-NEXT:  # %bb.2: # %bb7
23 ; CHECK-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
24 ; CHECK-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
25 ; CHECK-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
26 ; CHECK-NEXT:    addi.d $sp, $sp, 32
27 ; CHECK-NEXT:    ret
29 ; NORMV-LABEL: test1:
30 ; NORMV:       # %bb.0: # %bb
31 ; NORMV-NEXT:    addi.d $sp, $sp, -32
32 ; NORMV-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
33 ; NORMV-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
34 ; NORMV-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
35 ; NORMV-NEXT:    move $fp, $a1
36 ; NORMV-NEXT:    sra.w $s0, $a0, $a1
37 ; NORMV-NEXT:    .p2align 4, , 16
38 ; NORMV-NEXT:  .LBB0_1: # %bb2
39 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
40 ; NORMV-NEXT:    addi.w $a0, $s0, 0
41 ; NORMV-NEXT:    bl %plt(bar)
42 ; NORMV-NEXT:    sll.w $s0, $s0, $fp
43 ; NORMV-NEXT:    bnez $a0, .LBB0_1
44 ; NORMV-NEXT:  # %bb.2: # %bb7
45 ; NORMV-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
46 ; NORMV-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
47 ; NORMV-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
48 ; NORMV-NEXT:    addi.d $sp, $sp, 32
49 ; NORMV-NEXT:    ret
50 bb:
51   %i = ashr i32 %arg, %arg1
52   br label %bb2
54 bb2:                                              ; preds = %bb2, %bb
55   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
56   %i4 = tail call signext i32 @bar(i32 signext %i3)
57   %i5 = shl i32 %i3, %arg1
58   %i6 = icmp eq i32 %i4, 0
59   br i1 %i6, label %bb7, label %bb2
61 bb7:                                              ; preds = %bb2
62   ret void
65 declare signext i32 @bar(i32 signext)
67 define signext i32 @test2(ptr %p, i32 signext %b) nounwind {
68 ; CHECK-LABEL: test2:
69 ; CHECK:       # %bb.0:
70 ; CHECK-NEXT:    ld.w $a0, $a0, 0
71 ; CHECK-NEXT:    ori $a2, $zero, 1
72 ; CHECK-NEXT:    sll.w $a1, $a2, $a1
73 ; CHECK-NEXT:    andn $a0, $a0, $a1
74 ; CHECK-NEXT:    ret
76 ; NORMV-LABEL: test2:
77 ; NORMV:       # %bb.0:
78 ; NORMV-NEXT:    ld.w $a0, $a0, 0
79 ; NORMV-NEXT:    ori $a2, $zero, 1
80 ; NORMV-NEXT:    sll.w $a1, $a2, $a1
81 ; NORMV-NEXT:    andn $a0, $a0, $a1
82 ; NORMV-NEXT:    addi.w $a0, $a0, 0
83 ; NORMV-NEXT:    ret
84   %a = load i32, ptr %p
85   %shl = shl i32 1, %b
86   %neg = xor i32 %shl, -1
87   %and1 = and i32 %neg, %a
88   ret i32 %and1
91 define signext i32 @test3(ptr %p, i32 signext %b) nounwind {
92 ; CHECK-LABEL: test3:
93 ; CHECK:       # %bb.0:
94 ; CHECK-NEXT:    ld.w $a0, $a0, 0
95 ; CHECK-NEXT:    ori $a2, $zero, 1
96 ; CHECK-NEXT:    sll.w $a1, $a2, $a1
97 ; CHECK-NEXT:    orn $a0, $a0, $a1
98 ; CHECK-NEXT:    ret
100 ; NORMV-LABEL: test3:
101 ; NORMV:       # %bb.0:
102 ; NORMV-NEXT:    ld.w $a0, $a0, 0
103 ; NORMV-NEXT:    ori $a2, $zero, 1
104 ; NORMV-NEXT:    sll.w $a1, $a2, $a1
105 ; NORMV-NEXT:    orn $a0, $a0, $a1
106 ; NORMV-NEXT:    addi.w $a0, $a0, 0
107 ; NORMV-NEXT:    ret
108   %a = load i32, ptr %p
109   %shl = shl i32 1, %b
110   %neg = xor i32 %shl, -1
111   %and1 = or i32 %neg, %a
112   ret i32 %and1
115 define signext i32 @test4(ptr %p, i32 signext %b) nounwind {
116 ; CHECK-LABEL: test4:
117 ; CHECK:       # %bb.0:
118 ; CHECK-NEXT:    ld.w $a0, $a0, 0
119 ; CHECK-NEXT:    ori $a2, $zero, 1
120 ; CHECK-NEXT:    sll.w $a1, $a2, $a1
121 ; CHECK-NEXT:    xor $a0, $a1, $a0
122 ; CHECK-NEXT:    nor $a0, $a0, $zero
123 ; CHECK-NEXT:    addi.w $a0, $a0, 0
124 ; CHECK-NEXT:    ret
126 ; NORMV-LABEL: test4:
127 ; NORMV:       # %bb.0:
128 ; NORMV-NEXT:    ld.w $a0, $a0, 0
129 ; NORMV-NEXT:    ori $a2, $zero, 1
130 ; NORMV-NEXT:    sll.w $a1, $a2, $a1
131 ; NORMV-NEXT:    xor $a0, $a1, $a0
132 ; NORMV-NEXT:    nor $a0, $a0, $zero
133 ; NORMV-NEXT:    addi.w $a0, $a0, 0
134 ; NORMV-NEXT:    ret
135   %a = load i32, ptr %p
136   %shl = shl i32 1, %b
137   %neg = xor i32 %shl, -1
138   %and1 = xor i32 %neg, %a
139   ret i32 %and1
142 define void @test5(i32 signext %arg, i32 signext %arg1) nounwind {
143 ; CHECK-LABEL: test5:
144 ; CHECK:       # %bb.0: # %bb
145 ; CHECK-NEXT:    addi.d $sp, $sp, -48
146 ; CHECK-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill
147 ; CHECK-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill
148 ; CHECK-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill
149 ; CHECK-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill
150 ; CHECK-NEXT:    st.d $s2, $sp, 8 # 8-byte Folded Spill
151 ; CHECK-NEXT:    sra.w $a1, $a0, $a1
152 ; CHECK-NEXT:    lu12i.w $a0, 349525
153 ; CHECK-NEXT:    ori $fp, $a0, 1365
154 ; CHECK-NEXT:    lu12i.w $a0, 209715
155 ; CHECK-NEXT:    ori $s0, $a0, 819
156 ; CHECK-NEXT:    lu12i.w $a0, 61680
157 ; CHECK-NEXT:    ori $s1, $a0, 3855
158 ; CHECK-NEXT:    lu12i.w $a0, 4112
159 ; CHECK-NEXT:    ori $s2, $a0, 257
160 ; CHECK-NEXT:    .p2align 4, , 16
161 ; CHECK-NEXT:  .LBB4_1: # %bb2
162 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
163 ; CHECK-NEXT:    addi.w $a0, $a1, 0
164 ; CHECK-NEXT:    bl %plt(bar)
165 ; CHECK-NEXT:    srli.d $a1, $a0, 1
166 ; CHECK-NEXT:    and $a1, $a1, $fp
167 ; CHECK-NEXT:    sub.d $a1, $a0, $a1
168 ; CHECK-NEXT:    and $a2, $a1, $s0
169 ; CHECK-NEXT:    srli.d $a1, $a1, 2
170 ; CHECK-NEXT:    and $a1, $a1, $s0
171 ; CHECK-NEXT:    add.d $a1, $a2, $a1
172 ; CHECK-NEXT:    srli.d $a2, $a1, 4
173 ; CHECK-NEXT:    add.d $a1, $a1, $a2
174 ; CHECK-NEXT:    and $a1, $a1, $s1
175 ; CHECK-NEXT:    mul.d $a1, $a1, $s2
176 ; CHECK-NEXT:    bstrpick.d $a1, $a1, 31, 24
177 ; CHECK-NEXT:    bnez $a0, .LBB4_1
178 ; CHECK-NEXT:  # %bb.2: # %bb7
179 ; CHECK-NEXT:    ld.d $s2, $sp, 8 # 8-byte Folded Reload
180 ; CHECK-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload
181 ; CHECK-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload
182 ; CHECK-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload
183 ; CHECK-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload
184 ; CHECK-NEXT:    addi.d $sp, $sp, 48
185 ; CHECK-NEXT:    ret
187 ; NORMV-LABEL: test5:
188 ; NORMV:       # %bb.0: # %bb
189 ; NORMV-NEXT:    addi.d $sp, $sp, -48
190 ; NORMV-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill
191 ; NORMV-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill
192 ; NORMV-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill
193 ; NORMV-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill
194 ; NORMV-NEXT:    st.d $s2, $sp, 8 # 8-byte Folded Spill
195 ; NORMV-NEXT:    sra.w $a1, $a0, $a1
196 ; NORMV-NEXT:    lu12i.w $a0, 349525
197 ; NORMV-NEXT:    ori $fp, $a0, 1365
198 ; NORMV-NEXT:    lu12i.w $a0, 209715
199 ; NORMV-NEXT:    ori $s0, $a0, 819
200 ; NORMV-NEXT:    lu12i.w $a0, 61680
201 ; NORMV-NEXT:    ori $s1, $a0, 3855
202 ; NORMV-NEXT:    lu12i.w $a0, 4112
203 ; NORMV-NEXT:    ori $s2, $a0, 257
204 ; NORMV-NEXT:    .p2align 4, , 16
205 ; NORMV-NEXT:  .LBB4_1: # %bb2
206 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
207 ; NORMV-NEXT:    addi.w $a0, $a1, 0
208 ; NORMV-NEXT:    bl %plt(bar)
209 ; NORMV-NEXT:    srli.d $a1, $a0, 1
210 ; NORMV-NEXT:    and $a1, $a1, $fp
211 ; NORMV-NEXT:    sub.d $a1, $a0, $a1
212 ; NORMV-NEXT:    and $a2, $a1, $s0
213 ; NORMV-NEXT:    srli.d $a1, $a1, 2
214 ; NORMV-NEXT:    and $a1, $a1, $s0
215 ; NORMV-NEXT:    add.d $a1, $a2, $a1
216 ; NORMV-NEXT:    srli.d $a2, $a1, 4
217 ; NORMV-NEXT:    add.d $a1, $a1, $a2
218 ; NORMV-NEXT:    and $a1, $a1, $s1
219 ; NORMV-NEXT:    mul.d $a1, $a1, $s2
220 ; NORMV-NEXT:    bstrpick.d $a1, $a1, 31, 24
221 ; NORMV-NEXT:    bnez $a0, .LBB4_1
222 ; NORMV-NEXT:  # %bb.2: # %bb7
223 ; NORMV-NEXT:    ld.d $s2, $sp, 8 # 8-byte Folded Reload
224 ; NORMV-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload
225 ; NORMV-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload
226 ; NORMV-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload
227 ; NORMV-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload
228 ; NORMV-NEXT:    addi.d $sp, $sp, 48
229 ; NORMV-NEXT:    ret
231   %i = ashr i32 %arg, %arg1
232   br label %bb2
234 bb2:                                              ; preds = %bb2, %bb
235   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
236   %i4 = tail call signext i32 @bar(i32 signext %i3)
237   %i5 = tail call i32 @llvm.ctpop.i32(i32 %i4)
238   %i6 = icmp eq i32 %i4, 0
239   br i1 %i6, label %bb7, label %bb2
241 bb7:                                              ; preds = %bb2
242   ret void
245 declare i32 @llvm.ctpop.i32(i32)
247 define void @test6(i32 signext %arg, i32 signext %arg1) nounwind {
248 ; CHECK-LABEL: test6:
249 ; CHECK:       # %bb.0: # %bb
250 ; CHECK-NEXT:    addi.d $sp, $sp, -32
251 ; CHECK-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
252 ; CHECK-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
253 ; CHECK-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
254 ; CHECK-NEXT:    sra.w $fp, $a0, $a1
255 ; CHECK-NEXT:    .p2align 4, , 16
256 ; CHECK-NEXT:  .LBB5_1: # %bb2
257 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
258 ; CHECK-NEXT:    addi.w $a0, $fp, 0
259 ; CHECK-NEXT:    bl %plt(baz)
260 ; CHECK-NEXT:    move $s0, $a0
261 ; CHECK-NEXT:    bl %plt(__fixsfsi)
262 ; CHECK-NEXT:    move $fp, $a0
263 ; CHECK-NEXT:    move $a0, $s0
264 ; CHECK-NEXT:    move $a1, $zero
265 ; CHECK-NEXT:    bl %plt(__nesf2)
266 ; CHECK-NEXT:    bnez $a0, .LBB5_1
267 ; CHECK-NEXT:  # %bb.2: # %bb7
268 ; CHECK-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
269 ; CHECK-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
270 ; CHECK-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
271 ; CHECK-NEXT:    addi.d $sp, $sp, 32
272 ; CHECK-NEXT:    ret
274 ; NORMV-LABEL: test6:
275 ; NORMV:       # %bb.0: # %bb
276 ; NORMV-NEXT:    addi.d $sp, $sp, -32
277 ; NORMV-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
278 ; NORMV-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
279 ; NORMV-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
280 ; NORMV-NEXT:    sra.w $fp, $a0, $a1
281 ; NORMV-NEXT:    .p2align 4, , 16
282 ; NORMV-NEXT:  .LBB5_1: # %bb2
283 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
284 ; NORMV-NEXT:    addi.w $a0, $fp, 0
285 ; NORMV-NEXT:    bl %plt(baz)
286 ; NORMV-NEXT:    move $s0, $a0
287 ; NORMV-NEXT:    bl %plt(__fixsfsi)
288 ; NORMV-NEXT:    move $fp, $a0
289 ; NORMV-NEXT:    move $a0, $s0
290 ; NORMV-NEXT:    move $a1, $zero
291 ; NORMV-NEXT:    bl %plt(__nesf2)
292 ; NORMV-NEXT:    bnez $a0, .LBB5_1
293 ; NORMV-NEXT:  # %bb.2: # %bb7
294 ; NORMV-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
295 ; NORMV-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
296 ; NORMV-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
297 ; NORMV-NEXT:    addi.d $sp, $sp, 32
298 ; NORMV-NEXT:    ret
300   %i = ashr i32 %arg, %arg1
301   br label %bb2
303 bb2:                                              ; preds = %bb2, %bb
304   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
305   %i4 = tail call float @baz(i32 signext %i3)
306   %i5 = fptosi float %i4 to i32
307   %i6 = fcmp oeq float %i4, zeroinitializer
308   br i1 %i6, label %bb7, label %bb2
310 bb7:                                              ; preds = %bb2
311   ret void
313 declare float @baz(i32 signext %i3)
315 define void @test7(i32 signext %arg, i32 signext %arg1) nounwind {
316 ; CHECK-LABEL: test7:
317 ; CHECK:       # %bb.0: # %bb
318 ; CHECK-NEXT:    addi.d $sp, $sp, -48
319 ; CHECK-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill
320 ; CHECK-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill
321 ; CHECK-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill
322 ; CHECK-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill
323 ; CHECK-NEXT:    st.d $s2, $sp, 8 # 8-byte Folded Spill
324 ; CHECK-NEXT:    sra.w $a0, $a0, $a1
325 ; CHECK-NEXT:    lu12i.w $a1, 349525
326 ; CHECK-NEXT:    ori $a1, $a1, 1365
327 ; CHECK-NEXT:    lu32i.d $a1, 349525
328 ; CHECK-NEXT:    lu52i.d $fp, $a1, 1365
329 ; CHECK-NEXT:    lu12i.w $a1, 209715
330 ; CHECK-NEXT:    ori $a1, $a1, 819
331 ; CHECK-NEXT:    lu32i.d $a1, 209715
332 ; CHECK-NEXT:    lu52i.d $s0, $a1, 819
333 ; CHECK-NEXT:    lu12i.w $a1, 61680
334 ; CHECK-NEXT:    ori $a1, $a1, 3855
335 ; CHECK-NEXT:    lu32i.d $a1, -61681
336 ; CHECK-NEXT:    lu52i.d $s1, $a1, 240
337 ; CHECK-NEXT:    lu12i.w $a1, 4112
338 ; CHECK-NEXT:    ori $a1, $a1, 257
339 ; CHECK-NEXT:    lu32i.d $a1, 65793
340 ; CHECK-NEXT:    lu52i.d $s2, $a1, 16
341 ; CHECK-NEXT:    .p2align 4, , 16
342 ; CHECK-NEXT:  .LBB6_1: # %bb2
343 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
344 ; CHECK-NEXT:    bl %plt(foo)
345 ; CHECK-NEXT:    srli.d $a1, $a0, 1
346 ; CHECK-NEXT:    and $a1, $a1, $fp
347 ; CHECK-NEXT:    sub.d $a0, $a0, $a1
348 ; CHECK-NEXT:    and $a1, $a0, $s0
349 ; CHECK-NEXT:    srli.d $a0, $a0, 2
350 ; CHECK-NEXT:    and $a0, $a0, $s0
351 ; CHECK-NEXT:    add.d $a0, $a1, $a0
352 ; CHECK-NEXT:    srli.d $a1, $a0, 4
353 ; CHECK-NEXT:    add.d $a0, $a0, $a1
354 ; CHECK-NEXT:    and $a0, $a0, $s1
355 ; CHECK-NEXT:    mul.d $a0, $a0, $s2
356 ; CHECK-NEXT:    srli.d $a0, $a0, 56
357 ; CHECK-NEXT:    bnez $a0, .LBB6_1
358 ; CHECK-NEXT:  # %bb.2: # %bb7
359 ; CHECK-NEXT:    ld.d $s2, $sp, 8 # 8-byte Folded Reload
360 ; CHECK-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload
361 ; CHECK-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload
362 ; CHECK-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload
363 ; CHECK-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload
364 ; CHECK-NEXT:    addi.d $sp, $sp, 48
365 ; CHECK-NEXT:    ret
367 ; NORMV-LABEL: test7:
368 ; NORMV:       # %bb.0: # %bb
369 ; NORMV-NEXT:    addi.d $sp, $sp, -48
370 ; NORMV-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill
371 ; NORMV-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill
372 ; NORMV-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill
373 ; NORMV-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill
374 ; NORMV-NEXT:    st.d $s2, $sp, 8 # 8-byte Folded Spill
375 ; NORMV-NEXT:    sra.w $a0, $a0, $a1
376 ; NORMV-NEXT:    lu12i.w $a1, 349525
377 ; NORMV-NEXT:    ori $a1, $a1, 1365
378 ; NORMV-NEXT:    lu32i.d $a1, 349525
379 ; NORMV-NEXT:    lu52i.d $fp, $a1, 1365
380 ; NORMV-NEXT:    lu12i.w $a1, 209715
381 ; NORMV-NEXT:    ori $a1, $a1, 819
382 ; NORMV-NEXT:    lu32i.d $a1, 209715
383 ; NORMV-NEXT:    lu52i.d $s0, $a1, 819
384 ; NORMV-NEXT:    lu12i.w $a1, 61680
385 ; NORMV-NEXT:    ori $a1, $a1, 3855
386 ; NORMV-NEXT:    lu32i.d $a1, -61681
387 ; NORMV-NEXT:    lu52i.d $s1, $a1, 240
388 ; NORMV-NEXT:    lu12i.w $a1, 4112
389 ; NORMV-NEXT:    ori $a1, $a1, 257
390 ; NORMV-NEXT:    lu32i.d $a1, 65793
391 ; NORMV-NEXT:    lu52i.d $s2, $a1, 16
392 ; NORMV-NEXT:    .p2align 4, , 16
393 ; NORMV-NEXT:  .LBB6_1: # %bb2
394 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
395 ; NORMV-NEXT:    addi.w $a0, $a0, 0
396 ; NORMV-NEXT:    bl %plt(foo)
397 ; NORMV-NEXT:    srli.d $a1, $a0, 1
398 ; NORMV-NEXT:    and $a1, $a1, $fp
399 ; NORMV-NEXT:    sub.d $a0, $a0, $a1
400 ; NORMV-NEXT:    and $a1, $a0, $s0
401 ; NORMV-NEXT:    srli.d $a0, $a0, 2
402 ; NORMV-NEXT:    and $a0, $a0, $s0
403 ; NORMV-NEXT:    add.d $a0, $a1, $a0
404 ; NORMV-NEXT:    srli.d $a1, $a0, 4
405 ; NORMV-NEXT:    add.d $a0, $a0, $a1
406 ; NORMV-NEXT:    and $a0, $a0, $s1
407 ; NORMV-NEXT:    mul.d $a0, $a0, $s2
408 ; NORMV-NEXT:    srli.d $a0, $a0, 56
409 ; NORMV-NEXT:    bnez $a0, .LBB6_1
410 ; NORMV-NEXT:  # %bb.2: # %bb7
411 ; NORMV-NEXT:    ld.d $s2, $sp, 8 # 8-byte Folded Reload
412 ; NORMV-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload
413 ; NORMV-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload
414 ; NORMV-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload
415 ; NORMV-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload
416 ; NORMV-NEXT:    addi.d $sp, $sp, 48
417 ; NORMV-NEXT:    ret
419   %i = ashr i32 %arg, %arg1
420   br label %bb2
422 bb2:                                              ; preds = %bb2, %bb
423   %i3 = phi i32 [ %i, %bb ], [ %i6, %bb2 ]
424   %i4 = tail call signext i64 @foo(i32 signext %i3)
425   %i5 = tail call i64 @llvm.ctpop.i64(i64 %i4)
426   %i6 = trunc i64 %i5 to i32
427   %i7 = icmp eq i32 %i6, 0
428   br i1 %i7, label %bb7, label %bb2
430 bb7:                                              ; preds = %bb2
431   ret void
434 declare i64 @llvm.ctpop.i64(i64)
436 define void @test8(i32 signext %arg, i32 signext %arg1) nounwind {
437 ; CHECK-LABEL: test8:
438 ; CHECK:       # %bb.0: # %bb
439 ; CHECK-NEXT:    addi.d $sp, $sp, -16
440 ; CHECK-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
441 ; CHECK-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
442 ; CHECK-NEXT:    sra.w $a0, $a0, $a1
443 ; CHECK-NEXT:    addi.w $fp, $zero, -256
444 ; CHECK-NEXT:    .p2align 4, , 16
445 ; CHECK-NEXT:  .LBB7_1: # %bb2
446 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
447 ; CHECK-NEXT:    addi.w $a0, $a0, 0
448 ; CHECK-NEXT:    bl %plt(foo)
449 ; CHECK-NEXT:    or $a0, $a0, $fp
450 ; CHECK-NEXT:    bnez $a0, .LBB7_1
451 ; CHECK-NEXT:  # %bb.2: # %bb7
452 ; CHECK-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
453 ; CHECK-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
454 ; CHECK-NEXT:    addi.d $sp, $sp, 16
455 ; CHECK-NEXT:    ret
457 ; NORMV-LABEL: test8:
458 ; NORMV:       # %bb.0: # %bb
459 ; NORMV-NEXT:    addi.d $sp, $sp, -16
460 ; NORMV-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
461 ; NORMV-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
462 ; NORMV-NEXT:    sra.w $a0, $a0, $a1
463 ; NORMV-NEXT:    addi.w $fp, $zero, -256
464 ; NORMV-NEXT:    .p2align 4, , 16
465 ; NORMV-NEXT:  .LBB7_1: # %bb2
466 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
467 ; NORMV-NEXT:    addi.w $a0, $a0, 0
468 ; NORMV-NEXT:    bl %plt(foo)
469 ; NORMV-NEXT:    or $a0, $a0, $fp
470 ; NORMV-NEXT:    bnez $a0, .LBB7_1
471 ; NORMV-NEXT:  # %bb.2: # %bb7
472 ; NORMV-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
473 ; NORMV-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
474 ; NORMV-NEXT:    addi.d $sp, $sp, 16
475 ; NORMV-NEXT:    ret
477   %i = ashr i32 %arg, %arg1
478   br label %bb2
480 bb2:                                              ; preds = %bb2, %bb
481   %i3 = phi i32 [ %i, %bb ], [ %i6, %bb2 ]
482   %i4 = tail call signext i64 @foo(i32 signext %i3)
483   %i5 = or i64 %i4, -256
484   %i6 = trunc i64 %i5 to i32
485   %i7 = icmp eq i32 %i6, 0
486   br i1 %i7, label %bb7, label %bb2
488 bb7:                                              ; preds = %bb2
489   ret void
492 declare i64 @foo(i32 signext)
494 define void @test9(i32 signext %arg, i32 signext %arg1) nounwind {
495 ; CHECK-LABEL: test9:
496 ; CHECK:       # %bb.0: # %bb
497 ; CHECK-NEXT:    addi.d $sp, $sp, -16
498 ; CHECK-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
499 ; CHECK-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
500 ; CHECK-NEXT:    sra.w $a0, $a0, $a1
501 ; CHECK-NEXT:    ori $fp, $zero, 254
502 ; CHECK-NEXT:    .p2align 4, , 16
503 ; CHECK-NEXT:  .LBB8_1: # %bb2
504 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
505 ; CHECK-NEXT:    bl %plt(bar)
506 ; CHECK-NEXT:    move $a1, $a0
507 ; CHECK-NEXT:    slti $a0, $a0, 255
508 ; CHECK-NEXT:    blt $fp, $a1, .LBB8_1
509 ; CHECK-NEXT:  # %bb.2: # %bb7
510 ; CHECK-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
511 ; CHECK-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
512 ; CHECK-NEXT:    addi.d $sp, $sp, 16
513 ; CHECK-NEXT:    ret
515 ; NORMV-LABEL: test9:
516 ; NORMV:       # %bb.0: # %bb
517 ; NORMV-NEXT:    addi.d $sp, $sp, -16
518 ; NORMV-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
519 ; NORMV-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
520 ; NORMV-NEXT:    sra.w $a1, $a0, $a1
521 ; NORMV-NEXT:    ori $fp, $zero, 254
522 ; NORMV-NEXT:    .p2align 4, , 16
523 ; NORMV-NEXT:  .LBB8_1: # %bb2
524 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
525 ; NORMV-NEXT:    addi.w $a0, $a1, 0
526 ; NORMV-NEXT:    bl %plt(bar)
527 ; NORMV-NEXT:    slti $a1, $a0, 255
528 ; NORMV-NEXT:    blt $fp, $a0, .LBB8_1
529 ; NORMV-NEXT:  # %bb.2: # %bb7
530 ; NORMV-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
531 ; NORMV-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
532 ; NORMV-NEXT:    addi.d $sp, $sp, 16
533 ; NORMV-NEXT:    ret
535   %i = ashr i32 %arg, %arg1
536   br label %bb2
538 bb2:                                              ; preds = %bb2, %bb
539   %i3 = phi i32 [ %i, %bb ], [ %i7, %bb2 ]
540   %i4 = tail call signext i32 @bar(i32 signext %i3)
541   %i5 = icmp slt i32 %i4, 255
542   %i6 = sext i1 %i5 to i32
543   %i7 = sub i32 0, %i6
544   br i1 %i5, label %bb7, label %bb2
546 bb7:                                              ; preds = %bb2
547   ret void
550 define void @test10(i32 signext %arg, i32 signext %arg1) nounwind {
551 ; CHECK-LABEL: test10:
552 ; CHECK:       # %bb.0: # %bb
553 ; CHECK-NEXT:    addi.d $sp, $sp, -16
554 ; CHECK-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
555 ; CHECK-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
556 ; CHECK-NEXT:    sra.w $fp, $a0, $a1
557 ; CHECK-NEXT:    .p2align 4, , 16
558 ; CHECK-NEXT:  .LBB9_1: # %bb2
559 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
560 ; CHECK-NEXT:    addi.w $a0, $fp, 0
561 ; CHECK-NEXT:    bl %plt(baz)
562 ; CHECK-NEXT:    move $fp, $a0
563 ; CHECK-NEXT:    move $a1, $zero
564 ; CHECK-NEXT:    bl %plt(__nesf2)
565 ; CHECK-NEXT:    bnez $a0, .LBB9_1
566 ; CHECK-NEXT:  # %bb.2: # %bb7
567 ; CHECK-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
568 ; CHECK-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
569 ; CHECK-NEXT:    addi.d $sp, $sp, 16
570 ; CHECK-NEXT:    ret
572 ; NORMV-LABEL: test10:
573 ; NORMV:       # %bb.0: # %bb
574 ; NORMV-NEXT:    addi.d $sp, $sp, -16
575 ; NORMV-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
576 ; NORMV-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
577 ; NORMV-NEXT:    sra.w $fp, $a0, $a1
578 ; NORMV-NEXT:    .p2align 4, , 16
579 ; NORMV-NEXT:  .LBB9_1: # %bb2
580 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
581 ; NORMV-NEXT:    addi.w $a0, $fp, 0
582 ; NORMV-NEXT:    bl %plt(baz)
583 ; NORMV-NEXT:    move $fp, $a0
584 ; NORMV-NEXT:    move $a1, $zero
585 ; NORMV-NEXT:    bl %plt(__nesf2)
586 ; NORMV-NEXT:    bnez $a0, .LBB9_1
587 ; NORMV-NEXT:  # %bb.2: # %bb7
588 ; NORMV-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
589 ; NORMV-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
590 ; NORMV-NEXT:    addi.d $sp, $sp, 16
591 ; NORMV-NEXT:    ret
593   %i = ashr i32 %arg, %arg1
594   br label %bb2
596 bb2:                                              ; preds = %bb2, %bb
597   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
598   %i4 = tail call float @baz(i32 signext %i3)
599   %i5 = bitcast float %i4 to i32
600   %i6 = fcmp oeq float %i4, zeroinitializer
601   br i1 %i6, label %bb7, label %bb2
603 bb7:                                              ; preds = %bb2
604   ret void
607 define signext i32 @test11(i64 %arg1, i64 %arg2, i64 %arg3)  {
608 ; CHECK-LABEL: test11:
609 ; CHECK:       # %bb.0: # %entry
610 ; CHECK-NEXT:    addi.d $a2, $a2, -1
611 ; CHECK-NEXT:    ori $a3, $zero, 256
612 ; CHECK-NEXT:    .p2align 4, , 16
613 ; CHECK-NEXT:  .LBB10_1: # %bb2
614 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
615 ; CHECK-NEXT:    andi $a0, $a0, 1234
616 ; CHECK-NEXT:    addi.d $a2, $a2, 1
617 ; CHECK-NEXT:    add.w $a0, $a0, $a1
618 ; CHECK-NEXT:    bltu $a2, $a3, .LBB10_1
619 ; CHECK-NEXT:  # %bb.2: # %bb7
620 ; CHECK-NEXT:    ret
622 ; NORMV-LABEL: test11:
623 ; NORMV:       # %bb.0: # %entry
624 ; NORMV-NEXT:    addi.d $a2, $a2, -1
625 ; NORMV-NEXT:    ori $a3, $zero, 256
626 ; NORMV-NEXT:    .p2align 4, , 16
627 ; NORMV-NEXT:  .LBB10_1: # %bb2
628 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
629 ; NORMV-NEXT:    andi $a0, $a0, 1234
630 ; NORMV-NEXT:    addi.d $a2, $a2, 1
631 ; NORMV-NEXT:    add.d $a0, $a0, $a1
632 ; NORMV-NEXT:    bltu $a2, $a3, .LBB10_1
633 ; NORMV-NEXT:  # %bb.2: # %bb7
634 ; NORMV-NEXT:    addi.w $a0, $a0, 0
635 ; NORMV-NEXT:    ret
636 entry:
637   br label %bb2
639 bb2:                                              ; preds = %bb2, %entry
640   %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]
641   %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]
642   %i3 = add i64 %i2, 1
643   %i4 = and i64 %i1, 1234
644   %i5 = add i64 %i4, %arg2
645   %i6 = icmp ugt i64 %i2, 255
646   br i1 %i6, label %bb7, label %bb2
648 bb7:                                              ; preds = %bb2
649   %i7 = trunc i64 %i5 to i32
650   ret i32 %i7
653 define signext i32 @test12(i64 %arg1, i64 %arg2, i64 %arg3)  {
654 ; CHECK-LABEL: test12:
655 ; CHECK:       # %bb.0: # %entry
656 ; CHECK-NEXT:    addi.d $a3, $a2, -1
657 ; CHECK-NEXT:    ori $a4, $zero, 256
658 ; CHECK-NEXT:    .p2align 4, , 16
659 ; CHECK-NEXT:  .LBB11_1: # %bb2
660 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
661 ; CHECK-NEXT:    xor $a0, $a0, $a1
662 ; CHECK-NEXT:    mul.w $a2, $a0, $a1
663 ; CHECK-NEXT:    add.w $a0, $a0, $a2
664 ; CHECK-NEXT:    and $a2, $a2, $a0
665 ; CHECK-NEXT:    addi.d $a3, $a3, 1
666 ; CHECK-NEXT:    add.d $a0, $a2, $a1
667 ; CHECK-NEXT:    bltu $a3, $a4, .LBB11_1
668 ; CHECK-NEXT:  # %bb.2: # %bb7
669 ; CHECK-NEXT:    move $a0, $a2
670 ; CHECK-NEXT:    ret
672 ; NORMV-LABEL: test12:
673 ; NORMV:       # %bb.0: # %entry
674 ; NORMV-NEXT:    addi.d $a2, $a2, -1
675 ; NORMV-NEXT:    ori $a3, $zero, 256
676 ; NORMV-NEXT:    .p2align 4, , 16
677 ; NORMV-NEXT:  .LBB11_1: # %bb2
678 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
679 ; NORMV-NEXT:    xor $a0, $a0, $a1
680 ; NORMV-NEXT:    mul.d $a4, $a0, $a1
681 ; NORMV-NEXT:    add.d $a0, $a0, $a4
682 ; NORMV-NEXT:    and $a4, $a4, $a0
683 ; NORMV-NEXT:    addi.d $a2, $a2, 1
684 ; NORMV-NEXT:    add.d $a0, $a4, $a1
685 ; NORMV-NEXT:    bltu $a2, $a3, .LBB11_1
686 ; NORMV-NEXT:  # %bb.2: # %bb7
687 ; NORMV-NEXT:    addi.w $a0, $a4, 0
688 ; NORMV-NEXT:    ret
689 entry:
690   br label %bb2
692 bb2:                                              ; preds = %bb2, %entry
693   %i1 = phi i64 [ %arg1, %entry ], [ %i6, %bb2 ]
694   %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]
695   %i3 = add i64 %i2, 1
696   %i4 = xor i64 %i1, %arg2
697   %i5 = mul i64 %i4, %arg2
698   %i9 = add i64 %i4, %i5
699   %i8 = and i64 %i5, %i9
700   %i6 = add i64 %i8, %arg2
701   %i7 = icmp ugt i64 %i2, 255
702   br i1 %i7, label %bb7, label %bb2
704 bb7:                                              ; preds = %bb2
705   %r = trunc i64 %i8 to i32
706   ret i32 %r
709 define signext i32 @test13(i64 %arg1, i64 %arg2, i64 %arg3)  {
710 ; CHECK-LABEL: test13:
711 ; CHECK:       # %bb.0: # %entry
712 ; CHECK-NEXT:    addi.d $a2, $a2, -1
713 ; CHECK-NEXT:    ori $a3, $zero, 256
714 ; CHECK-NEXT:    .p2align 4, , 16
715 ; CHECK-NEXT:  .LBB12_1: # %bb2
716 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
717 ; CHECK-NEXT:    div.d $a0, $a0, $a1
718 ; CHECK-NEXT:    addi.d $a2, $a2, 1
719 ; CHECK-NEXT:    add.d $a0, $a0, $a1
720 ; CHECK-NEXT:    bltu $a2, $a3, .LBB12_1
721 ; CHECK-NEXT:  # %bb.2: # %bb7
722 ; CHECK-NEXT:    addi.w $a0, $a0, 0
723 ; CHECK-NEXT:    ret
725 ; NORMV-LABEL: test13:
726 ; NORMV:       # %bb.0: # %entry
727 ; NORMV-NEXT:    addi.d $a2, $a2, -1
728 ; NORMV-NEXT:    ori $a3, $zero, 256
729 ; NORMV-NEXT:    .p2align 4, , 16
730 ; NORMV-NEXT:  .LBB12_1: # %bb2
731 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
732 ; NORMV-NEXT:    div.d $a0, $a0, $a1
733 ; NORMV-NEXT:    addi.d $a2, $a2, 1
734 ; NORMV-NEXT:    add.d $a0, $a0, $a1
735 ; NORMV-NEXT:    bltu $a2, $a3, .LBB12_1
736 ; NORMV-NEXT:  # %bb.2: # %bb7
737 ; NORMV-NEXT:    addi.w $a0, $a0, 0
738 ; NORMV-NEXT:    ret
739 entry:
740   br label %bb2
742 bb2:                                              ; preds = %bb2, %entry
743   %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]
744   %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]
745   %i3 = add i64 %i2, 1
746   %i4 = sdiv i64 %i1, %arg2
747   %i5 = add i64 %i4, %arg2
748   %i6 = icmp ugt i64 %i2, 255
749   br i1 %i6, label %bb7, label %bb2
751 bb7:                                              ; preds = %bb2
752   %i8 = trunc i64 %i5 to i32
753   ret i32 %i8
757 define signext i32 @test14(i32 signext %0, i32 signext %1) {
758 ; CHECK-LABEL: test14:
759 ; CHECK:       # %bb.0:
760 ; CHECK-NEXT:    ori $a2, $zero, 2
761 ; CHECK-NEXT:    blt $a1, $a2, .LBB13_4
762 ; CHECK-NEXT:  # %bb.1: # %.preheader
763 ; CHECK-NEXT:    ori $a3, $zero, 1
764 ; CHECK-NEXT:    addi.w $a2, $zero, -1
765 ; CHECK-NEXT:    ori $a4, $zero, 1000
766 ; CHECK-NEXT:    .p2align 4, , 16
767 ; CHECK-NEXT:  .LBB13_2: # =>This Inner Loop Header: Depth=1
768 ; CHECK-NEXT:    blt $a4, $a0, .LBB13_5
769 ; CHECK-NEXT:  # %bb.3: # in Loop: Header=BB13_2 Depth=1
770 ; CHECK-NEXT:    add.w $a0, $a3, $a0
771 ; CHECK-NEXT:    addi.w $a3, $a3, 1
772 ; CHECK-NEXT:    blt $a3, $a1, .LBB13_2
773 ; CHECK-NEXT:  .LBB13_4:
774 ; CHECK-NEXT:    ret
775 ; CHECK-NEXT:  .LBB13_5:
776 ; CHECK-NEXT:    move $a0, $a2
777 ; CHECK-NEXT:    ret
779 ; NORMV-LABEL: test14:
780 ; NORMV:       # %bb.0:
781 ; NORMV-NEXT:    ori $a2, $zero, 2
782 ; NORMV-NEXT:    blt $a1, $a2, .LBB13_4
783 ; NORMV-NEXT:  # %bb.1: # %.preheader
784 ; NORMV-NEXT:    ori $a3, $zero, 1
785 ; NORMV-NEXT:    addi.w $a2, $zero, -1
786 ; NORMV-NEXT:    ori $a4, $zero, 1000
787 ; NORMV-NEXT:    .p2align 4, , 16
788 ; NORMV-NEXT:  .LBB13_2: # =>This Inner Loop Header: Depth=1
789 ; NORMV-NEXT:    addi.w $a5, $a0, 0
790 ; NORMV-NEXT:    blt $a4, $a5, .LBB13_5
791 ; NORMV-NEXT:  # %bb.3: # in Loop: Header=BB13_2 Depth=1
792 ; NORMV-NEXT:    add.d $a0, $a3, $a0
793 ; NORMV-NEXT:    addi.d $a3, $a3, 1
794 ; NORMV-NEXT:    addi.w $a3, $a3, 0
795 ; NORMV-NEXT:    addi.w $a0, $a0, 0
796 ; NORMV-NEXT:    blt $a3, $a1, .LBB13_2
797 ; NORMV-NEXT:  .LBB13_4:
798 ; NORMV-NEXT:    ret
799 ; NORMV-NEXT:  .LBB13_5:
800 ; NORMV-NEXT:    move $a0, $a2
801 ; NORMV-NEXT:    ret
802   %3 = icmp sgt i32 %1, 1
803   br i1 %3, label %4, label %12
805 4:                                                ; preds = %2, %8
806   %5 = phi i32 [ %10, %8 ], [ 1, %2 ]
807   %6 = phi i32 [ %9, %8 ], [ %0, %2 ]
808   %7 = icmp sgt i32 %6, 1000
809   br i1 %7, label %12, label %8
811 8:                                                ; preds = %4
812   %9 = add nsw i32 %5, %6
813   %10 = add nuw nsw i32 %5, 1
814   %11 = icmp slt i32 %10, %1
815   br i1 %11, label %4, label %12
817 12:                                               ; preds = %8, %4, %2
818   %13 = phi i32 [ %0, %2 ], [ -1, %4 ], [ %9, %8 ]
819   ret i32 %13
822 define signext i32 @test14b(i32 %0, i32 signext %1) {
823 ; CHECK-LABEL: test14b:
824 ; CHECK:       # %bb.0:
825 ; CHECK-NEXT:    ori $a2, $zero, 2
826 ; CHECK-NEXT:    blt $a1, $a2, .LBB14_4
827 ; CHECK-NEXT:  # %bb.1: # %.preheader
828 ; CHECK-NEXT:    ori $a2, $zero, 1
829 ; CHECK-NEXT:    ori $a3, $zero, 1000
830 ; CHECK-NEXT:    .p2align 4, , 16
831 ; CHECK-NEXT:  .LBB14_2: # =>This Inner Loop Header: Depth=1
832 ; CHECK-NEXT:    addi.w $a4, $a0, 0
833 ; CHECK-NEXT:    blt $a3, $a4, .LBB14_5
834 ; CHECK-NEXT:  # %bb.3: # in Loop: Header=BB14_2 Depth=1
835 ; CHECK-NEXT:    add.d $a0, $a2, $a0
836 ; CHECK-NEXT:    addi.w $a2, $a2, 1
837 ; CHECK-NEXT:    blt $a2, $a1, .LBB14_2
838 ; CHECK-NEXT:  .LBB14_4:
839 ; CHECK-NEXT:    addi.w $a0, $a0, 0
840 ; CHECK-NEXT:    ret
841 ; CHECK-NEXT:  .LBB14_5:
842 ; CHECK-NEXT:    addi.d $a0, $zero, -1
843 ; CHECK-NEXT:    addi.w $a0, $a0, 0
844 ; CHECK-NEXT:    ret
846 ; NORMV-LABEL: test14b:
847 ; NORMV:       # %bb.0:
848 ; NORMV-NEXT:    ori $a2, $zero, 2
849 ; NORMV-NEXT:    blt $a1, $a2, .LBB14_4
850 ; NORMV-NEXT:  # %bb.1: # %.preheader
851 ; NORMV-NEXT:    ori $a2, $zero, 1
852 ; NORMV-NEXT:    ori $a3, $zero, 1000
853 ; NORMV-NEXT:    .p2align 4, , 16
854 ; NORMV-NEXT:  .LBB14_2: # =>This Inner Loop Header: Depth=1
855 ; NORMV-NEXT:    addi.w $a4, $a0, 0
856 ; NORMV-NEXT:    blt $a3, $a4, .LBB14_5
857 ; NORMV-NEXT:  # %bb.3: # in Loop: Header=BB14_2 Depth=1
858 ; NORMV-NEXT:    add.d $a0, $a2, $a0
859 ; NORMV-NEXT:    addi.d $a2, $a2, 1
860 ; NORMV-NEXT:    addi.w $a2, $a2, 0
861 ; NORMV-NEXT:    addi.d $a0, $a0, 0
862 ; NORMV-NEXT:    blt $a2, $a1, .LBB14_2
863 ; NORMV-NEXT:  .LBB14_4:
864 ; NORMV-NEXT:    addi.w $a0, $a0, 0
865 ; NORMV-NEXT:    ret
866 ; NORMV-NEXT:  .LBB14_5:
867 ; NORMV-NEXT:    addi.d $a0, $zero, -1
868 ; NORMV-NEXT:    addi.w $a0, $a0, 0
869 ; NORMV-NEXT:    ret
870   %3 = icmp sgt i32 %1, 1
871   br i1 %3, label %4, label %12
873 4:                                                ; preds = %2, %8
874   %5 = phi i32 [ %10, %8 ], [ 1, %2 ]
875   %6 = phi i32 [ %9, %8 ], [ %0, %2 ]
876   %7 = icmp sgt i32 %6, 1000
877   br i1 %7, label %12, label %8
879 8:                                                ; preds = %4
880   %9 = add nsw i32 %5, %6
881   %10 = add nuw nsw i32 %5, 1
882   %11 = icmp slt i32 %10, %1
883   br i1 %11, label %4, label %12
885 12:                                               ; preds = %8, %4, %2
886   %13 = phi i32 [ %0, %2 ], [ -1, %4 ], [ %9, %8 ]
887   ret i32 %13
890 define signext i32 @test14c(i32 zeroext %0, i32 signext %1) {
891 ; CHECK-LABEL: test14c:
892 ; CHECK:       # %bb.0:
893 ; CHECK-NEXT:    ori $a2, $zero, 2
894 ; CHECK-NEXT:    blt $a1, $a2, .LBB15_4
895 ; CHECK-NEXT:  # %bb.1: # %.preheader
896 ; CHECK-NEXT:    ori $a2, $zero, 1
897 ; CHECK-NEXT:    ori $a3, $zero, 1000
898 ; CHECK-NEXT:    .p2align 4, , 16
899 ; CHECK-NEXT:  .LBB15_2: # =>This Inner Loop Header: Depth=1
900 ; CHECK-NEXT:    addi.w $a4, $a0, 0
901 ; CHECK-NEXT:    blt $a3, $a4, .LBB15_5
902 ; CHECK-NEXT:  # %bb.3: # in Loop: Header=BB15_2 Depth=1
903 ; CHECK-NEXT:    add.d $a0, $a2, $a0
904 ; CHECK-NEXT:    addi.w $a2, $a2, 1
905 ; CHECK-NEXT:    blt $a2, $a1, .LBB15_2
906 ; CHECK-NEXT:  .LBB15_4:
907 ; CHECK-NEXT:    addi.w $a0, $a0, 0
908 ; CHECK-NEXT:    ret
909 ; CHECK-NEXT:  .LBB15_5:
910 ; CHECK-NEXT:    addi.d $a0, $zero, -1
911 ; CHECK-NEXT:    addi.w $a0, $a0, 0
912 ; CHECK-NEXT:    ret
914 ; NORMV-LABEL: test14c:
915 ; NORMV:       # %bb.0:
916 ; NORMV-NEXT:    ori $a2, $zero, 2
917 ; NORMV-NEXT:    blt $a1, $a2, .LBB15_4
918 ; NORMV-NEXT:  # %bb.1: # %.preheader
919 ; NORMV-NEXT:    ori $a2, $zero, 1
920 ; NORMV-NEXT:    ori $a3, $zero, 1000
921 ; NORMV-NEXT:    .p2align 4, , 16
922 ; NORMV-NEXT:  .LBB15_2: # =>This Inner Loop Header: Depth=1
923 ; NORMV-NEXT:    addi.w $a4, $a0, 0
924 ; NORMV-NEXT:    blt $a3, $a4, .LBB15_5
925 ; NORMV-NEXT:  # %bb.3: # in Loop: Header=BB15_2 Depth=1
926 ; NORMV-NEXT:    add.d $a0, $a2, $a0
927 ; NORMV-NEXT:    addi.d $a2, $a2, 1
928 ; NORMV-NEXT:    addi.w $a2, $a2, 0
929 ; NORMV-NEXT:    addi.d $a0, $a0, 0
930 ; NORMV-NEXT:    blt $a2, $a1, .LBB15_2
931 ; NORMV-NEXT:  .LBB15_4:
932 ; NORMV-NEXT:    addi.w $a0, $a0, 0
933 ; NORMV-NEXT:    ret
934 ; NORMV-NEXT:  .LBB15_5:
935 ; NORMV-NEXT:    addi.d $a0, $zero, -1
936 ; NORMV-NEXT:    addi.w $a0, $a0, 0
937 ; NORMV-NEXT:    ret
938   %3 = icmp sgt i32 %1, 1
939   br i1 %3, label %4, label %12
941 4:                                                ; preds = %2, %8
942   %5 = phi i32 [ %10, %8 ], [ 1, %2 ]
943   %6 = phi i32 [ %9, %8 ], [ %0, %2 ]
944   %7 = icmp sgt i32 %6, 1000
945   br i1 %7, label %12, label %8
947 8:                                                ; preds = %4
948   %9 = add nsw i32 %5, %6
949   %10 = add nuw nsw i32 %5, 1
950   %11 = icmp slt i32 %10, %1
951   br i1 %11, label %4, label %12
953 12:                                               ; preds = %8, %4, %2
954   %13 = phi i32 [ %0, %2 ], [ -1, %4 ], [ %9, %8 ]
955   ret i32 %13
958 define signext i32 @test14d(i31 zeroext %0, i32 signext %1) {
959 ; CHECK-LABEL: test14d:
960 ; CHECK:       # %bb.0:
961 ; CHECK-NEXT:    ori $a2, $zero, 2
962 ; CHECK-NEXT:    blt $a1, $a2, .LBB16_4
963 ; CHECK-NEXT:  # %bb.1: # %.preheader
964 ; CHECK-NEXT:    ori $a3, $zero, 1
965 ; CHECK-NEXT:    addi.w $a2, $zero, -1
966 ; CHECK-NEXT:    ori $a4, $zero, 1000
967 ; CHECK-NEXT:    .p2align 4, , 16
968 ; CHECK-NEXT:  .LBB16_2: # =>This Inner Loop Header: Depth=1
969 ; CHECK-NEXT:    blt $a4, $a0, .LBB16_5
970 ; CHECK-NEXT:  # %bb.3: # in Loop: Header=BB16_2 Depth=1
971 ; CHECK-NEXT:    add.w $a0, $a3, $a0
972 ; CHECK-NEXT:    addi.w $a3, $a3, 1
973 ; CHECK-NEXT:    blt $a3, $a1, .LBB16_2
974 ; CHECK-NEXT:  .LBB16_4:
975 ; CHECK-NEXT:    ret
976 ; CHECK-NEXT:  .LBB16_5:
977 ; CHECK-NEXT:    move $a0, $a2
978 ; CHECK-NEXT:    ret
980 ; NORMV-LABEL: test14d:
981 ; NORMV:       # %bb.0:
982 ; NORMV-NEXT:    ori $a2, $zero, 2
983 ; NORMV-NEXT:    blt $a1, $a2, .LBB16_4
984 ; NORMV-NEXT:  # %bb.1: # %.preheader
985 ; NORMV-NEXT:    ori $a3, $zero, 1
986 ; NORMV-NEXT:    addi.w $a2, $zero, -1
987 ; NORMV-NEXT:    ori $a4, $zero, 1000
988 ; NORMV-NEXT:    .p2align 4, , 16
989 ; NORMV-NEXT:  .LBB16_2: # =>This Inner Loop Header: Depth=1
990 ; NORMV-NEXT:    addi.w $a5, $a0, 0
991 ; NORMV-NEXT:    blt $a4, $a5, .LBB16_5
992 ; NORMV-NEXT:  # %bb.3: # in Loop: Header=BB16_2 Depth=1
993 ; NORMV-NEXT:    add.d $a0, $a3, $a0
994 ; NORMV-NEXT:    addi.d $a3, $a3, 1
995 ; NORMV-NEXT:    addi.w $a3, $a3, 0
996 ; NORMV-NEXT:    addi.w $a0, $a0, 0
997 ; NORMV-NEXT:    blt $a3, $a1, .LBB16_2
998 ; NORMV-NEXT:  .LBB16_4:
999 ; NORMV-NEXT:    ret
1000 ; NORMV-NEXT:  .LBB16_5:
1001 ; NORMV-NEXT:    move $a0, $a2
1002 ; NORMV-NEXT:    ret
1003   %zext = zext i31 %0 to i32
1004   %3 = icmp sgt i32 %1, 1
1005   br i1 %3, label %4, label %12
1007 4:                                                ; preds = %2, %8
1008   %5 = phi i32 [ %10, %8 ], [ 1, %2 ]
1009   %6 = phi i32 [ %9, %8 ], [ %zext, %2 ]
1010   %7 = icmp sgt i32 %6, 1000
1011   br i1 %7, label %12, label %8
1013 8:                                                ; preds = %4
1014   %9 = add nsw i32 %5, %6
1015   %10 = add nuw nsw i32 %5, 1
1016   %11 = icmp slt i32 %10, %1
1017   br i1 %11, label %4, label %12
1019 12:                                               ; preds = %8, %4, %2
1020   %13 = phi i32 [ %zext, %2 ], [ -1, %4 ], [ %9, %8 ]
1021   ret i32 %13
1024 define signext i32 @test15(i64 %arg1, i64 %arg2, i64 %arg3, ptr %arg4)  {
1025 ; CHECK-LABEL: test15:
1026 ; CHECK:       # %bb.0: # %entry
1027 ; CHECK-NEXT:    addi.d $a2, $a2, -1
1028 ; CHECK-NEXT:    ori $a4, $zero, 256
1029 ; CHECK-NEXT:    .p2align 4, , 16
1030 ; CHECK-NEXT:  .LBB17_1: # %bb2
1031 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
1032 ; CHECK-NEXT:    andi $a0, $a0, 1234
1033 ; CHECK-NEXT:    add.w $a0, $a0, $a1
1034 ; CHECK-NEXT:    addi.d $a2, $a2, 1
1035 ; CHECK-NEXT:    st.w $a0, $a3, 0
1036 ; CHECK-NEXT:    bltu $a2, $a4, .LBB17_1
1037 ; CHECK-NEXT:  # %bb.2: # %bb7
1038 ; CHECK-NEXT:    ret
1040 ; NORMV-LABEL: test15:
1041 ; NORMV:       # %bb.0: # %entry
1042 ; NORMV-NEXT:    addi.d $a2, $a2, -1
1043 ; NORMV-NEXT:    ori $a4, $zero, 256
1044 ; NORMV-NEXT:    .p2align 4, , 16
1045 ; NORMV-NEXT:  .LBB17_1: # %bb2
1046 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
1047 ; NORMV-NEXT:    andi $a0, $a0, 1234
1048 ; NORMV-NEXT:    add.d $a0, $a0, $a1
1049 ; NORMV-NEXT:    addi.d $a2, $a2, 1
1050 ; NORMV-NEXT:    st.w $a0, $a3, 0
1051 ; NORMV-NEXT:    bltu $a2, $a4, .LBB17_1
1052 ; NORMV-NEXT:  # %bb.2: # %bb7
1053 ; NORMV-NEXT:    addi.w $a0, $a0, 0
1054 ; NORMV-NEXT:    ret
1055 entry:
1056   br label %bb2
1058 bb2:                                              ; preds = %bb2, %entry
1059   %i1 = phi i64 [ %arg1, %entry ], [ %i5, %bb2 ]
1060   %i2 = phi i64 [ %arg3, %entry ], [ %i3, %bb2 ]
1061   %i3 = add i64 %i2, 1
1062   %i4 = and i64 %i1, 1234
1063   %i5 = add i64 %i4, %arg2
1064   %i8 = trunc i64 %i5 to i32
1065   store i32 %i8, ptr %arg4
1066   %i6 = icmp ugt i64 %i2, 255
1067   br i1 %i6, label %bb7, label %bb2
1069 bb7:                                              ; preds = %bb2
1070   %i7 = trunc i64 %i5 to i32
1071   ret i32 %i7
1074 define signext i32 @bug(i32 signext %x) {
1075 ; CHECK-LABEL: bug:
1076 ; CHECK:       # %bb.0: # %entry
1077 ; CHECK-NEXT:    beqz $a0, .LBB18_2
1078 ; CHECK-NEXT:  # %bb.1: # %if.end
1079 ; CHECK-NEXT:    bstrpick.d $a1, $a0, 31, 16
1080 ; CHECK-NEXT:    sltui $a1, $a1, 1
1081 ; CHECK-NEXT:    slli.d $a2, $a0, 16
1082 ; CHECK-NEXT:    masknez $a0, $a0, $a1
1083 ; CHECK-NEXT:    maskeqz $a2, $a2, $a1
1084 ; CHECK-NEXT:    or $a0, $a2, $a0
1085 ; CHECK-NEXT:    ori $a2, $zero, 32
1086 ; CHECK-NEXT:    masknez $a2, $a2, $a1
1087 ; CHECK-NEXT:    ori $a3, $zero, 16
1088 ; CHECK-NEXT:    maskeqz $a1, $a3, $a1
1089 ; CHECK-NEXT:    or $a1, $a1, $a2
1090 ; CHECK-NEXT:    bstrpick.d $a2, $a0, 31, 24
1091 ; CHECK-NEXT:    sltui $a2, $a2, 1
1092 ; CHECK-NEXT:    slli.d $a3, $a0, 8
1093 ; CHECK-NEXT:    addi.d $a4, $a1, -8
1094 ; CHECK-NEXT:    masknez $a0, $a0, $a2
1095 ; CHECK-NEXT:    maskeqz $a3, $a3, $a2
1096 ; CHECK-NEXT:    or $a0, $a3, $a0
1097 ; CHECK-NEXT:    masknez $a1, $a1, $a2
1098 ; CHECK-NEXT:    maskeqz $a2, $a4, $a2
1099 ; CHECK-NEXT:    or $a1, $a2, $a1
1100 ; CHECK-NEXT:    bstrpick.d $a2, $a0, 31, 28
1101 ; CHECK-NEXT:    sltui $a2, $a2, 1
1102 ; CHECK-NEXT:    slli.d $a3, $a0, 4
1103 ; CHECK-NEXT:    addi.d $a4, $a1, -4
1104 ; CHECK-NEXT:    masknez $a0, $a0, $a2
1105 ; CHECK-NEXT:    maskeqz $a3, $a3, $a2
1106 ; CHECK-NEXT:    or $a0, $a3, $a0
1107 ; CHECK-NEXT:    masknez $a1, $a1, $a2
1108 ; CHECK-NEXT:    maskeqz $a2, $a4, $a2
1109 ; CHECK-NEXT:    or $a1, $a2, $a1
1110 ; CHECK-NEXT:    bstrpick.d $a2, $a0, 31, 30
1111 ; CHECK-NEXT:    sltui $a2, $a2, 1
1112 ; CHECK-NEXT:    slli.d $a3, $a0, 2
1113 ; CHECK-NEXT:    addi.d $a4, $a1, -2
1114 ; CHECK-NEXT:    masknez $a0, $a0, $a2
1115 ; CHECK-NEXT:    maskeqz $a3, $a3, $a2
1116 ; CHECK-NEXT:    or $a0, $a3, $a0
1117 ; CHECK-NEXT:    addi.w $a0, $a0, 0
1118 ; CHECK-NEXT:    masknez $a1, $a1, $a2
1119 ; CHECK-NEXT:    maskeqz $a2, $a4, $a2
1120 ; CHECK-NEXT:    or $a1, $a2, $a1
1121 ; CHECK-NEXT:    nor $a0, $a0, $zero
1122 ; CHECK-NEXT:    srli.d $a0, $a0, 31
1123 ; CHECK-NEXT:    add.w $a0, $a1, $a0
1124 ; CHECK-NEXT:    ret
1125 ; CHECK-NEXT:  .LBB18_2:
1126 ; CHECK-NEXT:    move $a0, $zero
1127 ; CHECK-NEXT:    ret
1129 ; NORMV-LABEL: bug:
1130 ; NORMV:       # %bb.0: # %entry
1131 ; NORMV-NEXT:    beqz $a0, .LBB18_2
1132 ; NORMV-NEXT:  # %bb.1: # %if.end
1133 ; NORMV-NEXT:    bstrpick.d $a1, $a0, 31, 16
1134 ; NORMV-NEXT:    sltui $a1, $a1, 1
1135 ; NORMV-NEXT:    slli.d $a2, $a0, 16
1136 ; NORMV-NEXT:    masknez $a0, $a0, $a1
1137 ; NORMV-NEXT:    maskeqz $a2, $a2, $a1
1138 ; NORMV-NEXT:    or $a0, $a2, $a0
1139 ; NORMV-NEXT:    ori $a2, $zero, 32
1140 ; NORMV-NEXT:    masknez $a2, $a2, $a1
1141 ; NORMV-NEXT:    ori $a3, $zero, 16
1142 ; NORMV-NEXT:    maskeqz $a1, $a3, $a1
1143 ; NORMV-NEXT:    or $a1, $a1, $a2
1144 ; NORMV-NEXT:    bstrpick.d $a2, $a0, 31, 24
1145 ; NORMV-NEXT:    sltui $a2, $a2, 1
1146 ; NORMV-NEXT:    slli.d $a3, $a0, 8
1147 ; NORMV-NEXT:    addi.d $a4, $a1, -8
1148 ; NORMV-NEXT:    masknez $a0, $a0, $a2
1149 ; NORMV-NEXT:    maskeqz $a3, $a3, $a2
1150 ; NORMV-NEXT:    or $a0, $a3, $a0
1151 ; NORMV-NEXT:    masknez $a1, $a1, $a2
1152 ; NORMV-NEXT:    maskeqz $a2, $a4, $a2
1153 ; NORMV-NEXT:    or $a1, $a2, $a1
1154 ; NORMV-NEXT:    bstrpick.d $a2, $a0, 31, 28
1155 ; NORMV-NEXT:    sltui $a2, $a2, 1
1156 ; NORMV-NEXT:    slli.d $a3, $a0, 4
1157 ; NORMV-NEXT:    addi.d $a4, $a1, -4
1158 ; NORMV-NEXT:    masknez $a0, $a0, $a2
1159 ; NORMV-NEXT:    maskeqz $a3, $a3, $a2
1160 ; NORMV-NEXT:    or $a0, $a3, $a0
1161 ; NORMV-NEXT:    masknez $a1, $a1, $a2
1162 ; NORMV-NEXT:    maskeqz $a2, $a4, $a2
1163 ; NORMV-NEXT:    or $a1, $a2, $a1
1164 ; NORMV-NEXT:    bstrpick.d $a2, $a0, 31, 30
1165 ; NORMV-NEXT:    sltui $a2, $a2, 1
1166 ; NORMV-NEXT:    slli.d $a3, $a0, 2
1167 ; NORMV-NEXT:    addi.d $a4, $a1, -2
1168 ; NORMV-NEXT:    masknez $a0, $a0, $a2
1169 ; NORMV-NEXT:    maskeqz $a3, $a3, $a2
1170 ; NORMV-NEXT:    or $a0, $a3, $a0
1171 ; NORMV-NEXT:    addi.w $a0, $a0, 0
1172 ; NORMV-NEXT:    masknez $a1, $a1, $a2
1173 ; NORMV-NEXT:    maskeqz $a2, $a4, $a2
1174 ; NORMV-NEXT:    or $a1, $a2, $a1
1175 ; NORMV-NEXT:    nor $a0, $a0, $zero
1176 ; NORMV-NEXT:    srli.d $a0, $a0, 31
1177 ; NORMV-NEXT:    add.d $a0, $a1, $a0
1178 ; NORMV-NEXT:    addi.w $a0, $a0, 0
1179 ; NORMV-NEXT:    ret
1180 ; NORMV-NEXT:  .LBB18_2:
1181 ; NORMV-NEXT:    move $a0, $zero
1182 ; NORMV-NEXT:    ret
1183 entry:
1184   %tobool.not = icmp eq i32 %x, 0
1185   br i1 %tobool.not, label %cleanup, label %if.end
1187 if.end:                                           ; preds = %entry
1188   %tobool1.not = icmp ult i32 %x, 65536
1189   %shl = shl i32 %x, 16
1190   %spec.select = select i1 %tobool1.not, i32 %shl, i32 %x
1191   %spec.select43 = select i1 %tobool1.not, i32 16, i32 32
1192   %tobool5.not = icmp ult i32 %spec.select, 16777216
1193   %shl7 = shl i32 %spec.select, 8
1194   %sub8 = add nsw i32 %spec.select43, -8
1195   %x.addr.1 = select i1 %tobool5.not, i32 %shl7, i32 %spec.select
1196   %r.1 = select i1 %tobool5.not, i32 %sub8, i32 %spec.select43
1197   %tobool11.not = icmp ult i32 %x.addr.1, 268435456
1198   %shl13 = shl i32 %x.addr.1, 4
1199   %sub14 = add nsw i32 %r.1, -4
1200   %x.addr.2 = select i1 %tobool11.not, i32 %shl13, i32 %x.addr.1
1201   %r.2 = select i1 %tobool11.not, i32 %sub14, i32 %r.1
1202   %tobool17.not = icmp ult i32 %x.addr.2, 1073741824
1203   %shl19 = shl i32 %x.addr.2, 2
1204   %sub20 = add nsw i32 %r.2, -2
1205   %x.addr.3 = select i1 %tobool17.not, i32 %shl19, i32 %x.addr.2
1206   %r.3 = select i1 %tobool17.not, i32 %sub20, i32 %r.2
1207   %x.addr.3.lobit = ashr i32 %x.addr.3, 31
1208   %x.addr.3.lobit.not = xor i32 %x.addr.3.lobit, -1
1209   %r.4 = add nsw i32 %r.3, %x.addr.3.lobit.not
1210   br label %cleanup
1212 cleanup:                                          ; preds = %entry, %if.end
1213   %retval.0 = phi i32 [ %r.4, %if.end ], [ 0, %entry ]
1214   ret i32 %retval.0
1217 define void @test16(i32 signext %arg, i32 signext %arg1) nounwind {
1218 ; CHECK-LABEL: test16:
1219 ; CHECK:       # %bb.0: # %bb
1220 ; CHECK-NEXT:    addi.d $sp, $sp, -32
1221 ; CHECK-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
1222 ; CHECK-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
1223 ; CHECK-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
1224 ; CHECK-NEXT:    move $fp, $a1
1225 ; CHECK-NEXT:    bl %plt(bar)
1226 ; CHECK-NEXT:    move $s0, $a0
1227 ; CHECK-NEXT:    .p2align 4, , 16
1228 ; CHECK-NEXT:  .LBB19_1: # %bb2
1229 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
1230 ; CHECK-NEXT:    move $a0, $s0
1231 ; CHECK-NEXT:    bl %plt(bar)
1232 ; CHECK-NEXT:    sll.w $s0, $s0, $fp
1233 ; CHECK-NEXT:    bnez $a0, .LBB19_1
1234 ; CHECK-NEXT:  # %bb.2: # %bb7
1235 ; CHECK-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
1236 ; CHECK-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
1237 ; CHECK-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
1238 ; CHECK-NEXT:    addi.d $sp, $sp, 32
1239 ; CHECK-NEXT:    ret
1241 ; NORMV-LABEL: test16:
1242 ; NORMV:       # %bb.0: # %bb
1243 ; NORMV-NEXT:    addi.d $sp, $sp, -32
1244 ; NORMV-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
1245 ; NORMV-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
1246 ; NORMV-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
1247 ; NORMV-NEXT:    move $fp, $a1
1248 ; NORMV-NEXT:    bl %plt(bar)
1249 ; NORMV-NEXT:    move $s0, $a0
1250 ; NORMV-NEXT:    .p2align 4, , 16
1251 ; NORMV-NEXT:  .LBB19_1: # %bb2
1252 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
1253 ; NORMV-NEXT:    addi.w $a0, $s0, 0
1254 ; NORMV-NEXT:    bl %plt(bar)
1255 ; NORMV-NEXT:    sll.w $s0, $s0, $fp
1256 ; NORMV-NEXT:    bnez $a0, .LBB19_1
1257 ; NORMV-NEXT:  # %bb.2: # %bb7
1258 ; NORMV-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
1259 ; NORMV-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
1260 ; NORMV-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
1261 ; NORMV-NEXT:    addi.d $sp, $sp, 32
1262 ; NORMV-NEXT:    ret
1264   %i = call signext i32 @bar(i32 signext %arg)
1265   br label %bb2
1267 bb2:                                              ; preds = %bb2, %bb
1268   %i3 = phi i32 [ %i, %bb ], [ %i5, %bb2 ]
1269   %i4 = tail call signext i32 @bar(i32 signext %i3)
1270   %i5 = shl i32 %i3, %arg1
1271   %i6 = icmp eq i32 %i4, 0
1272   br i1 %i6, label %bb7, label %bb2
1274 bb7:                                              ; preds = %bb2
1275   ret void
1278 define void @test17(i32 signext %arg, i32 signext %arg1) nounwind {
1279 ; CHECK-LABEL: test17:
1280 ; CHECK:       # %bb.0: # %bb
1281 ; CHECK-NEXT:    addi.d $sp, $sp, -32
1282 ; CHECK-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
1283 ; CHECK-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
1284 ; CHECK-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
1285 ; CHECK-NEXT:    move $fp, $a1
1286 ; CHECK-NEXT:    bl %plt(bat)
1287 ; CHECK-NEXT:    move $s0, $a0
1288 ; CHECK-NEXT:    .p2align 4, , 16
1289 ; CHECK-NEXT:  .LBB20_1: # %bb2
1290 ; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
1291 ; CHECK-NEXT:    move $a0, $s0
1292 ; CHECK-NEXT:    bl %plt(bar)
1293 ; CHECK-NEXT:    sll.w $s0, $s0, $fp
1294 ; CHECK-NEXT:    bnez $a0, .LBB20_1
1295 ; CHECK-NEXT:  # %bb.2: # %bb7
1296 ; CHECK-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
1297 ; CHECK-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
1298 ; CHECK-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
1299 ; CHECK-NEXT:    addi.d $sp, $sp, 32
1300 ; CHECK-NEXT:    ret
1302 ; NORMV-LABEL: test17:
1303 ; NORMV:       # %bb.0: # %bb
1304 ; NORMV-NEXT:    addi.d $sp, $sp, -32
1305 ; NORMV-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
1306 ; NORMV-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
1307 ; NORMV-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
1308 ; NORMV-NEXT:    move $fp, $a1
1309 ; NORMV-NEXT:    bl %plt(bat)
1310 ; NORMV-NEXT:    move $s0, $a0
1311 ; NORMV-NEXT:    .p2align 4, , 16
1312 ; NORMV-NEXT:  .LBB20_1: # %bb2
1313 ; NORMV-NEXT:    # =>This Inner Loop Header: Depth=1
1314 ; NORMV-NEXT:    addi.w $a0, $s0, 0
1315 ; NORMV-NEXT:    bl %plt(bar)
1316 ; NORMV-NEXT:    sll.w $s0, $s0, $fp
1317 ; NORMV-NEXT:    bnez $a0, .LBB20_1
1318 ; NORMV-NEXT:  # %bb.2: # %bb7
1319 ; NORMV-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
1320 ; NORMV-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
1321 ; NORMV-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
1322 ; NORMV-NEXT:    addi.d $sp, $sp, 32
1323 ; NORMV-NEXT:    ret
1325   %i = call zeroext i16 @bat(i32 signext %arg)
1326   %zext = zext i16 %i to i32
1327   br label %bb2
1329 bb2:                                              ; preds = %bb2, %bb
1330   %i3 = phi i32 [ %zext, %bb ], [ %i5, %bb2 ]
1331   %i4 = tail call signext i32 @bar(i32 signext %i3)
1332   %i5 = shl i32 %i3, %arg1
1333   %i6 = icmp eq i32 %i4, 0
1334   br i1 %i6, label %bb7, label %bb2
1336 bb7:                                              ; preds = %bb2
1337   ret void
1339 declare zeroext i16 @bat(i32 signext)
1341 define signext i32 @sextw_sh2add(i1 zeroext %0, ptr %1, i32 signext %2, i32 signext %3, i32 signext %4) {
1342 ; CHECK-LABEL: sextw_sh2add:
1343 ; CHECK:       # %bb.0:
1344 ; CHECK-NEXT:    alsl.w $a2, $a2, $a3, 2
1345 ; CHECK-NEXT:    beqz $a0, .LBB21_2
1346 ; CHECK-NEXT:  # %bb.1:
1347 ; CHECK-NEXT:    st.w $a2, $a1, 0
1348 ; CHECK-NEXT:  .LBB21_2:
1349 ; CHECK-NEXT:    add.w $a0, $a2, $a4
1350 ; CHECK-NEXT:    ret
1352 ; NORMV-LABEL: sextw_sh2add:
1353 ; NORMV:       # %bb.0:
1354 ; NORMV-NEXT:    alsl.w $a2, $a2, $a3, 2
1355 ; NORMV-NEXT:    beqz $a0, .LBB21_2
1356 ; NORMV-NEXT:  # %bb.1:
1357 ; NORMV-NEXT:    st.w $a2, $a1, 0
1358 ; NORMV-NEXT:  .LBB21_2:
1359 ; NORMV-NEXT:    add.d $a0, $a2, $a4
1360 ; NORMV-NEXT:    addi.w $a0, $a0, 0
1361 ; NORMV-NEXT:    ret
1362   %6 = shl i32 %2, 2
1363   %7 = add i32 %6, %3
1364   br i1 %0, label %8, label %9
1366 8:                                                ; preds = %5
1367   store i32 %7, ptr %1, align 4
1368   br label %9
1370 9:                                                ; preds = %5, %8
1371   %10 = add i32 %7, %4
1372   ret i32 %10
1375 define signext i32 @test19(i64 %arg, i1 zeroext %c1, i1 zeroext %c2, ptr %p) nounwind {
1376 ; CHECK-LABEL: test19:
1377 ; CHECK:       # %bb.0: # %bb
1378 ; CHECK-NEXT:    addi.d $sp, $sp, -16
1379 ; CHECK-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
1380 ; CHECK-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
1381 ; CHECK-NEXT:    ori $a0, $zero, 35
1382 ; CHECK-NEXT:    lu32i.d $a0, 1
1383 ; CHECK-NEXT:    maskeqz $fp, $a0, $a1
1384 ; CHECK-NEXT:    st.d $fp, $a3, 0
1385 ; CHECK-NEXT:    beqz $a2, .LBB22_2
1386 ; CHECK-NEXT:  # %bb.1: # %bb2
1387 ; CHECK-NEXT:    move $a0, $zero
1388 ; CHECK-NEXT:    bl %plt(bar)
1389 ; CHECK-NEXT:    move $fp, $a0
1390 ; CHECK-NEXT:  .LBB22_2: # %bb7
1391 ; CHECK-NEXT:    bl %plt(side_effect)
1392 ; CHECK-NEXT:    addi.w $a0, $fp, 0
1393 ; CHECK-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
1394 ; CHECK-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
1395 ; CHECK-NEXT:    addi.d $sp, $sp, 16
1396 ; CHECK-NEXT:    ret
1398 ; NORMV-LABEL: test19:
1399 ; NORMV:       # %bb.0: # %bb
1400 ; NORMV-NEXT:    addi.d $sp, $sp, -16
1401 ; NORMV-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
1402 ; NORMV-NEXT:    st.d $fp, $sp, 0 # 8-byte Folded Spill
1403 ; NORMV-NEXT:    ori $a0, $zero, 35
1404 ; NORMV-NEXT:    lu32i.d $a0, 1
1405 ; NORMV-NEXT:    maskeqz $fp, $a0, $a1
1406 ; NORMV-NEXT:    st.d $fp, $a3, 0
1407 ; NORMV-NEXT:    beqz $a2, .LBB22_2
1408 ; NORMV-NEXT:  # %bb.1: # %bb2
1409 ; NORMV-NEXT:    move $a0, $zero
1410 ; NORMV-NEXT:    bl %plt(bar)
1411 ; NORMV-NEXT:    move $fp, $a0
1412 ; NORMV-NEXT:  .LBB22_2: # %bb7
1413 ; NORMV-NEXT:    bl %plt(side_effect)
1414 ; NORMV-NEXT:    addi.w $a0, $fp, 0
1415 ; NORMV-NEXT:    ld.d $fp, $sp, 0 # 8-byte Folded Reload
1416 ; NORMV-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
1417 ; NORMV-NEXT:    addi.d $sp, $sp, 16
1418 ; NORMV-NEXT:    ret
1420   %sel = select i1 %c1, i64 4294967331, i64 0
1421   store i64 %sel, ptr %p, align 8
1422   br i1 %c2, label %bb2, label %bb7
1424 bb2:                                              ; preds = %bb2, %bb
1425   %i4 = call signext i32 @bar(i32 0)
1426   %i4.sext = sext i32 %i4 to i64
1427   br label %bb7
1429 bb7:                                              ; preds = %bb2
1430   %phi = phi i64 [ %sel, %bb ], [ %i4.sext, %bb2 ]
1431   %trunc = trunc i64 %phi to i32
1432   call void @side_effect()
1433   ret i32 %trunc
1436  declare void @side_effect(i64)