xref: /llvm-project/llvm/test/CodeGen/RISCV/short-forward-branch-opt.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
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
10
11; The sifive-7-series can predicate a mv.
12
13define 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
21;
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
32}
33
34; Same as above with select operands swapped.
35define 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
44;
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
55}
56
57; Make sure we don't share the same basic block for two selects with the same
58; condition this would break the predication.
59define 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
69;
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
82;
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
95;
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
113}
114
115; Test with false value 0.
116define 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
123;
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
131;
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
139}
140
141; Same as above with select operands swapped.
142define 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
149;
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
157;
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
165}
166
167; Test with false value -1.
168define 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
175;
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
187}
188
189; Same as above with select operands swapped.
190define 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
197;
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
209}
210
211define 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
219;
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
228entry:
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
234}
235
236; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
237; icmp eq (and %cond, 1), 0
238define 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
246;
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
255entry:
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
261}
262
263define 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
271;
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
280entry:
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
286}
287
288; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
289; icmp eq (and %cond, 1), 0
290define 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
298;
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
307entry:
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
313}
314
315define 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
323;
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
332entry:
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
338}
339
340; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
341; icmp eq (and %cond, 1), 0
342define 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
350;
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
359entry:
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
365}
366
367define 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
375;
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
384entry:
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
390}
391
392; Equivalent to above, but with icmp ne (and %cond, 1), 1 instead of
393; icmp eq (and %cond, 1), 0
394define 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
402;
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
411entry:
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
417}
418
419define 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
443;
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
469;
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
495;
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
521bb:
522  %sel = select i1 %c, i32 %arg, i32 0
523  %or = or i32 %sel, %arg2
524  br label %bb2
525
526bb2:                                              ; 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
532
533bb7:                                              ; preds = %bb2
534  ret void
535}
536declare signext i32 @bar(i32 signext)
537
538define 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
562;
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
588;
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
614;
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
640bb:
641  %sel = select i1 %c, i32 %arg2, i32 0
642  %or = add i32 %sel, %arg
643  br label %bb2
644
645bb2:                                              ; 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
651
652bb7:                                              ; preds = %bb2
653  ret void
654}
655
656define 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
665;
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
674;
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
683;
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
692entry:
693 %0 = shl i32 %A, %B
694 %1 = select i1 %cond, i32 %C, i32 %0
695 ret i32 %1
696}
697
698define 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
707;
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
716;
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
725;
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
734entry:
735 %0 = lshr i32 %A, %B
736 %1 = select i1 %cond, i32 %C, i32 %0
737 ret i32 %1
738}
739
740define 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
749;
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
758;
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
767;
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
776entry:
777 %0 = ashr i32 %A, %B
778 %1 = select i1 %cond, i32 %C, i32 %0
779 ret i32 %1
780}
781
782define 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
791;
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
800;
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
809;
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
837entry:
838 %0 = shl i64 %A, %B
839 %1 = select i1 %cond, i64 %C, i64 %0
840 ret i64 %1
841}
842
843define 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
852;
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
861;
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
870;
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
898entry:
899 %0 = lshr i64 %A, %B
900 %1 = select i1 %cond, i64 %C, i64 %0
901 ret i64 %1
902}
903
904define 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
913;
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
922;
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
931;
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
959entry:
960 %0 = ashr i64 %A, %B
961 %1 = select i1 %cond, i64 %C, i64 %0
962 ret i64 %1
963}
964
965define 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
974;
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
983;
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
992;
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
1001entry:
1002 %0 = add i32 %A, 1234
1003 %1 = select i1 %cond, i32 %C, i32 %0
1004 ret i32 %1
1005}
1006
1007define 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
1016;
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
1025;
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
1034;
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
1050entry:
1051 %0 = add i64 %A, 1234
1052 %1 = select i1 %cond, i64 %C, i64 %0
1053 ret i64 %1
1054}
1055
1056define 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
1065;
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
1074;
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
1083;
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
1097entry:
1098 %0 = and i64 %A, 567
1099 %1 = select i1 %cond, i64 %C, i64 %0
1100 ret i64 %1
1101}
1102
1103define 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
1112;
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
1121;
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
1130;
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
1143entry:
1144 %0 = or i64 %A, 890
1145 %1 = select i1 %cond, i64 %C, i64 %0
1146 ret i64 %1
1147}
1148
1149define 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
1158;
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
1167;
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
1176;
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
1189entry:
1190 %0 = xor i64 %A, 321
1191 %1 = select i1 %cond, i64 %C, i64 %0
1192 ret i64 %1
1193}
1194
1195define 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
1204;
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
1213;
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
1222;
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
1236entry:
1237 %0 = shl i64 %A, 32
1238 %1 = select i1 %cond, i64 %C, i64 %0
1239 ret i64 %1
1240}
1241
1242define 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
1251;
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
1260;
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
1269;
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
1283entry:
1284 %0 = lshr i64 %A, 35
1285 %1 = select i1 %cond, i64 %C, i64 %0
1286 ret i64 %1
1287}
1288
1289define 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
1298;
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
1307;
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
1316;
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
1330entry:
1331 %0 = ashr i64 %A, 63
1332 %1 = select i1 %cond, i64 %C, i64 %0
1333 ret i64 %1
1334}
1335
1336define 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
1345;
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
1354;
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
1363;
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
1372entry:
1373 %0 = shl i32 %A, 3
1374 %1 = select i1 %cond, i32 %C, i32 %0
1375 ret i32 %1
1376}
1377
1378define 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
1387;
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
1396;
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
1405;
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
1414entry:
1415 %0 = lshr i32 %A, 17
1416 %1 = select i1 %cond, i32 %C, i32 %0
1417 ret i32 %1
1418}
1419
1420define 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
1429;
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
1438;
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
1447;
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
1456entry:
1457 %0 = ashr i32 %A, 31
1458 %1 = select i1 %cond, i32 %C, i32 %0
1459 ret i32 %1
1460}
1461
1462define 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
1468;
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
1476;
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
1484;
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
1494}
1495declare i32 @llvm.abs.i32(i32, i1)
1496
1497define 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
1503;
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
1511;
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
1519;
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
1535}
1536declare i64 @llvm.abs.i64(i64, i1)
1537
1538define 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
1547;
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
1556;
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
1565;
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
1579entry:
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
1584}
1585
1586define 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
1595;
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
1604;
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
1613;
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
1627entry:
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
1632}
1633
1634define 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
1643;
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
1652;
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
1661;
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
1675entry:
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
1680}
1681