[mlir][LLVM] `LLVMTypeConverter`: Tighten materialization checks (#116532)
[llvm-project.git] / llvm / test / CodeGen / RISCV / short-forward-branch-opt.ll
blobb7b88584f3bdb8d49a4cf5e693b8c367d79616a2
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv64 -mattr=+c,+zbb -verify-machineinstrs < %s \
3 ; RUN:   | FileCheck -check-prefix=NOSFB %s
4 ; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -mattr=+zbb -verify-machineinstrs < %s \
5 ; RUN:   | FileCheck -check-prefixes=SFB,NOZICOND,RV64SFB %s
6 ; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -mattr=+zicond,+zbb \
7 ; RUN:   -verify-machineinstrs < %s | FileCheck -check-prefixes=SFB,ZICOND %s
8 ; RUN: llc -mtriple=riscv32 -mcpu=sifive-e76 -mattr=+zbb -verify-machineinstrs < %s \
9 ; RUN:   | FileCheck -check-prefixes=SFB,NOZICOND,RV32SFB %s
11 ; The sifive-7-series can predicate a mv.
13 define signext i32 @test1(i32 signext %x, i32 signext %y, i32 signext %z) {
14 ; NOSFB-LABEL: test1:
15 ; NOSFB:       # %bb.0:
16 ; NOSFB-NEXT:    beqz a2, .LBB0_2
17 ; NOSFB-NEXT:  # %bb.1:
18 ; NOSFB-NEXT:    mv a0, a1
19 ; NOSFB-NEXT:  .LBB0_2:
20 ; NOSFB-NEXT:    ret
22 ; SFB-LABEL: test1:
23 ; SFB:       # %bb.0:
24 ; SFB-NEXT:    beqz a2, .LBB0_2
25 ; SFB-NEXT:  # %bb.1:
26 ; SFB-NEXT:    mv a0, a1
27 ; SFB-NEXT:  .LBB0_2:
28 ; SFB-NEXT:    ret
29   %c = icmp eq i32 %z, 0
30   %b = select i1 %c, i32 %x, i32 %y
31   ret i32 %b
34 ; Same as above with select operands swapped.
35 define signext i32 @test2(i32 signext %x, i32 signext %y, i32 signext %z) {
36 ; NOSFB-LABEL: test2:
37 ; NOSFB:       # %bb.0:
38 ; NOSFB-NEXT:    beqz a2, .LBB1_2
39 ; NOSFB-NEXT:  # %bb.1:
40 ; NOSFB-NEXT:    mv a1, a0
41 ; NOSFB-NEXT:  .LBB1_2:
42 ; NOSFB-NEXT:    mv a0, a1
43 ; NOSFB-NEXT:    ret
45 ; SFB-LABEL: test2:
46 ; SFB:       # %bb.0:
47 ; SFB-NEXT:    bnez a2, .LBB1_2
48 ; SFB-NEXT:  # %bb.1:
49 ; SFB-NEXT:    mv a0, a1
50 ; SFB-NEXT:  .LBB1_2:
51 ; SFB-NEXT:    ret
52   %c = icmp eq i32 %z, 0
53   %b = select i1 %c, i32 %y, i32 %x
54   ret i32 %b
57 ; Make sure we don't share the same basic block for two selects with the same
58 ; condition this would break the predication.
59 define signext i32 @test3(i32 signext %v, i32 signext %w, i32 signext %x, i32 signext %y, i32 signext %z) {
60 ; NOSFB-LABEL: test3:
61 ; NOSFB:       # %bb.0:
62 ; NOSFB-NEXT:    beqz a4, .LBB2_2
63 ; NOSFB-NEXT:  # %bb.1:
64 ; NOSFB-NEXT:    mv a1, a0
65 ; NOSFB-NEXT:    mv a2, a3
66 ; NOSFB-NEXT:  .LBB2_2:
67 ; NOSFB-NEXT:    addw a0, a1, a2
68 ; NOSFB-NEXT:    ret
70 ; RV64SFB-LABEL: test3:
71 ; RV64SFB:       # %bb.0:
72 ; RV64SFB-NEXT:    beqz a4, .LBB2_2
73 ; RV64SFB-NEXT:  # %bb.1:
74 ; RV64SFB-NEXT:    mv a2, a3
75 ; RV64SFB-NEXT:  .LBB2_2:
76 ; RV64SFB-NEXT:    bnez a4, .LBB2_4
77 ; RV64SFB-NEXT:  # %bb.3:
78 ; RV64SFB-NEXT:    mv a0, a1
79 ; RV64SFB-NEXT:  .LBB2_4:
80 ; RV64SFB-NEXT:    addw a0, a0, a2
81 ; RV64SFB-NEXT:    ret
83 ; ZICOND-LABEL: test3:
84 ; ZICOND:       # %bb.0:
85 ; ZICOND-NEXT:    beqz a4, .LBB2_2
86 ; ZICOND-NEXT:  # %bb.1:
87 ; ZICOND-NEXT:    mv a2, a3
88 ; ZICOND-NEXT:  .LBB2_2:
89 ; ZICOND-NEXT:    bnez a4, .LBB2_4
90 ; ZICOND-NEXT:  # %bb.3:
91 ; ZICOND-NEXT:    mv a0, a1
92 ; ZICOND-NEXT:  .LBB2_4:
93 ; ZICOND-NEXT:    addw a0, a0, a2
94 ; ZICOND-NEXT:    ret
96 ; RV32SFB-LABEL: test3:
97 ; RV32SFB:       # %bb.0:
98 ; RV32SFB-NEXT:    beqz a4, .LBB2_2
99 ; RV32SFB-NEXT:  # %bb.1:
100 ; RV32SFB-NEXT:    mv a2, a3
101 ; RV32SFB-NEXT:  .LBB2_2:
102 ; RV32SFB-NEXT:    bnez a4, .LBB2_4
103 ; RV32SFB-NEXT:  # %bb.3:
104 ; RV32SFB-NEXT:    mv a0, a1
105 ; RV32SFB-NEXT:  .LBB2_4:
106 ; RV32SFB-NEXT:    add a0, a0, a2
107 ; RV32SFB-NEXT:    ret
108   %c = icmp eq i32 %z, 0
109   %a = select i1 %c, i32 %w, i32 %v
110   %b = select i1 %c, i32 %x, i32 %y
111   %d = add i32 %a, %b
112   ret i32 %d
115 ; Test with false value 0.
116 define signext i32 @test4(i32 signext %x, i32 signext %z) {
117 ; NOSFB-LABEL: test4:
118 ; NOSFB:       # %bb.0:
119 ; NOSFB-NEXT:    snez a1, a1
120 ; NOSFB-NEXT:    addi a1, a1, -1
121 ; NOSFB-NEXT:    and a0, a0, a1
122 ; NOSFB-NEXT:    ret
124 ; NOZICOND-LABEL: test4:
125 ; NOZICOND:       # %bb.0:
126 ; NOZICOND-NEXT:    beqz a1, .LBB3_2
127 ; NOZICOND-NEXT:  # %bb.1:
128 ; NOZICOND-NEXT:    li a0, 0
129 ; NOZICOND-NEXT:  .LBB3_2:
130 ; NOZICOND-NEXT:    ret
132 ; ZICOND-LABEL: test4:
133 ; ZICOND:       # %bb.0:
134 ; ZICOND-NEXT:    czero.nez a0, a0, a1
135 ; ZICOND-NEXT:    ret
136   %c = icmp eq i32 %z, 0
137   %b = select i1 %c, i32 %x, i32 0
138   ret i32 %b
141 ; Same as above with select operands swapped.
142 define signext i32 @test5(i32 signext %x, i32 signext %z) {
143 ; NOSFB-LABEL: test5:
144 ; NOSFB:       # %bb.0:
145 ; NOSFB-NEXT:    seqz a1, a1
146 ; NOSFB-NEXT:    addi a1, a1, -1
147 ; NOSFB-NEXT:    and a0, a0, a1
148 ; NOSFB-NEXT:    ret
150 ; NOZICOND-LABEL: test5:
151 ; NOZICOND:       # %bb.0:
152 ; NOZICOND-NEXT:    bnez a1, .LBB4_2
153 ; NOZICOND-NEXT:  # %bb.1:
154 ; NOZICOND-NEXT:    li a0, 0
155 ; NOZICOND-NEXT:  .LBB4_2:
156 ; NOZICOND-NEXT:    ret
158 ; ZICOND-LABEL: test5:
159 ; ZICOND:       # %bb.0:
160 ; ZICOND-NEXT:    czero.eqz a0, a0, a1
161 ; ZICOND-NEXT:    ret
162   %c = icmp eq i32 %z, 0
163   %b = select i1 %c, i32 0, i32 %x
164   ret i32 %b
167 ; Test with false value -1.
168 define signext i32 @test6(i32 signext %x, i32 signext %z) {
169 ; NOSFB-LABEL: test6:
170 ; NOSFB:       # %bb.0:
171 ; NOSFB-NEXT:    seqz a1, a1
172 ; NOSFB-NEXT:    addi a1, a1, -1
173 ; NOSFB-NEXT:    or a0, a0, a1
174 ; NOSFB-NEXT:    ret
176 ; SFB-LABEL: test6:
177 ; SFB:       # %bb.0:
178 ; SFB-NEXT:    li a2, -1
179 ; SFB-NEXT:    beqz a1, .LBB5_2
180 ; SFB-NEXT:  # %bb.1:
181 ; SFB-NEXT:    mv a0, a2
182 ; SFB-NEXT:  .LBB5_2:
183 ; SFB-NEXT:    ret
184   %c = icmp eq i32 %z, 0
185   %b = select i1 %c, i32 %x, i32 -1
186   ret i32 %b
189 ; Same as above with select operands swapped.
190 define signext i32 @test7(i32 signext %x, i32 signext %z) {
191 ; NOSFB-LABEL: test7:
192 ; NOSFB:       # %bb.0:
193 ; NOSFB-NEXT:    snez a1, a1
194 ; NOSFB-NEXT:    addi a1, a1, -1
195 ; NOSFB-NEXT:    or a0, a0, a1
196 ; NOSFB-NEXT:    ret
198 ; SFB-LABEL: test7:
199 ; SFB:       # %bb.0:
200 ; SFB-NEXT:    li a2, -1
201 ; SFB-NEXT:    bnez a1, .LBB6_2
202 ; SFB-NEXT:  # %bb.1:
203 ; SFB-NEXT:    mv a0, a2
204 ; SFB-NEXT:  .LBB6_2:
205 ; SFB-NEXT:    ret
206   %c = icmp eq i32 %z, 0
207   %b = select i1 %c, i32 -1, i32 %x
208   ret i32 %b
211 define i16 @select_xor_1(i16 %A, i8 %cond) {
212 ; NOSFB-LABEL: select_xor_1:
213 ; NOSFB:       # %bb.0: # %entry
214 ; NOSFB-NEXT:    slli a1, a1, 63
215 ; NOSFB-NEXT:    srai a1, a1, 63
216 ; NOSFB-NEXT:    andi a1, a1, 43
217 ; NOSFB-NEXT:    xor a0, a0, a1
218 ; NOSFB-NEXT:    ret
220 ; SFB-LABEL: select_xor_1:
221 ; SFB:       # %bb.0: # %entry
222 ; SFB-NEXT:    andi a1, a1, 1
223 ; SFB-NEXT:    beqz a1, .LBB7_2
224 ; SFB-NEXT:  # %bb.1: # %entry
225 ; SFB-NEXT:    xori a0, a0, 43
226 ; SFB-NEXT:  .LBB7_2: # %entry
227 ; SFB-NEXT:    ret
228 entry:
229  %and = and i8 %cond, 1
230  %cmp10 = icmp eq i8 %and, 0
231  %0 = xor i16 %A, 43
232  %1 = select i1 %cmp10, i16 %A, i16 %0
233  ret i16 %1
236 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
237 ; icmp eq (and %cond, 1), 0
238 define i16 @select_xor_1b(i16 %A, i8 %cond) {
239 ; NOSFB-LABEL: select_xor_1b:
240 ; NOSFB:       # %bb.0: # %entry
241 ; NOSFB-NEXT:    slli a1, a1, 63
242 ; NOSFB-NEXT:    srai a1, a1, 63
243 ; NOSFB-NEXT:    andi a1, a1, 43
244 ; NOSFB-NEXT:    xor a0, a0, a1
245 ; NOSFB-NEXT:    ret
247 ; SFB-LABEL: select_xor_1b:
248 ; SFB:       # %bb.0: # %entry
249 ; SFB-NEXT:    andi a1, a1, 1
250 ; SFB-NEXT:    beqz a1, .LBB8_2
251 ; SFB-NEXT:  # %bb.1: # %entry
252 ; SFB-NEXT:    xori a0, a0, 43
253 ; SFB-NEXT:  .LBB8_2: # %entry
254 ; SFB-NEXT:    ret
255 entry:
256  %and = and i8 %cond, 1
257  %cmp10 = icmp ne i8 %and, 1
258  %0 = xor i16 %A, 43
259  %1 = select i1 %cmp10, i16 %A, i16 %0
260  ret i16 %1
263 define i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) {
264 ; NOSFB-LABEL: select_xor_2:
265 ; NOSFB:       # %bb.0: # %entry
266 ; NOSFB-NEXT:    slli a2, a2, 63
267 ; NOSFB-NEXT:    srai a2, a2, 63
268 ; NOSFB-NEXT:    and a1, a1, a2
269 ; NOSFB-NEXT:    xor a0, a0, a1
270 ; NOSFB-NEXT:    ret
272 ; SFB-LABEL: select_xor_2:
273 ; SFB:       # %bb.0: # %entry
274 ; SFB-NEXT:    andi a2, a2, 1
275 ; SFB-NEXT:    beqz a2, .LBB9_2
276 ; SFB-NEXT:  # %bb.1: # %entry
277 ; SFB-NEXT:    xor a0, a0, a1
278 ; SFB-NEXT:  .LBB9_2: # %entry
279 ; SFB-NEXT:    ret
280 entry:
281  %and = and i8 %cond, 1
282  %cmp10 = icmp eq i8 %and, 0
283  %0 = xor i32 %B, %A
284  %1 = select i1 %cmp10, i32 %A, i32 %0
285  ret i32 %1
288 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
289 ; icmp eq (and %cond, 1), 0
290 define i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) {
291 ; NOSFB-LABEL: select_xor_2b:
292 ; NOSFB:       # %bb.0: # %entry
293 ; NOSFB-NEXT:    slli a2, a2, 63
294 ; NOSFB-NEXT:    srai a2, a2, 63
295 ; NOSFB-NEXT:    and a1, a1, a2
296 ; NOSFB-NEXT:    xor a0, a0, a1
297 ; NOSFB-NEXT:    ret
299 ; SFB-LABEL: select_xor_2b:
300 ; SFB:       # %bb.0: # %entry
301 ; SFB-NEXT:    andi a2, a2, 1
302 ; SFB-NEXT:    beqz a2, .LBB10_2
303 ; SFB-NEXT:  # %bb.1: # %entry
304 ; SFB-NEXT:    xor a0, a0, a1
305 ; SFB-NEXT:  .LBB10_2: # %entry
306 ; SFB-NEXT:    ret
307 entry:
308  %and = and i8 %cond, 1
309  %cmp10 = icmp ne i8 %and, 1
310  %0 = xor i32 %B, %A
311  %1 = select i1 %cmp10, i32 %A, i32 %0
312  ret i32 %1
315 define i32 @select_or(i32 %A, i32 %B, i8 %cond) {
316 ; NOSFB-LABEL: select_or:
317 ; NOSFB:       # %bb.0: # %entry
318 ; NOSFB-NEXT:    slli a2, a2, 63
319 ; NOSFB-NEXT:    srai a2, a2, 63
320 ; NOSFB-NEXT:    and a1, a1, a2
321 ; NOSFB-NEXT:    or a0, a0, a1
322 ; NOSFB-NEXT:    ret
324 ; SFB-LABEL: select_or:
325 ; SFB:       # %bb.0: # %entry
326 ; SFB-NEXT:    andi a2, a2, 1
327 ; SFB-NEXT:    beqz a2, .LBB11_2
328 ; SFB-NEXT:  # %bb.1: # %entry
329 ; SFB-NEXT:    or a0, a0, a1
330 ; SFB-NEXT:  .LBB11_2: # %entry
331 ; SFB-NEXT:    ret
332 entry:
333  %and = and i8 %cond, 1
334  %cmp10 = icmp eq i8 %and, 0
335  %0 = or i32 %B, %A
336  %1 = select i1 %cmp10, i32 %A, i32 %0
337  ret i32 %1
340 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
341 ; icmp eq (and %cond, 1), 0
342 define i32 @select_or_b(i32 %A, i32 %B, i8 %cond) {
343 ; NOSFB-LABEL: select_or_b:
344 ; NOSFB:       # %bb.0: # %entry
345 ; NOSFB-NEXT:    slli a2, a2, 63
346 ; NOSFB-NEXT:    srai a2, a2, 63
347 ; NOSFB-NEXT:    and a1, a1, a2
348 ; NOSFB-NEXT:    or a0, a0, a1
349 ; NOSFB-NEXT:    ret
351 ; SFB-LABEL: select_or_b:
352 ; SFB:       # %bb.0: # %entry
353 ; SFB-NEXT:    andi a2, a2, 1
354 ; SFB-NEXT:    beqz a2, .LBB12_2
355 ; SFB-NEXT:  # %bb.1: # %entry
356 ; SFB-NEXT:    or a0, a0, a1
357 ; SFB-NEXT:  .LBB12_2: # %entry
358 ; SFB-NEXT:    ret
359 entry:
360  %and = and i8 %cond, 1
361  %cmp10 = icmp ne i8 %and, 1
362  %0 = or i32 %B, %A
363  %1 = select i1 %cmp10, i32 %A, i32 %0
364  ret i32 %1
367 define i32 @select_or_1(i32 %A, i32 %B, i32 %cond) {
368 ; NOSFB-LABEL: select_or_1:
369 ; NOSFB:       # %bb.0: # %entry
370 ; NOSFB-NEXT:    slli a2, a2, 63
371 ; NOSFB-NEXT:    srai a2, a2, 63
372 ; NOSFB-NEXT:    and a1, a1, a2
373 ; NOSFB-NEXT:    or a0, a0, a1
374 ; NOSFB-NEXT:    ret
376 ; SFB-LABEL: select_or_1:
377 ; SFB:       # %bb.0: # %entry
378 ; SFB-NEXT:    andi a2, a2, 1
379 ; SFB-NEXT:    beqz a2, .LBB13_2
380 ; SFB-NEXT:  # %bb.1: # %entry
381 ; SFB-NEXT:    or a0, a0, a1
382 ; SFB-NEXT:  .LBB13_2: # %entry
383 ; SFB-NEXT:    ret
384 entry:
385  %and = and i32 %cond, 1
386  %cmp10 = icmp eq i32 %and, 0
387  %0 = or i32 %B, %A
388  %1 = select i1 %cmp10, i32 %A, i32 %0
389  ret i32 %1
392 ; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
393 ; icmp eq (and %cond, 1), 0
394 define i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) {
395 ; NOSFB-LABEL: select_or_1b:
396 ; NOSFB:       # %bb.0: # %entry
397 ; NOSFB-NEXT:    slli a2, a2, 63
398 ; NOSFB-NEXT:    srai a2, a2, 63
399 ; NOSFB-NEXT:    and a1, a1, a2
400 ; NOSFB-NEXT:    or a0, a0, a1
401 ; NOSFB-NEXT:    ret
403 ; SFB-LABEL: select_or_1b:
404 ; SFB:       # %bb.0: # %entry
405 ; SFB-NEXT:    andi a2, a2, 1
406 ; SFB-NEXT:    beqz a2, .LBB14_2
407 ; SFB-NEXT:  # %bb.1: # %entry
408 ; SFB-NEXT:    or a0, a0, a1
409 ; SFB-NEXT:  .LBB14_2: # %entry
410 ; SFB-NEXT:    ret
411 entry:
412  %and = and i32 %cond, 1
413  %cmp10 = icmp ne i32 %and, 1
414  %0 = or i32 %B, %A
415  %1 = select i1 %cmp10, i32 %A, i32 %0
416  ret i32 %1
419 define void @sextw_removal_ccor(i1 %c, i32 signext %arg, i32 signext %arg1, i32 signext %arg2) nounwind {
420 ; NOSFB-LABEL: sextw_removal_ccor:
421 ; NOSFB:       # %bb.0: # %bb
422 ; NOSFB-NEXT:    addi sp, sp, -32
423 ; NOSFB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
424 ; NOSFB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
425 ; NOSFB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
426 ; NOSFB-NEXT:    mv s0, a2
427 ; NOSFB-NEXT:    slli a0, a0, 63
428 ; NOSFB-NEXT:    srai a0, a0, 63
429 ; NOSFB-NEXT:    and a0, a0, a1
430 ; NOSFB-NEXT:    or s1, a0, a3
431 ; NOSFB-NEXT:  .LBB15_1: # %bb2
432 ; NOSFB-NEXT:    # =>This Inner Loop Header: Depth=1
433 ; NOSFB-NEXT:    mv a0, s1
434 ; NOSFB-NEXT:    call bar
435 ; NOSFB-NEXT:    sllw s1, s1, s0
436 ; NOSFB-NEXT:    bnez a0, .LBB15_1
437 ; NOSFB-NEXT:  # %bb.2: # %bb7
438 ; NOSFB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
439 ; NOSFB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
440 ; NOSFB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
441 ; NOSFB-NEXT:    addi sp, sp, 32
442 ; NOSFB-NEXT:    ret
444 ; RV64SFB-LABEL: sextw_removal_ccor:
445 ; RV64SFB:       # %bb.0: # %bb
446 ; RV64SFB-NEXT:    addi sp, sp, -32
447 ; RV64SFB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
448 ; RV64SFB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
449 ; RV64SFB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
450 ; RV64SFB-NEXT:    mv s0, a3
451 ; RV64SFB-NEXT:    andi a0, a0, 1
452 ; RV64SFB-NEXT:    mv s1, a2
453 ; RV64SFB-NEXT:    beqz a0, .LBB15_4
454 ; RV64SFB-NEXT:  # %bb.3: # %bb
455 ; RV64SFB-NEXT:    or s0, a3, a1
456 ; RV64SFB-NEXT:  .LBB15_4: # %bb
457 ; RV64SFB-NEXT:  .LBB15_1: # %bb2
458 ; RV64SFB-NEXT:    # =>This Inner Loop Header: Depth=1
459 ; RV64SFB-NEXT:    mv a0, s0
460 ; RV64SFB-NEXT:    call bar
461 ; RV64SFB-NEXT:    sllw s0, s0, s1
462 ; RV64SFB-NEXT:    bnez a0, .LBB15_1
463 ; RV64SFB-NEXT:  # %bb.2: # %bb7
464 ; RV64SFB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
465 ; RV64SFB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
466 ; RV64SFB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
467 ; RV64SFB-NEXT:    addi sp, sp, 32
468 ; RV64SFB-NEXT:    ret
470 ; ZICOND-LABEL: sextw_removal_ccor:
471 ; ZICOND:       # %bb.0: # %bb
472 ; ZICOND-NEXT:    addi sp, sp, -32
473 ; ZICOND-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
474 ; ZICOND-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
475 ; ZICOND-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
476 ; ZICOND-NEXT:    mv s0, a3
477 ; ZICOND-NEXT:    andi a0, a0, 1
478 ; ZICOND-NEXT:    mv s1, a2
479 ; ZICOND-NEXT:    beqz a0, .LBB15_4
480 ; ZICOND-NEXT:  # %bb.3: # %bb
481 ; ZICOND-NEXT:    or s0, a3, a1
482 ; ZICOND-NEXT:  .LBB15_4: # %bb
483 ; ZICOND-NEXT:  .LBB15_1: # %bb2
484 ; ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
485 ; ZICOND-NEXT:    mv a0, s0
486 ; ZICOND-NEXT:    call bar
487 ; ZICOND-NEXT:    sllw s0, s0, s1
488 ; ZICOND-NEXT:    bnez a0, .LBB15_1
489 ; ZICOND-NEXT:  # %bb.2: # %bb7
490 ; ZICOND-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
491 ; ZICOND-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
492 ; ZICOND-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
493 ; ZICOND-NEXT:    addi sp, sp, 32
494 ; ZICOND-NEXT:    ret
496 ; RV32SFB-LABEL: sextw_removal_ccor:
497 ; RV32SFB:       # %bb.0: # %bb
498 ; RV32SFB-NEXT:    addi sp, sp, -16
499 ; RV32SFB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
500 ; RV32SFB-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
501 ; RV32SFB-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
502 ; RV32SFB-NEXT:    mv s0, a3
503 ; RV32SFB-NEXT:    andi a0, a0, 1
504 ; RV32SFB-NEXT:    mv s1, a2
505 ; RV32SFB-NEXT:    beqz a0, .LBB15_4
506 ; RV32SFB-NEXT:  # %bb.3: # %bb
507 ; RV32SFB-NEXT:    or s0, a3, a1
508 ; RV32SFB-NEXT:  .LBB15_4: # %bb
509 ; RV32SFB-NEXT:  .LBB15_1: # %bb2
510 ; RV32SFB-NEXT:    # =>This Inner Loop Header: Depth=1
511 ; RV32SFB-NEXT:    mv a0, s0
512 ; RV32SFB-NEXT:    call bar
513 ; RV32SFB-NEXT:    sll s0, s0, s1
514 ; RV32SFB-NEXT:    bnez a0, .LBB15_1
515 ; RV32SFB-NEXT:  # %bb.2: # %bb7
516 ; RV32SFB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
517 ; RV32SFB-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
518 ; RV32SFB-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
519 ; RV32SFB-NEXT:    addi sp, sp, 16
520 ; RV32SFB-NEXT:    ret
522   %sel = select i1 %c, i32 %arg, i32 0
523   %or = or i32 %sel, %arg2
524   br label %bb2
526 bb2:                                              ; preds = %bb2, %bb
527   %i3 = phi i32 [ %or, %bb ], [ %i5, %bb2 ]
528   %i4 = tail call signext i32 @bar(i32 signext %i3)
529   %i5 = shl i32 %i3, %arg1
530   %i6 = icmp eq i32 %i4, 0
531   br i1 %i6, label %bb7, label %bb2
533 bb7:                                              ; preds = %bb2
534   ret void
536 declare signext i32 @bar(i32 signext)
538 define void @sextw_removal_ccaddw(i1 %c, i32 signext %arg, i32 signext %arg1, i32 %arg2) nounwind {
539 ; NOSFB-LABEL: sextw_removal_ccaddw:
540 ; NOSFB:       # %bb.0: # %bb
541 ; NOSFB-NEXT:    addi sp, sp, -32
542 ; NOSFB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
543 ; NOSFB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
544 ; NOSFB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
545 ; NOSFB-NEXT:    mv s0, a2
546 ; NOSFB-NEXT:    slli a0, a0, 63
547 ; NOSFB-NEXT:    srai a0, a0, 63
548 ; NOSFB-NEXT:    and a0, a0, a3
549 ; NOSFB-NEXT:    addw s1, a0, a1
550 ; NOSFB-NEXT:  .LBB16_1: # %bb2
551 ; NOSFB-NEXT:    # =>This Inner Loop Header: Depth=1
552 ; NOSFB-NEXT:    mv a0, s1
553 ; NOSFB-NEXT:    call bar
554 ; NOSFB-NEXT:    sllw s1, s1, s0
555 ; NOSFB-NEXT:    bnez a0, .LBB16_1
556 ; NOSFB-NEXT:  # %bb.2: # %bb7
557 ; NOSFB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
558 ; NOSFB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
559 ; NOSFB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
560 ; NOSFB-NEXT:    addi sp, sp, 32
561 ; NOSFB-NEXT:    ret
563 ; RV64SFB-LABEL: sextw_removal_ccaddw:
564 ; RV64SFB:       # %bb.0: # %bb
565 ; RV64SFB-NEXT:    addi sp, sp, -32
566 ; RV64SFB-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
567 ; RV64SFB-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
568 ; RV64SFB-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
569 ; RV64SFB-NEXT:    mv s1, a1
570 ; RV64SFB-NEXT:    andi a0, a0, 1
571 ; RV64SFB-NEXT:    mv s0, a2
572 ; RV64SFB-NEXT:    beqz a0, .LBB16_4
573 ; RV64SFB-NEXT:  # %bb.3: # %bb
574 ; RV64SFB-NEXT:    addw s1, a1, a3
575 ; RV64SFB-NEXT:  .LBB16_4: # %bb
576 ; RV64SFB-NEXT:  .LBB16_1: # %bb2
577 ; RV64SFB-NEXT:    # =>This Inner Loop Header: Depth=1
578 ; RV64SFB-NEXT:    mv a0, s1
579 ; RV64SFB-NEXT:    call bar
580 ; RV64SFB-NEXT:    sllw s1, s1, s0
581 ; RV64SFB-NEXT:    bnez a0, .LBB16_1
582 ; RV64SFB-NEXT:  # %bb.2: # %bb7
583 ; RV64SFB-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
584 ; RV64SFB-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
585 ; RV64SFB-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
586 ; RV64SFB-NEXT:    addi sp, sp, 32
587 ; RV64SFB-NEXT:    ret
589 ; ZICOND-LABEL: sextw_removal_ccaddw:
590 ; ZICOND:       # %bb.0: # %bb
591 ; ZICOND-NEXT:    addi sp, sp, -32
592 ; ZICOND-NEXT:    sd ra, 24(sp) # 8-byte Folded Spill
593 ; ZICOND-NEXT:    sd s0, 16(sp) # 8-byte Folded Spill
594 ; ZICOND-NEXT:    sd s1, 8(sp) # 8-byte Folded Spill
595 ; ZICOND-NEXT:    mv s1, a1
596 ; ZICOND-NEXT:    andi a0, a0, 1
597 ; ZICOND-NEXT:    mv s0, a2
598 ; ZICOND-NEXT:    beqz a0, .LBB16_4
599 ; ZICOND-NEXT:  # %bb.3: # %bb
600 ; ZICOND-NEXT:    addw s1, a1, a3
601 ; ZICOND-NEXT:  .LBB16_4: # %bb
602 ; ZICOND-NEXT:  .LBB16_1: # %bb2
603 ; ZICOND-NEXT:    # =>This Inner Loop Header: Depth=1
604 ; ZICOND-NEXT:    mv a0, s1
605 ; ZICOND-NEXT:    call bar
606 ; ZICOND-NEXT:    sllw s1, s1, s0
607 ; ZICOND-NEXT:    bnez a0, .LBB16_1
608 ; ZICOND-NEXT:  # %bb.2: # %bb7
609 ; ZICOND-NEXT:    ld ra, 24(sp) # 8-byte Folded Reload
610 ; ZICOND-NEXT:    ld s0, 16(sp) # 8-byte Folded Reload
611 ; ZICOND-NEXT:    ld s1, 8(sp) # 8-byte Folded Reload
612 ; ZICOND-NEXT:    addi sp, sp, 32
613 ; ZICOND-NEXT:    ret
615 ; RV32SFB-LABEL: sextw_removal_ccaddw:
616 ; RV32SFB:       # %bb.0: # %bb
617 ; RV32SFB-NEXT:    addi sp, sp, -16
618 ; RV32SFB-NEXT:    sw ra, 12(sp) # 4-byte Folded Spill
619 ; RV32SFB-NEXT:    sw s0, 8(sp) # 4-byte Folded Spill
620 ; RV32SFB-NEXT:    sw s1, 4(sp) # 4-byte Folded Spill
621 ; RV32SFB-NEXT:    mv s1, a1
622 ; RV32SFB-NEXT:    andi a0, a0, 1
623 ; RV32SFB-NEXT:    mv s0, a2
624 ; RV32SFB-NEXT:    beqz a0, .LBB16_4
625 ; RV32SFB-NEXT:  # %bb.3: # %bb
626 ; RV32SFB-NEXT:    add s1, a1, a3
627 ; RV32SFB-NEXT:  .LBB16_4: # %bb
628 ; RV32SFB-NEXT:  .LBB16_1: # %bb2
629 ; RV32SFB-NEXT:    # =>This Inner Loop Header: Depth=1
630 ; RV32SFB-NEXT:    mv a0, s1
631 ; RV32SFB-NEXT:    call bar
632 ; RV32SFB-NEXT:    sll s1, s1, s0
633 ; RV32SFB-NEXT:    bnez a0, .LBB16_1
634 ; RV32SFB-NEXT:  # %bb.2: # %bb7
635 ; RV32SFB-NEXT:    lw ra, 12(sp) # 4-byte Folded Reload
636 ; RV32SFB-NEXT:    lw s0, 8(sp) # 4-byte Folded Reload
637 ; RV32SFB-NEXT:    lw s1, 4(sp) # 4-byte Folded Reload
638 ; RV32SFB-NEXT:    addi sp, sp, 16
639 ; RV32SFB-NEXT:    ret
641   %sel = select i1 %c, i32 %arg2, i32 0
642   %or = add i32 %sel, %arg
643   br label %bb2
645 bb2:                                              ; preds = %bb2, %bb
646   %i3 = phi i32 [ %or, %bb ], [ %i5, %bb2 ]
647   %i4 = tail call signext i32 @bar(i32 signext %i3)
648   %i5 = shl i32 %i3, %arg1
649   %i6 = icmp eq i32 %i4, 0
650   br i1 %i6, label %bb7, label %bb2
652 bb7:                                              ; preds = %bb2
653   ret void
656 define i32 @select_sllw(i32 %A, i32 %B, i32 %C, i1 zeroext %cond) {
657 ; NOSFB-LABEL: select_sllw:
658 ; NOSFB:       # %bb.0: # %entry
659 ; NOSFB-NEXT:    bnez a3, .LBB17_2
660 ; NOSFB-NEXT:  # %bb.1: # %entry
661 ; NOSFB-NEXT:    sllw a2, a0, a1
662 ; NOSFB-NEXT:  .LBB17_2: # %entry
663 ; NOSFB-NEXT:    mv a0, a2
664 ; NOSFB-NEXT:    ret
666 ; RV64SFB-LABEL: select_sllw:
667 ; RV64SFB:       # %bb.0: # %entry
668 ; RV64SFB-NEXT:    bnez a3, .LBB17_2
669 ; RV64SFB-NEXT:  # %bb.1: # %entry
670 ; RV64SFB-NEXT:    sllw a2, a0, a1
671 ; RV64SFB-NEXT:  .LBB17_2: # %entry
672 ; RV64SFB-NEXT:    mv a0, a2
673 ; RV64SFB-NEXT:    ret
675 ; ZICOND-LABEL: select_sllw:
676 ; ZICOND:       # %bb.0: # %entry
677 ; ZICOND-NEXT:    bnez a3, .LBB17_2
678 ; ZICOND-NEXT:  # %bb.1: # %entry
679 ; ZICOND-NEXT:    sllw a2, a0, a1
680 ; ZICOND-NEXT:  .LBB17_2: # %entry
681 ; ZICOND-NEXT:    mv a0, a2
682 ; ZICOND-NEXT:    ret
684 ; RV32SFB-LABEL: select_sllw:
685 ; RV32SFB:       # %bb.0: # %entry
686 ; RV32SFB-NEXT:    bnez a3, .LBB17_2
687 ; RV32SFB-NEXT:  # %bb.1: # %entry
688 ; RV32SFB-NEXT:    sll a2, a0, a1
689 ; RV32SFB-NEXT:  .LBB17_2: # %entry
690 ; RV32SFB-NEXT:    mv a0, a2
691 ; RV32SFB-NEXT:    ret
692 entry:
693  %0 = shl i32 %A, %B
694  %1 = select i1 %cond, i32 %C, i32 %0
695  ret i32 %1
698 define i32 @select_srlw(i32 %A, i32 %B, i32 %C, i1 zeroext %cond) {
699 ; NOSFB-LABEL: select_srlw:
700 ; NOSFB:       # %bb.0: # %entry
701 ; NOSFB-NEXT:    bnez a3, .LBB18_2
702 ; NOSFB-NEXT:  # %bb.1: # %entry
703 ; NOSFB-NEXT:    srlw a2, a0, a1
704 ; NOSFB-NEXT:  .LBB18_2: # %entry
705 ; NOSFB-NEXT:    mv a0, a2
706 ; NOSFB-NEXT:    ret
708 ; RV64SFB-LABEL: select_srlw:
709 ; RV64SFB:       # %bb.0: # %entry
710 ; RV64SFB-NEXT:    bnez a3, .LBB18_2
711 ; RV64SFB-NEXT:  # %bb.1: # %entry
712 ; RV64SFB-NEXT:    srlw a2, a0, a1
713 ; RV64SFB-NEXT:  .LBB18_2: # %entry
714 ; RV64SFB-NEXT:    mv a0, a2
715 ; RV64SFB-NEXT:    ret
717 ; ZICOND-LABEL: select_srlw:
718 ; ZICOND:       # %bb.0: # %entry
719 ; ZICOND-NEXT:    bnez a3, .LBB18_2
720 ; ZICOND-NEXT:  # %bb.1: # %entry
721 ; ZICOND-NEXT:    srlw a2, a0, a1
722 ; ZICOND-NEXT:  .LBB18_2: # %entry
723 ; ZICOND-NEXT:    mv a0, a2
724 ; ZICOND-NEXT:    ret
726 ; RV32SFB-LABEL: select_srlw:
727 ; RV32SFB:       # %bb.0: # %entry
728 ; RV32SFB-NEXT:    bnez a3, .LBB18_2
729 ; RV32SFB-NEXT:  # %bb.1: # %entry
730 ; RV32SFB-NEXT:    srl a2, a0, a1
731 ; RV32SFB-NEXT:  .LBB18_2: # %entry
732 ; RV32SFB-NEXT:    mv a0, a2
733 ; RV32SFB-NEXT:    ret
734 entry:
735  %0 = lshr i32 %A, %B
736  %1 = select i1 %cond, i32 %C, i32 %0
737  ret i32 %1
740 define i32 @select_sraw(i32 %A, i32 %B, i32 %C, i1 zeroext %cond) {
741 ; NOSFB-LABEL: select_sraw:
742 ; NOSFB:       # %bb.0: # %entry
743 ; NOSFB-NEXT:    bnez a3, .LBB19_2
744 ; NOSFB-NEXT:  # %bb.1: # %entry
745 ; NOSFB-NEXT:    sraw a2, a0, a1
746 ; NOSFB-NEXT:  .LBB19_2: # %entry
747 ; NOSFB-NEXT:    mv a0, a2
748 ; NOSFB-NEXT:    ret
750 ; RV64SFB-LABEL: select_sraw:
751 ; RV64SFB:       # %bb.0: # %entry
752 ; RV64SFB-NEXT:    bnez a3, .LBB19_2
753 ; RV64SFB-NEXT:  # %bb.1: # %entry
754 ; RV64SFB-NEXT:    sraw a2, a0, a1
755 ; RV64SFB-NEXT:  .LBB19_2: # %entry
756 ; RV64SFB-NEXT:    mv a0, a2
757 ; RV64SFB-NEXT:    ret
759 ; ZICOND-LABEL: select_sraw:
760 ; ZICOND:       # %bb.0: # %entry
761 ; ZICOND-NEXT:    bnez a3, .LBB19_2
762 ; ZICOND-NEXT:  # %bb.1: # %entry
763 ; ZICOND-NEXT:    sraw a2, a0, a1
764 ; ZICOND-NEXT:  .LBB19_2: # %entry
765 ; ZICOND-NEXT:    mv a0, a2
766 ; ZICOND-NEXT:    ret
768 ; RV32SFB-LABEL: select_sraw:
769 ; RV32SFB:       # %bb.0: # %entry
770 ; RV32SFB-NEXT:    bnez a3, .LBB19_2
771 ; RV32SFB-NEXT:  # %bb.1: # %entry
772 ; RV32SFB-NEXT:    sra a2, a0, a1
773 ; RV32SFB-NEXT:  .LBB19_2: # %entry
774 ; RV32SFB-NEXT:    mv a0, a2
775 ; RV32SFB-NEXT:    ret
776 entry:
777  %0 = ashr i32 %A, %B
778  %1 = select i1 %cond, i32 %C, i32 %0
779  ret i32 %1
782 define i64 @select_sll(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) {
783 ; NOSFB-LABEL: select_sll:
784 ; NOSFB:       # %bb.0: # %entry
785 ; NOSFB-NEXT:    bnez a3, .LBB20_2
786 ; NOSFB-NEXT:  # %bb.1: # %entry
787 ; NOSFB-NEXT:    sll a2, a0, a1
788 ; NOSFB-NEXT:  .LBB20_2: # %entry
789 ; NOSFB-NEXT:    mv a0, a2
790 ; NOSFB-NEXT:    ret
792 ; RV64SFB-LABEL: select_sll:
793 ; RV64SFB:       # %bb.0: # %entry
794 ; RV64SFB-NEXT:    bnez a3, .LBB20_2
795 ; RV64SFB-NEXT:  # %bb.1: # %entry
796 ; RV64SFB-NEXT:    sll a2, a0, a1
797 ; RV64SFB-NEXT:  .LBB20_2: # %entry
798 ; RV64SFB-NEXT:    mv a0, a2
799 ; RV64SFB-NEXT:    ret
801 ; ZICOND-LABEL: select_sll:
802 ; ZICOND:       # %bb.0: # %entry
803 ; ZICOND-NEXT:    bnez a3, .LBB20_2
804 ; ZICOND-NEXT:  # %bb.1: # %entry
805 ; ZICOND-NEXT:    sll a2, a0, a1
806 ; ZICOND-NEXT:  .LBB20_2: # %entry
807 ; ZICOND-NEXT:    mv a0, a2
808 ; ZICOND-NEXT:    ret
810 ; RV32SFB-LABEL: select_sll:
811 ; RV32SFB:       # %bb.0: # %entry
812 ; RV32SFB-NEXT:    sll a3, a0, a2
813 ; RV32SFB-NEXT:    not a7, a2
814 ; RV32SFB-NEXT:    srli a0, a0, 1
815 ; RV32SFB-NEXT:    sll t0, a1, a2
816 ; RV32SFB-NEXT:    addi a2, a2, -32
817 ; RV32SFB-NEXT:    srl a0, a0, a7
818 ; RV32SFB-NEXT:    mv a1, a3
819 ; RV32SFB-NEXT:    bltz a2, .LBB20_2
820 ; RV32SFB-NEXT:  # %bb.1: # %entry
821 ; RV32SFB-NEXT:    li a3, 0
822 ; RV32SFB-NEXT:  .LBB20_2: # %entry
823 ; RV32SFB-NEXT:    bgez a2, .LBB20_4
824 ; RV32SFB-NEXT:  # %bb.3: # %entry
825 ; RV32SFB-NEXT:    or a1, t0, a0
826 ; RV32SFB-NEXT:  .LBB20_4: # %entry
827 ; RV32SFB-NEXT:    beqz a6, .LBB20_6
828 ; RV32SFB-NEXT:  # %bb.5: # %entry
829 ; RV32SFB-NEXT:    mv a3, a4
830 ; RV32SFB-NEXT:  .LBB20_6: # %entry
831 ; RV32SFB-NEXT:    beqz a6, .LBB20_8
832 ; RV32SFB-NEXT:  # %bb.7: # %entry
833 ; RV32SFB-NEXT:    mv a1, a5
834 ; RV32SFB-NEXT:  .LBB20_8: # %entry
835 ; RV32SFB-NEXT:    mv a0, a3
836 ; RV32SFB-NEXT:    ret
837 entry:
838  %0 = shl i64 %A, %B
839  %1 = select i1 %cond, i64 %C, i64 %0
840  ret i64 %1
843 define i64 @select_srl(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) {
844 ; NOSFB-LABEL: select_srl:
845 ; NOSFB:       # %bb.0: # %entry
846 ; NOSFB-NEXT:    bnez a3, .LBB21_2
847 ; NOSFB-NEXT:  # %bb.1: # %entry
848 ; NOSFB-NEXT:    srl a2, a0, a1
849 ; NOSFB-NEXT:  .LBB21_2: # %entry
850 ; NOSFB-NEXT:    mv a0, a2
851 ; NOSFB-NEXT:    ret
853 ; RV64SFB-LABEL: select_srl:
854 ; RV64SFB:       # %bb.0: # %entry
855 ; RV64SFB-NEXT:    bnez a3, .LBB21_2
856 ; RV64SFB-NEXT:  # %bb.1: # %entry
857 ; RV64SFB-NEXT:    srl a2, a0, a1
858 ; RV64SFB-NEXT:  .LBB21_2: # %entry
859 ; RV64SFB-NEXT:    mv a0, a2
860 ; RV64SFB-NEXT:    ret
862 ; ZICOND-LABEL: select_srl:
863 ; ZICOND:       # %bb.0: # %entry
864 ; ZICOND-NEXT:    bnez a3, .LBB21_2
865 ; ZICOND-NEXT:  # %bb.1: # %entry
866 ; ZICOND-NEXT:    srl a2, a0, a1
867 ; ZICOND-NEXT:  .LBB21_2: # %entry
868 ; ZICOND-NEXT:    mv a0, a2
869 ; ZICOND-NEXT:    ret
871 ; RV32SFB-LABEL: select_srl:
872 ; RV32SFB:       # %bb.0: # %entry
873 ; RV32SFB-NEXT:    srl a3, a1, a2
874 ; RV32SFB-NEXT:    not a7, a2
875 ; RV32SFB-NEXT:    slli a1, a1, 1
876 ; RV32SFB-NEXT:    srl t0, a0, a2
877 ; RV32SFB-NEXT:    addi a2, a2, -32
878 ; RV32SFB-NEXT:    sll a1, a1, a7
879 ; RV32SFB-NEXT:    mv a0, a3
880 ; RV32SFB-NEXT:    bltz a2, .LBB21_2
881 ; RV32SFB-NEXT:  # %bb.1: # %entry
882 ; RV32SFB-NEXT:    li a3, 0
883 ; RV32SFB-NEXT:  .LBB21_2: # %entry
884 ; RV32SFB-NEXT:    bgez a2, .LBB21_4
885 ; RV32SFB-NEXT:  # %bb.3: # %entry
886 ; RV32SFB-NEXT:    or a0, t0, a1
887 ; RV32SFB-NEXT:  .LBB21_4: # %entry
888 ; RV32SFB-NEXT:    beqz a6, .LBB21_6
889 ; RV32SFB-NEXT:  # %bb.5: # %entry
890 ; RV32SFB-NEXT:    mv a3, a5
891 ; RV32SFB-NEXT:  .LBB21_6: # %entry
892 ; RV32SFB-NEXT:    beqz a6, .LBB21_8
893 ; RV32SFB-NEXT:  # %bb.7: # %entry
894 ; RV32SFB-NEXT:    mv a0, a4
895 ; RV32SFB-NEXT:  .LBB21_8: # %entry
896 ; RV32SFB-NEXT:    mv a1, a3
897 ; RV32SFB-NEXT:    ret
898 entry:
899  %0 = lshr i64 %A, %B
900  %1 = select i1 %cond, i64 %C, i64 %0
901  ret i64 %1
904 define i64 @select_sra(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) {
905 ; NOSFB-LABEL: select_sra:
906 ; NOSFB:       # %bb.0: # %entry
907 ; NOSFB-NEXT:    bnez a3, .LBB22_2
908 ; NOSFB-NEXT:  # %bb.1: # %entry
909 ; NOSFB-NEXT:    sra a2, a0, a1
910 ; NOSFB-NEXT:  .LBB22_2: # %entry
911 ; NOSFB-NEXT:    mv a0, a2
912 ; NOSFB-NEXT:    ret
914 ; RV64SFB-LABEL: select_sra:
915 ; RV64SFB:       # %bb.0: # %entry
916 ; RV64SFB-NEXT:    bnez a3, .LBB22_2
917 ; RV64SFB-NEXT:  # %bb.1: # %entry
918 ; RV64SFB-NEXT:    sra a2, a0, a1
919 ; RV64SFB-NEXT:  .LBB22_2: # %entry
920 ; RV64SFB-NEXT:    mv a0, a2
921 ; RV64SFB-NEXT:    ret
923 ; ZICOND-LABEL: select_sra:
924 ; ZICOND:       # %bb.0: # %entry
925 ; ZICOND-NEXT:    bnez a3, .LBB22_2
926 ; ZICOND-NEXT:  # %bb.1: # %entry
927 ; ZICOND-NEXT:    sra a2, a0, a1
928 ; ZICOND-NEXT:  .LBB22_2: # %entry
929 ; ZICOND-NEXT:    mv a0, a2
930 ; ZICOND-NEXT:    ret
932 ; RV32SFB-LABEL: select_sra:
933 ; RV32SFB:       # %bb.0: # %entry
934 ; RV32SFB-NEXT:    sra a3, a1, a2
935 ; RV32SFB-NEXT:    not a7, a2
936 ; RV32SFB-NEXT:    slli t0, a1, 1
937 ; RV32SFB-NEXT:    srl t1, a0, a2
938 ; RV32SFB-NEXT:    addi a2, a2, -32
939 ; RV32SFB-NEXT:    sll a7, t0, a7
940 ; RV32SFB-NEXT:    mv a0, a3
941 ; RV32SFB-NEXT:    bltz a2, .LBB22_2
942 ; RV32SFB-NEXT:  # %bb.1: # %entry
943 ; RV32SFB-NEXT:    srai a3, a1, 31
944 ; RV32SFB-NEXT:  .LBB22_2: # %entry
945 ; RV32SFB-NEXT:    bgez a2, .LBB22_4
946 ; RV32SFB-NEXT:  # %bb.3: # %entry
947 ; RV32SFB-NEXT:    or a0, t1, a7
948 ; RV32SFB-NEXT:  .LBB22_4: # %entry
949 ; RV32SFB-NEXT:    beqz a6, .LBB22_6
950 ; RV32SFB-NEXT:  # %bb.5: # %entry
951 ; RV32SFB-NEXT:    mv a3, a5
952 ; RV32SFB-NEXT:  .LBB22_6: # %entry
953 ; RV32SFB-NEXT:    beqz a6, .LBB22_8
954 ; RV32SFB-NEXT:  # %bb.7: # %entry
955 ; RV32SFB-NEXT:    mv a0, a4
956 ; RV32SFB-NEXT:  .LBB22_8: # %entry
957 ; RV32SFB-NEXT:    mv a1, a3
958 ; RV32SFB-NEXT:    ret
959 entry:
960  %0 = ashr i64 %A, %B
961  %1 = select i1 %cond, i64 %C, i64 %0
962  ret i64 %1
965 define i32 @select_addiw(i32 %A, i32 %C, i1 zeroext %cond) {
966 ; NOSFB-LABEL: select_addiw:
967 ; NOSFB:       # %bb.0: # %entry
968 ; NOSFB-NEXT:    bnez a2, .LBB23_2
969 ; NOSFB-NEXT:  # %bb.1: # %entry
970 ; NOSFB-NEXT:    addiw a1, a0, 1234
971 ; NOSFB-NEXT:  .LBB23_2: # %entry
972 ; NOSFB-NEXT:    mv a0, a1
973 ; NOSFB-NEXT:    ret
975 ; RV64SFB-LABEL: select_addiw:
976 ; RV64SFB:       # %bb.0: # %entry
977 ; RV64SFB-NEXT:    bnez a2, .LBB23_2
978 ; RV64SFB-NEXT:  # %bb.1: # %entry
979 ; RV64SFB-NEXT:    addiw a1, a0, 1234
980 ; RV64SFB-NEXT:  .LBB23_2: # %entry
981 ; RV64SFB-NEXT:    mv a0, a1
982 ; RV64SFB-NEXT:    ret
984 ; ZICOND-LABEL: select_addiw:
985 ; ZICOND:       # %bb.0: # %entry
986 ; ZICOND-NEXT:    bnez a2, .LBB23_2
987 ; ZICOND-NEXT:  # %bb.1: # %entry
988 ; ZICOND-NEXT:    addiw a1, a0, 1234
989 ; ZICOND-NEXT:  .LBB23_2: # %entry
990 ; ZICOND-NEXT:    mv a0, a1
991 ; ZICOND-NEXT:    ret
993 ; RV32SFB-LABEL: select_addiw:
994 ; RV32SFB:       # %bb.0: # %entry
995 ; RV32SFB-NEXT:    bnez a2, .LBB23_2
996 ; RV32SFB-NEXT:  # %bb.1: # %entry
997 ; RV32SFB-NEXT:    addi a1, a0, 1234
998 ; RV32SFB-NEXT:  .LBB23_2: # %entry
999 ; RV32SFB-NEXT:    mv a0, a1
1000 ; RV32SFB-NEXT:    ret
1001 entry:
1002  %0 = add i32 %A, 1234
1003  %1 = select i1 %cond, i32 %C, i32 %0
1004  ret i32 %1
1007 define i64 @select_addi(i64 %A, i64 %C, i1 zeroext %cond) {
1008 ; NOSFB-LABEL: select_addi:
1009 ; NOSFB:       # %bb.0: # %entry
1010 ; NOSFB-NEXT:    bnez a2, .LBB24_2
1011 ; NOSFB-NEXT:  # %bb.1: # %entry
1012 ; NOSFB-NEXT:    addi a1, a0, 1234
1013 ; NOSFB-NEXT:  .LBB24_2: # %entry
1014 ; NOSFB-NEXT:    mv a0, a1
1015 ; NOSFB-NEXT:    ret
1017 ; RV64SFB-LABEL: select_addi:
1018 ; RV64SFB:       # %bb.0: # %entry
1019 ; RV64SFB-NEXT:    bnez a2, .LBB24_2
1020 ; RV64SFB-NEXT:  # %bb.1: # %entry
1021 ; RV64SFB-NEXT:    addi a1, a0, 1234
1022 ; RV64SFB-NEXT:  .LBB24_2: # %entry
1023 ; RV64SFB-NEXT:    mv a0, a1
1024 ; RV64SFB-NEXT:    ret
1026 ; ZICOND-LABEL: select_addi:
1027 ; ZICOND:       # %bb.0: # %entry
1028 ; ZICOND-NEXT:    bnez a2, .LBB24_2
1029 ; ZICOND-NEXT:  # %bb.1: # %entry
1030 ; ZICOND-NEXT:    addi a1, a0, 1234
1031 ; ZICOND-NEXT:  .LBB24_2: # %entry
1032 ; ZICOND-NEXT:    mv a0, a1
1033 ; ZICOND-NEXT:    ret
1035 ; RV32SFB-LABEL: select_addi:
1036 ; RV32SFB:       # %bb.0: # %entry
1037 ; RV32SFB-NEXT:    addi a5, a0, 1234
1038 ; RV32SFB-NEXT:    sltu a0, a5, a0
1039 ; RV32SFB-NEXT:    beqz a4, .LBB24_2
1040 ; RV32SFB-NEXT:  # %bb.1: # %entry
1041 ; RV32SFB-NEXT:    mv a5, a2
1042 ; RV32SFB-NEXT:  .LBB24_2: # %entry
1043 ; RV32SFB-NEXT:    bnez a4, .LBB24_4
1044 ; RV32SFB-NEXT:  # %bb.3: # %entry
1045 ; RV32SFB-NEXT:    add a3, a1, a0
1046 ; RV32SFB-NEXT:  .LBB24_4: # %entry
1047 ; RV32SFB-NEXT:    mv a0, a5
1048 ; RV32SFB-NEXT:    mv a1, a3
1049 ; RV32SFB-NEXT:    ret
1050 entry:
1051  %0 = add i64 %A, 1234
1052  %1 = select i1 %cond, i64 %C, i64 %0
1053  ret i64 %1
1056 define i64 @select_andi(i64 %A, i64 %C, i1 zeroext %cond) {
1057 ; NOSFB-LABEL: select_andi:
1058 ; NOSFB:       # %bb.0: # %entry
1059 ; NOSFB-NEXT:    bnez a2, .LBB25_2
1060 ; NOSFB-NEXT:  # %bb.1: # %entry
1061 ; NOSFB-NEXT:    andi a1, a0, 567
1062 ; NOSFB-NEXT:  .LBB25_2: # %entry
1063 ; NOSFB-NEXT:    mv a0, a1
1064 ; NOSFB-NEXT:    ret
1066 ; RV64SFB-LABEL: select_andi:
1067 ; RV64SFB:       # %bb.0: # %entry
1068 ; RV64SFB-NEXT:    bnez a2, .LBB25_2
1069 ; RV64SFB-NEXT:  # %bb.1: # %entry
1070 ; RV64SFB-NEXT:    andi a1, a0, 567
1071 ; RV64SFB-NEXT:  .LBB25_2: # %entry
1072 ; RV64SFB-NEXT:    mv a0, a1
1073 ; RV64SFB-NEXT:    ret
1075 ; ZICOND-LABEL: select_andi:
1076 ; ZICOND:       # %bb.0: # %entry
1077 ; ZICOND-NEXT:    bnez a2, .LBB25_2
1078 ; ZICOND-NEXT:  # %bb.1: # %entry
1079 ; ZICOND-NEXT:    andi a1, a0, 567
1080 ; ZICOND-NEXT:  .LBB25_2: # %entry
1081 ; ZICOND-NEXT:    mv a0, a1
1082 ; ZICOND-NEXT:    ret
1084 ; RV32SFB-LABEL: select_andi:
1085 ; RV32SFB:       # %bb.0: # %entry
1086 ; RV32SFB-NEXT:    mv a1, a3
1087 ; RV32SFB-NEXT:    bnez a4, .LBB25_2
1088 ; RV32SFB-NEXT:  # %bb.1: # %entry
1089 ; RV32SFB-NEXT:    andi a2, a0, 567
1090 ; RV32SFB-NEXT:  .LBB25_2: # %entry
1091 ; RV32SFB-NEXT:    mv a0, a2
1092 ; RV32SFB-NEXT:    bnez a4, .LBB25_4
1093 ; RV32SFB-NEXT:  # %bb.3: # %entry
1094 ; RV32SFB-NEXT:    li a1, 0
1095 ; RV32SFB-NEXT:  .LBB25_4: # %entry
1096 ; RV32SFB-NEXT:    ret
1097 entry:
1098  %0 = and i64 %A, 567
1099  %1 = select i1 %cond, i64 %C, i64 %0
1100  ret i64 %1
1103 define i64 @select_ori(i64 %A, i64 %C, i1 zeroext %cond) {
1104 ; NOSFB-LABEL: select_ori:
1105 ; NOSFB:       # %bb.0: # %entry
1106 ; NOSFB-NEXT:    bnez a2, .LBB26_2
1107 ; NOSFB-NEXT:  # %bb.1: # %entry
1108 ; NOSFB-NEXT:    ori a1, a0, 890
1109 ; NOSFB-NEXT:  .LBB26_2: # %entry
1110 ; NOSFB-NEXT:    mv a0, a1
1111 ; NOSFB-NEXT:    ret
1113 ; RV64SFB-LABEL: select_ori:
1114 ; RV64SFB:       # %bb.0: # %entry
1115 ; RV64SFB-NEXT:    bnez a2, .LBB26_2
1116 ; RV64SFB-NEXT:  # %bb.1: # %entry
1117 ; RV64SFB-NEXT:    ori a1, a0, 890
1118 ; RV64SFB-NEXT:  .LBB26_2: # %entry
1119 ; RV64SFB-NEXT:    mv a0, a1
1120 ; RV64SFB-NEXT:    ret
1122 ; ZICOND-LABEL: select_ori:
1123 ; ZICOND:       # %bb.0: # %entry
1124 ; ZICOND-NEXT:    bnez a2, .LBB26_2
1125 ; ZICOND-NEXT:  # %bb.1: # %entry
1126 ; ZICOND-NEXT:    ori a1, a0, 890
1127 ; ZICOND-NEXT:  .LBB26_2: # %entry
1128 ; ZICOND-NEXT:    mv a0, a1
1129 ; ZICOND-NEXT:    ret
1131 ; RV32SFB-LABEL: select_ori:
1132 ; RV32SFB:       # %bb.0: # %entry
1133 ; RV32SFB-NEXT:    bnez a4, .LBB26_2
1134 ; RV32SFB-NEXT:  # %bb.1: # %entry
1135 ; RV32SFB-NEXT:    ori a2, a0, 890
1136 ; RV32SFB-NEXT:  .LBB26_2: # %entry
1137 ; RV32SFB-NEXT:    beqz a4, .LBB26_4
1138 ; RV32SFB-NEXT:  # %bb.3: # %entry
1139 ; RV32SFB-NEXT:    mv a1, a3
1140 ; RV32SFB-NEXT:  .LBB26_4: # %entry
1141 ; RV32SFB-NEXT:    mv a0, a2
1142 ; RV32SFB-NEXT:    ret
1143 entry:
1144  %0 = or i64 %A, 890
1145  %1 = select i1 %cond, i64 %C, i64 %0
1146  ret i64 %1
1149 define i64 @select_xori(i64 %A, i64 %C, i1 zeroext %cond) {
1150 ; NOSFB-LABEL: select_xori:
1151 ; NOSFB:       # %bb.0: # %entry
1152 ; NOSFB-NEXT:    bnez a2, .LBB27_2
1153 ; NOSFB-NEXT:  # %bb.1: # %entry
1154 ; NOSFB-NEXT:    xori a1, a0, 321
1155 ; NOSFB-NEXT:  .LBB27_2: # %entry
1156 ; NOSFB-NEXT:    mv a0, a1
1157 ; NOSFB-NEXT:    ret
1159 ; RV64SFB-LABEL: select_xori:
1160 ; RV64SFB:       # %bb.0: # %entry
1161 ; RV64SFB-NEXT:    bnez a2, .LBB27_2
1162 ; RV64SFB-NEXT:  # %bb.1: # %entry
1163 ; RV64SFB-NEXT:    xori a1, a0, 321
1164 ; RV64SFB-NEXT:  .LBB27_2: # %entry
1165 ; RV64SFB-NEXT:    mv a0, a1
1166 ; RV64SFB-NEXT:    ret
1168 ; ZICOND-LABEL: select_xori:
1169 ; ZICOND:       # %bb.0: # %entry
1170 ; ZICOND-NEXT:    bnez a2, .LBB27_2
1171 ; ZICOND-NEXT:  # %bb.1: # %entry
1172 ; ZICOND-NEXT:    xori a1, a0, 321
1173 ; ZICOND-NEXT:  .LBB27_2: # %entry
1174 ; ZICOND-NEXT:    mv a0, a1
1175 ; ZICOND-NEXT:    ret
1177 ; RV32SFB-LABEL: select_xori:
1178 ; RV32SFB:       # %bb.0: # %entry
1179 ; RV32SFB-NEXT:    bnez a4, .LBB27_2
1180 ; RV32SFB-NEXT:  # %bb.1: # %entry
1181 ; RV32SFB-NEXT:    xori a2, a0, 321
1182 ; RV32SFB-NEXT:  .LBB27_2: # %entry
1183 ; RV32SFB-NEXT:    beqz a4, .LBB27_4
1184 ; RV32SFB-NEXT:  # %bb.3: # %entry
1185 ; RV32SFB-NEXT:    mv a1, a3
1186 ; RV32SFB-NEXT:  .LBB27_4: # %entry
1187 ; RV32SFB-NEXT:    mv a0, a2
1188 ; RV32SFB-NEXT:    ret
1189 entry:
1190  %0 = xor i64 %A, 321
1191  %1 = select i1 %cond, i64 %C, i64 %0
1192  ret i64 %1
1195 define i64 @select_slli(i64 %A, i64 %C, i1 zeroext %cond) {
1196 ; NOSFB-LABEL: select_slli:
1197 ; NOSFB:       # %bb.0: # %entry
1198 ; NOSFB-NEXT:    bnez a2, .LBB28_2
1199 ; NOSFB-NEXT:  # %bb.1: # %entry
1200 ; NOSFB-NEXT:    slli a1, a0, 32
1201 ; NOSFB-NEXT:  .LBB28_2: # %entry
1202 ; NOSFB-NEXT:    mv a0, a1
1203 ; NOSFB-NEXT:    ret
1205 ; RV64SFB-LABEL: select_slli:
1206 ; RV64SFB:       # %bb.0: # %entry
1207 ; RV64SFB-NEXT:    bnez a2, .LBB28_2
1208 ; RV64SFB-NEXT:  # %bb.1: # %entry
1209 ; RV64SFB-NEXT:    slli a1, a0, 32
1210 ; RV64SFB-NEXT:  .LBB28_2: # %entry
1211 ; RV64SFB-NEXT:    mv a0, a1
1212 ; RV64SFB-NEXT:    ret
1214 ; ZICOND-LABEL: select_slli:
1215 ; ZICOND:       # %bb.0: # %entry
1216 ; ZICOND-NEXT:    bnez a2, .LBB28_2
1217 ; ZICOND-NEXT:  # %bb.1: # %entry
1218 ; ZICOND-NEXT:    slli a1, a0, 32
1219 ; ZICOND-NEXT:  .LBB28_2: # %entry
1220 ; ZICOND-NEXT:    mv a0, a1
1221 ; ZICOND-NEXT:    ret
1223 ; RV32SFB-LABEL: select_slli:
1224 ; RV32SFB:       # %bb.0: # %entry
1225 ; RV32SFB-NEXT:    mv a1, a0
1226 ; RV32SFB-NEXT:    bnez a4, .LBB28_2
1227 ; RV32SFB-NEXT:  # %bb.1: # %entry
1228 ; RV32SFB-NEXT:    li a2, 0
1229 ; RV32SFB-NEXT:  .LBB28_2: # %entry
1230 ; RV32SFB-NEXT:    mv a0, a2
1231 ; RV32SFB-NEXT:    beqz a4, .LBB28_4
1232 ; RV32SFB-NEXT:  # %bb.3: # %entry
1233 ; RV32SFB-NEXT:    mv a1, a3
1234 ; RV32SFB-NEXT:  .LBB28_4: # %entry
1235 ; RV32SFB-NEXT:    ret
1236 entry:
1237  %0 = shl i64 %A, 32
1238  %1 = select i1 %cond, i64 %C, i64 %0
1239  ret i64 %1
1242 define i64 @select_srli(i64 %A, i64 %C, i1 zeroext %cond) {
1243 ; NOSFB-LABEL: select_srli:
1244 ; NOSFB:       # %bb.0: # %entry
1245 ; NOSFB-NEXT:    bnez a2, .LBB29_2
1246 ; NOSFB-NEXT:  # %bb.1: # %entry
1247 ; NOSFB-NEXT:    srli a1, a0, 35
1248 ; NOSFB-NEXT:  .LBB29_2: # %entry
1249 ; NOSFB-NEXT:    mv a0, a1
1250 ; NOSFB-NEXT:    ret
1252 ; RV64SFB-LABEL: select_srli:
1253 ; RV64SFB:       # %bb.0: # %entry
1254 ; RV64SFB-NEXT:    bnez a2, .LBB29_2
1255 ; RV64SFB-NEXT:  # %bb.1: # %entry
1256 ; RV64SFB-NEXT:    srli a1, a0, 35
1257 ; RV64SFB-NEXT:  .LBB29_2: # %entry
1258 ; RV64SFB-NEXT:    mv a0, a1
1259 ; RV64SFB-NEXT:    ret
1261 ; ZICOND-LABEL: select_srli:
1262 ; ZICOND:       # %bb.0: # %entry
1263 ; ZICOND-NEXT:    bnez a2, .LBB29_2
1264 ; ZICOND-NEXT:  # %bb.1: # %entry
1265 ; ZICOND-NEXT:    srli a1, a0, 35
1266 ; ZICOND-NEXT:  .LBB29_2: # %entry
1267 ; ZICOND-NEXT:    mv a0, a1
1268 ; ZICOND-NEXT:    ret
1270 ; RV32SFB-LABEL: select_srli:
1271 ; RV32SFB:       # %bb.0: # %entry
1272 ; RV32SFB-NEXT:    mv a0, a2
1273 ; RV32SFB-NEXT:    bnez a4, .LBB29_2
1274 ; RV32SFB-NEXT:  # %bb.1: # %entry
1275 ; RV32SFB-NEXT:    li a3, 0
1276 ; RV32SFB-NEXT:  .LBB29_2: # %entry
1277 ; RV32SFB-NEXT:    bnez a4, .LBB29_4
1278 ; RV32SFB-NEXT:  # %bb.3: # %entry
1279 ; RV32SFB-NEXT:    srli a0, a1, 3
1280 ; RV32SFB-NEXT:  .LBB29_4: # %entry
1281 ; RV32SFB-NEXT:    mv a1, a3
1282 ; RV32SFB-NEXT:    ret
1283 entry:
1284  %0 = lshr i64 %A, 35
1285  %1 = select i1 %cond, i64 %C, i64 %0
1286  ret i64 %1
1289 define i64 @select_srai(i64 %A, i64 %C, i1 zeroext %cond) {
1290 ; NOSFB-LABEL: select_srai:
1291 ; NOSFB:       # %bb.0: # %entry
1292 ; NOSFB-NEXT:    bnez a2, .LBB30_2
1293 ; NOSFB-NEXT:  # %bb.1: # %entry
1294 ; NOSFB-NEXT:    srai a1, a0, 63
1295 ; NOSFB-NEXT:  .LBB30_2: # %entry
1296 ; NOSFB-NEXT:    mv a0, a1
1297 ; NOSFB-NEXT:    ret
1299 ; RV64SFB-LABEL: select_srai:
1300 ; RV64SFB:       # %bb.0: # %entry
1301 ; RV64SFB-NEXT:    bnez a2, .LBB30_2
1302 ; RV64SFB-NEXT:  # %bb.1: # %entry
1303 ; RV64SFB-NEXT:    srai a1, a0, 63
1304 ; RV64SFB-NEXT:  .LBB30_2: # %entry
1305 ; RV64SFB-NEXT:    mv a0, a1
1306 ; RV64SFB-NEXT:    ret
1308 ; ZICOND-LABEL: select_srai:
1309 ; ZICOND:       # %bb.0: # %entry
1310 ; ZICOND-NEXT:    bnez a2, .LBB30_2
1311 ; ZICOND-NEXT:  # %bb.1: # %entry
1312 ; ZICOND-NEXT:    srai a1, a0, 63
1313 ; ZICOND-NEXT:  .LBB30_2: # %entry
1314 ; ZICOND-NEXT:    mv a0, a1
1315 ; ZICOND-NEXT:    ret
1317 ; RV32SFB-LABEL: select_srai:
1318 ; RV32SFB:       # %bb.0: # %entry
1319 ; RV32SFB-NEXT:    mv a0, a2
1320 ; RV32SFB-NEXT:    srai a1, a1, 31
1321 ; RV32SFB-NEXT:    bnez a4, .LBB30_2
1322 ; RV32SFB-NEXT:  # %bb.1: # %entry
1323 ; RV32SFB-NEXT:    mv a0, a1
1324 ; RV32SFB-NEXT:  .LBB30_2: # %entry
1325 ; RV32SFB-NEXT:    beqz a4, .LBB30_4
1326 ; RV32SFB-NEXT:  # %bb.3: # %entry
1327 ; RV32SFB-NEXT:    mv a1, a3
1328 ; RV32SFB-NEXT:  .LBB30_4: # %entry
1329 ; RV32SFB-NEXT:    ret
1330 entry:
1331  %0 = ashr i64 %A, 63
1332  %1 = select i1 %cond, i64 %C, i64 %0
1333  ret i64 %1
1336 define i32 @select_slliw(i32 %A, i32 %C, i1 zeroext %cond) {
1337 ; NOSFB-LABEL: select_slliw:
1338 ; NOSFB:       # %bb.0: # %entry
1339 ; NOSFB-NEXT:    bnez a2, .LBB31_2
1340 ; NOSFB-NEXT:  # %bb.1: # %entry
1341 ; NOSFB-NEXT:    slliw a1, a0, 3
1342 ; NOSFB-NEXT:  .LBB31_2: # %entry
1343 ; NOSFB-NEXT:    mv a0, a1
1344 ; NOSFB-NEXT:    ret
1346 ; RV64SFB-LABEL: select_slliw:
1347 ; RV64SFB:       # %bb.0: # %entry
1348 ; RV64SFB-NEXT:    bnez a2, .LBB31_2
1349 ; RV64SFB-NEXT:  # %bb.1: # %entry
1350 ; RV64SFB-NEXT:    slliw a1, a0, 3
1351 ; RV64SFB-NEXT:  .LBB31_2: # %entry
1352 ; RV64SFB-NEXT:    mv a0, a1
1353 ; RV64SFB-NEXT:    ret
1355 ; ZICOND-LABEL: select_slliw:
1356 ; ZICOND:       # %bb.0: # %entry
1357 ; ZICOND-NEXT:    bnez a2, .LBB31_2
1358 ; ZICOND-NEXT:  # %bb.1: # %entry
1359 ; ZICOND-NEXT:    slliw a1, a0, 3
1360 ; ZICOND-NEXT:  .LBB31_2: # %entry
1361 ; ZICOND-NEXT:    mv a0, a1
1362 ; ZICOND-NEXT:    ret
1364 ; RV32SFB-LABEL: select_slliw:
1365 ; RV32SFB:       # %bb.0: # %entry
1366 ; RV32SFB-NEXT:    bnez a2, .LBB31_2
1367 ; RV32SFB-NEXT:  # %bb.1: # %entry
1368 ; RV32SFB-NEXT:    slli a1, a0, 3
1369 ; RV32SFB-NEXT:  .LBB31_2: # %entry
1370 ; RV32SFB-NEXT:    mv a0, a1
1371 ; RV32SFB-NEXT:    ret
1372 entry:
1373  %0 = shl i32 %A, 3
1374  %1 = select i1 %cond, i32 %C, i32 %0
1375  ret i32 %1
1378 define i32 @select_srliw(i32 %A, i32 %C, i1 zeroext %cond) {
1379 ; NOSFB-LABEL: select_srliw:
1380 ; NOSFB:       # %bb.0: # %entry
1381 ; NOSFB-NEXT:    bnez a2, .LBB32_2
1382 ; NOSFB-NEXT:  # %bb.1: # %entry
1383 ; NOSFB-NEXT:    srliw a1, a0, 17
1384 ; NOSFB-NEXT:  .LBB32_2: # %entry
1385 ; NOSFB-NEXT:    mv a0, a1
1386 ; NOSFB-NEXT:    ret
1388 ; RV64SFB-LABEL: select_srliw:
1389 ; RV64SFB:       # %bb.0: # %entry
1390 ; RV64SFB-NEXT:    bnez a2, .LBB32_2
1391 ; RV64SFB-NEXT:  # %bb.1: # %entry
1392 ; RV64SFB-NEXT:    srliw a1, a0, 17
1393 ; RV64SFB-NEXT:  .LBB32_2: # %entry
1394 ; RV64SFB-NEXT:    mv a0, a1
1395 ; RV64SFB-NEXT:    ret
1397 ; ZICOND-LABEL: select_srliw:
1398 ; ZICOND:       # %bb.0: # %entry
1399 ; ZICOND-NEXT:    bnez a2, .LBB32_2
1400 ; ZICOND-NEXT:  # %bb.1: # %entry
1401 ; ZICOND-NEXT:    srliw a1, a0, 17
1402 ; ZICOND-NEXT:  .LBB32_2: # %entry
1403 ; ZICOND-NEXT:    mv a0, a1
1404 ; ZICOND-NEXT:    ret
1406 ; RV32SFB-LABEL: select_srliw:
1407 ; RV32SFB:       # %bb.0: # %entry
1408 ; RV32SFB-NEXT:    bnez a2, .LBB32_2
1409 ; RV32SFB-NEXT:  # %bb.1: # %entry
1410 ; RV32SFB-NEXT:    srli a1, a0, 17
1411 ; RV32SFB-NEXT:  .LBB32_2: # %entry
1412 ; RV32SFB-NEXT:    mv a0, a1
1413 ; RV32SFB-NEXT:    ret
1414 entry:
1415  %0 = lshr i32 %A, 17
1416  %1 = select i1 %cond, i32 %C, i32 %0
1417  ret i32 %1
1420 define i32 @select_sraiw(i32 %A, i32 %C, i1 zeroext %cond) {
1421 ; NOSFB-LABEL: select_sraiw:
1422 ; NOSFB:       # %bb.0: # %entry
1423 ; NOSFB-NEXT:    bnez a2, .LBB33_2
1424 ; NOSFB-NEXT:  # %bb.1: # %entry
1425 ; NOSFB-NEXT:    sraiw a1, a0, 31
1426 ; NOSFB-NEXT:  .LBB33_2: # %entry
1427 ; NOSFB-NEXT:    mv a0, a1
1428 ; NOSFB-NEXT:    ret
1430 ; RV64SFB-LABEL: select_sraiw:
1431 ; RV64SFB:       # %bb.0: # %entry
1432 ; RV64SFB-NEXT:    bnez a2, .LBB33_2
1433 ; RV64SFB-NEXT:  # %bb.1: # %entry
1434 ; RV64SFB-NEXT:    sraiw a1, a0, 31
1435 ; RV64SFB-NEXT:  .LBB33_2: # %entry
1436 ; RV64SFB-NEXT:    mv a0, a1
1437 ; RV64SFB-NEXT:    ret
1439 ; ZICOND-LABEL: select_sraiw:
1440 ; ZICOND:       # %bb.0: # %entry
1441 ; ZICOND-NEXT:    bnez a2, .LBB33_2
1442 ; ZICOND-NEXT:  # %bb.1: # %entry
1443 ; ZICOND-NEXT:    sraiw a1, a0, 31
1444 ; ZICOND-NEXT:  .LBB33_2: # %entry
1445 ; ZICOND-NEXT:    mv a0, a1
1446 ; ZICOND-NEXT:    ret
1448 ; RV32SFB-LABEL: select_sraiw:
1449 ; RV32SFB:       # %bb.0: # %entry
1450 ; RV32SFB-NEXT:    bnez a2, .LBB33_2
1451 ; RV32SFB-NEXT:  # %bb.1: # %entry
1452 ; RV32SFB-NEXT:    srai a1, a0, 31
1453 ; RV32SFB-NEXT:  .LBB33_2: # %entry
1454 ; RV32SFB-NEXT:    mv a0, a1
1455 ; RV32SFB-NEXT:    ret
1456 entry:
1457  %0 = ashr i32 %A, 31
1458  %1 = select i1 %cond, i32 %C, i32 %0
1459  ret i32 %1
1462 define signext i32 @abs_i32(i32 signext %x) {
1463 ; NOSFB-LABEL: abs_i32:
1464 ; NOSFB:       # %bb.0:
1465 ; NOSFB-NEXT:    negw a1, a0
1466 ; NOSFB-NEXT:    max a0, a0, a1
1467 ; NOSFB-NEXT:    ret
1469 ; RV64SFB-LABEL: abs_i32:
1470 ; RV64SFB:       # %bb.0:
1471 ; RV64SFB-NEXT:    bgez a0, .LBB34_2
1472 ; RV64SFB-NEXT:  # %bb.1:
1473 ; RV64SFB-NEXT:    negw a0, a0
1474 ; RV64SFB-NEXT:  .LBB34_2:
1475 ; RV64SFB-NEXT:    ret
1477 ; ZICOND-LABEL: abs_i32:
1478 ; ZICOND:       # %bb.0:
1479 ; ZICOND-NEXT:    bgez a0, .LBB34_2
1480 ; ZICOND-NEXT:  # %bb.1:
1481 ; ZICOND-NEXT:    negw a0, a0
1482 ; ZICOND-NEXT:  .LBB34_2:
1483 ; ZICOND-NEXT:    ret
1485 ; RV32SFB-LABEL: abs_i32:
1486 ; RV32SFB:       # %bb.0:
1487 ; RV32SFB-NEXT:    bgez a0, .LBB34_2
1488 ; RV32SFB-NEXT:  # %bb.1:
1489 ; RV32SFB-NEXT:    neg a0, a0
1490 ; RV32SFB-NEXT:  .LBB34_2:
1491 ; RV32SFB-NEXT:    ret
1492   %a = call i32 @llvm.abs.i32(i32 %x, i1 false)
1493   ret i32 %a
1495 declare i32 @llvm.abs.i32(i32, i1)
1497 define i64 @abs_i64(i64 %x) {
1498 ; NOSFB-LABEL: abs_i64:
1499 ; NOSFB:       # %bb.0:
1500 ; NOSFB-NEXT:    neg a1, a0
1501 ; NOSFB-NEXT:    max a0, a0, a1
1502 ; NOSFB-NEXT:    ret
1504 ; RV64SFB-LABEL: abs_i64:
1505 ; RV64SFB:       # %bb.0:
1506 ; RV64SFB-NEXT:    bgez a0, .LBB35_2
1507 ; RV64SFB-NEXT:  # %bb.1:
1508 ; RV64SFB-NEXT:    neg a0, a0
1509 ; RV64SFB-NEXT:  .LBB35_2:
1510 ; RV64SFB-NEXT:    ret
1512 ; ZICOND-LABEL: abs_i64:
1513 ; ZICOND:       # %bb.0:
1514 ; ZICOND-NEXT:    bgez a0, .LBB35_2
1515 ; ZICOND-NEXT:  # %bb.1:
1516 ; ZICOND-NEXT:    neg a0, a0
1517 ; ZICOND-NEXT:  .LBB35_2:
1518 ; ZICOND-NEXT:    ret
1520 ; RV32SFB-LABEL: abs_i64:
1521 ; RV32SFB:       # %bb.0:
1522 ; RV32SFB-NEXT:    snez a2, a0
1523 ; RV32SFB-NEXT:    add a2, a2, a1
1524 ; RV32SFB-NEXT:    bgez a1, .LBB35_2
1525 ; RV32SFB-NEXT:  # %bb.1:
1526 ; RV32SFB-NEXT:    neg a0, a0
1527 ; RV32SFB-NEXT:  .LBB35_2:
1528 ; RV32SFB-NEXT:    bgez a1, .LBB35_4
1529 ; RV32SFB-NEXT:  # %bb.3:
1530 ; RV32SFB-NEXT:    neg a1, a2
1531 ; RV32SFB-NEXT:  .LBB35_4:
1532 ; RV32SFB-NEXT:    ret
1533   %a = call i64 @llvm.abs.i64(i64 %x, i1 false)
1534   ret i64 %a
1536 declare i64 @llvm.abs.i64(i64, i1)
1538 define i64 @select_andn(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) {
1539 ; NOSFB-LABEL: select_andn:
1540 ; NOSFB:       # %bb.0: # %entry
1541 ; NOSFB-NEXT:    bnez a3, .LBB36_2
1542 ; NOSFB-NEXT:  # %bb.1: # %entry
1543 ; NOSFB-NEXT:    andn a2, a0, a1
1544 ; NOSFB-NEXT:  .LBB36_2: # %entry
1545 ; NOSFB-NEXT:    mv a0, a2
1546 ; NOSFB-NEXT:    ret
1548 ; RV64SFB-LABEL: select_andn:
1549 ; RV64SFB:       # %bb.0: # %entry
1550 ; RV64SFB-NEXT:    bnez a3, .LBB36_2
1551 ; RV64SFB-NEXT:  # %bb.1: # %entry
1552 ; RV64SFB-NEXT:    andn a2, a0, a1
1553 ; RV64SFB-NEXT:  .LBB36_2: # %entry
1554 ; RV64SFB-NEXT:    mv a0, a2
1555 ; RV64SFB-NEXT:    ret
1557 ; ZICOND-LABEL: select_andn:
1558 ; ZICOND:       # %bb.0: # %entry
1559 ; ZICOND-NEXT:    bnez a3, .LBB36_2
1560 ; ZICOND-NEXT:  # %bb.1: # %entry
1561 ; ZICOND-NEXT:    andn a2, a0, a1
1562 ; ZICOND-NEXT:  .LBB36_2: # %entry
1563 ; ZICOND-NEXT:    mv a0, a2
1564 ; ZICOND-NEXT:    ret
1566 ; RV32SFB-LABEL: select_andn:
1567 ; RV32SFB:       # %bb.0: # %entry
1568 ; RV32SFB-NEXT:    bnez a6, .LBB36_2
1569 ; RV32SFB-NEXT:  # %bb.1: # %entry
1570 ; RV32SFB-NEXT:    andn a5, a1, a3
1571 ; RV32SFB-NEXT:  .LBB36_2: # %entry
1572 ; RV32SFB-NEXT:    bnez a6, .LBB36_4
1573 ; RV32SFB-NEXT:  # %bb.3: # %entry
1574 ; RV32SFB-NEXT:    andn a4, a0, a2
1575 ; RV32SFB-NEXT:  .LBB36_4: # %entry
1576 ; RV32SFB-NEXT:    mv a0, a4
1577 ; RV32SFB-NEXT:    mv a1, a5
1578 ; RV32SFB-NEXT:    ret
1579 entry:
1580  %0 = xor i64 %B, -1
1581  %1 = and i64 %A, %0
1582  %2 = select i1 %cond, i64 %C, i64 %1
1583  ret i64 %2
1586 define i64 @select_orn(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) {
1587 ; NOSFB-LABEL: select_orn:
1588 ; NOSFB:       # %bb.0: # %entry
1589 ; NOSFB-NEXT:    bnez a3, .LBB37_2
1590 ; NOSFB-NEXT:  # %bb.1: # %entry
1591 ; NOSFB-NEXT:    orn a2, a0, a1
1592 ; NOSFB-NEXT:  .LBB37_2: # %entry
1593 ; NOSFB-NEXT:    mv a0, a2
1594 ; NOSFB-NEXT:    ret
1596 ; RV64SFB-LABEL: select_orn:
1597 ; RV64SFB:       # %bb.0: # %entry
1598 ; RV64SFB-NEXT:    bnez a3, .LBB37_2
1599 ; RV64SFB-NEXT:  # %bb.1: # %entry
1600 ; RV64SFB-NEXT:    orn a2, a0, a1
1601 ; RV64SFB-NEXT:  .LBB37_2: # %entry
1602 ; RV64SFB-NEXT:    mv a0, a2
1603 ; RV64SFB-NEXT:    ret
1605 ; ZICOND-LABEL: select_orn:
1606 ; ZICOND:       # %bb.0: # %entry
1607 ; ZICOND-NEXT:    bnez a3, .LBB37_2
1608 ; ZICOND-NEXT:  # %bb.1: # %entry
1609 ; ZICOND-NEXT:    orn a2, a0, a1
1610 ; ZICOND-NEXT:  .LBB37_2: # %entry
1611 ; ZICOND-NEXT:    mv a0, a2
1612 ; ZICOND-NEXT:    ret
1614 ; RV32SFB-LABEL: select_orn:
1615 ; RV32SFB:       # %bb.0: # %entry
1616 ; RV32SFB-NEXT:    bnez a6, .LBB37_2
1617 ; RV32SFB-NEXT:  # %bb.1: # %entry
1618 ; RV32SFB-NEXT:    orn a5, a1, a3
1619 ; RV32SFB-NEXT:  .LBB37_2: # %entry
1620 ; RV32SFB-NEXT:    bnez a6, .LBB37_4
1621 ; RV32SFB-NEXT:  # %bb.3: # %entry
1622 ; RV32SFB-NEXT:    orn a4, a0, a2
1623 ; RV32SFB-NEXT:  .LBB37_4: # %entry
1624 ; RV32SFB-NEXT:    mv a0, a4
1625 ; RV32SFB-NEXT:    mv a1, a5
1626 ; RV32SFB-NEXT:    ret
1627 entry:
1628  %0 = xor i64 %B, -1
1629  %1 = or i64 %A, %0
1630  %2 = select i1 %cond, i64 %C, i64 %1
1631  ret i64 %2
1634 define i64 @select_xnor(i64 %A, i64 %B, i64 %C, i1 zeroext %cond) {
1635 ; NOSFB-LABEL: select_xnor:
1636 ; NOSFB:       # %bb.0: # %entry
1637 ; NOSFB-NEXT:    bnez a3, .LBB38_2
1638 ; NOSFB-NEXT:  # %bb.1: # %entry
1639 ; NOSFB-NEXT:    xnor a2, a0, a1
1640 ; NOSFB-NEXT:  .LBB38_2: # %entry
1641 ; NOSFB-NEXT:    mv a0, a2
1642 ; NOSFB-NEXT:    ret
1644 ; RV64SFB-LABEL: select_xnor:
1645 ; RV64SFB:       # %bb.0: # %entry
1646 ; RV64SFB-NEXT:    bnez a3, .LBB38_2
1647 ; RV64SFB-NEXT:  # %bb.1: # %entry
1648 ; RV64SFB-NEXT:    xnor a2, a0, a1
1649 ; RV64SFB-NEXT:  .LBB38_2: # %entry
1650 ; RV64SFB-NEXT:    mv a0, a2
1651 ; RV64SFB-NEXT:    ret
1653 ; ZICOND-LABEL: select_xnor:
1654 ; ZICOND:       # %bb.0: # %entry
1655 ; ZICOND-NEXT:    bnez a3, .LBB38_2
1656 ; ZICOND-NEXT:  # %bb.1: # %entry
1657 ; ZICOND-NEXT:    xnor a2, a0, a1
1658 ; ZICOND-NEXT:  .LBB38_2: # %entry
1659 ; ZICOND-NEXT:    mv a0, a2
1660 ; ZICOND-NEXT:    ret
1662 ; RV32SFB-LABEL: select_xnor:
1663 ; RV32SFB:       # %bb.0: # %entry
1664 ; RV32SFB-NEXT:    bnez a6, .LBB38_2
1665 ; RV32SFB-NEXT:  # %bb.1: # %entry
1666 ; RV32SFB-NEXT:    xnor a5, a1, a3
1667 ; RV32SFB-NEXT:  .LBB38_2: # %entry
1668 ; RV32SFB-NEXT:    bnez a6, .LBB38_4
1669 ; RV32SFB-NEXT:  # %bb.3: # %entry
1670 ; RV32SFB-NEXT:    xnor a4, a0, a2
1671 ; RV32SFB-NEXT:  .LBB38_4: # %entry
1672 ; RV32SFB-NEXT:    mv a0, a4
1673 ; RV32SFB-NEXT:    mv a1, a5
1674 ; RV32SFB-NEXT:    ret
1675 entry:
1676  %0 = xor i64 %A, %B
1677  %1 = xor i64 %0, -1
1678  %2 = select i1 %cond, i64 %C, i64 %1
1679  ret i64 %2