11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
22; RUN: llc -mtriple=riscv64 -mattr=+c -verify-machineinstrs < %s \
33; RUN: | FileCheck -check-prefix=NOSFB %s
4+ ; RUN: llc -mtriple=riscv64 -mattr=+c,+short-forward-branch-opt -verify-machineinstrs < %s \
5+ ; RUN: | FileCheck -check-prefix=SFB %s
46
57; The sifive-7-series can predicate a mv.
68
@@ -12,6 +14,14 @@ define signext i32 @test1(i32 signext %x, i32 signext %y, i32 signext %z) {
1214; NOSFB-NEXT: mv a0, a1
1315; NOSFB-NEXT: .LBB0_2:
1416; NOSFB-NEXT: ret
17+ ;
18+ ; SFB-LABEL: test1:
19+ ; SFB: # %bb.0:
20+ ; SFB-NEXT: beqz a2, .LBB0_2
21+ ; SFB-NEXT: # %bb.1:
22+ ; SFB-NEXT: mv a0, a1
23+ ; SFB-NEXT: .LBB0_2:
24+ ; SFB-NEXT: ret
1525 %c = icmp eq i32 %z , 0
1626 %b = select i1 %c , i32 %x , i32 %y
1727 ret i32 %b
@@ -27,6 +37,14 @@ define signext i32 @test2(i32 signext %x, i32 signext %y, i32 signext %z) {
2737; NOSFB-NEXT: .LBB1_2:
2838; NOSFB-NEXT: mv a0, a1
2939; NOSFB-NEXT: ret
40+ ;
41+ ; SFB-LABEL: test2:
42+ ; SFB: # %bb.0:
43+ ; SFB-NEXT: bnez a2, .LBB1_2
44+ ; SFB-NEXT: # %bb.1:
45+ ; SFB-NEXT: mv a0, a1
46+ ; SFB-NEXT: .LBB1_2:
47+ ; SFB-NEXT: ret
3048 %c = icmp eq i32 %z , 0
3149 %b = select i1 %c , i32 %y , i32 %x
3250 ret i32 %b
@@ -44,6 +62,19 @@ define signext i32 @test3(i32 signext %v, i32 signext %w, i32 signext %x, i32 si
4462; NOSFB-NEXT: .LBB2_2:
4563; NOSFB-NEXT: addw a0, a1, a2
4664; NOSFB-NEXT: ret
65+ ;
66+ ; SFB-LABEL: test3:
67+ ; SFB: # %bb.0:
68+ ; SFB-NEXT: beqz a4, .LBB2_2
69+ ; SFB-NEXT: # %bb.1:
70+ ; SFB-NEXT: mv a2, a3
71+ ; SFB-NEXT: .LBB2_2:
72+ ; SFB-NEXT: bnez a4, .LBB2_4
73+ ; SFB-NEXT: # %bb.3:
74+ ; SFB-NEXT: mv a0, a1
75+ ; SFB-NEXT: .LBB2_4:
76+ ; SFB-NEXT: addw a0, a0, a2
77+ ; SFB-NEXT: ret
4778 %c = icmp eq i32 %z , 0
4879 %a = select i1 %c , i32 %w , i32 %v
4980 %b = select i1 %c , i32 %x , i32 %y
@@ -59,6 +90,14 @@ define signext i32 @test4(i32 signext %x, i32 signext %z) {
5990; NOSFB-NEXT: addi a1, a1, -1
6091; NOSFB-NEXT: and a0, a0, a1
6192; NOSFB-NEXT: ret
93+ ;
94+ ; SFB-LABEL: test4:
95+ ; SFB: # %bb.0:
96+ ; SFB-NEXT: beqz a1, .LBB3_2
97+ ; SFB-NEXT: # %bb.1:
98+ ; SFB-NEXT: li a0, 0
99+ ; SFB-NEXT: .LBB3_2:
100+ ; SFB-NEXT: ret
62101 %c = icmp eq i32 %z , 0
63102 %b = select i1 %c , i32 %x , i32 0
64103 ret i32 %b
@@ -72,6 +111,14 @@ define signext i32 @test5(i32 signext %x, i32 signext %z) {
72111; NOSFB-NEXT: addi a1, a1, -1
73112; NOSFB-NEXT: and a0, a0, a1
74113; NOSFB-NEXT: ret
114+ ;
115+ ; SFB-LABEL: test5:
116+ ; SFB: # %bb.0:
117+ ; SFB-NEXT: bnez a1, .LBB4_2
118+ ; SFB-NEXT: # %bb.1:
119+ ; SFB-NEXT: li a0, 0
120+ ; SFB-NEXT: .LBB4_2:
121+ ; SFB-NEXT: ret
75122 %c = icmp eq i32 %z , 0
76123 %b = select i1 %c , i32 0 , i32 %x
77124 ret i32 %b
@@ -85,6 +132,15 @@ define signext i32 @test6(i32 signext %x, i32 signext %z) {
85132; NOSFB-NEXT: addi a1, a1, -1
86133; NOSFB-NEXT: or a0, a0, a1
87134; NOSFB-NEXT: ret
135+ ;
136+ ; SFB-LABEL: test6:
137+ ; SFB: # %bb.0:
138+ ; SFB-NEXT: li a2, -1
139+ ; SFB-NEXT: beqz a1, .LBB5_2
140+ ; SFB-NEXT: # %bb.1:
141+ ; SFB-NEXT: mv a0, a2
142+ ; SFB-NEXT: .LBB5_2:
143+ ; SFB-NEXT: ret
88144 %c = icmp eq i32 %z , 0
89145 %b = select i1 %c , i32 %x , i32 -1
90146 ret i32 %b
@@ -98,6 +154,15 @@ define signext i32 @test7(i32 signext %x, i32 signext %z) {
98154; NOSFB-NEXT: addi a1, a1, -1
99155; NOSFB-NEXT: or a0, a0, a1
100156; NOSFB-NEXT: ret
157+ ;
158+ ; SFB-LABEL: test7:
159+ ; SFB: # %bb.0:
160+ ; SFB-NEXT: li a2, -1
161+ ; SFB-NEXT: bnez a1, .LBB6_2
162+ ; SFB-NEXT: # %bb.1:
163+ ; SFB-NEXT: mv a0, a2
164+ ; SFB-NEXT: .LBB6_2:
165+ ; SFB-NEXT: ret
101166 %c = icmp eq i32 %z , 0
102167 %b = select i1 %c , i32 -1 , i32 %x
103168 ret i32 %b
@@ -111,6 +176,16 @@ define i16 @select_xor_1(i16 %A, i8 %cond) {
111176; NOSFB-NEXT: andi a1, a1, 43
112177; NOSFB-NEXT: xor a0, a0, a1
113178; NOSFB-NEXT: ret
179+ ;
180+ ; SFB-LABEL: select_xor_1:
181+ ; SFB: # %bb.0: # %entry
182+ ; SFB-NEXT: xori a2, a0, 43
183+ ; SFB-NEXT: andi a1, a1, 1
184+ ; SFB-NEXT: beqz a1, .LBB7_2
185+ ; SFB-NEXT: # %bb.1: # %entry
186+ ; SFB-NEXT: mv a0, a2
187+ ; SFB-NEXT: .LBB7_2: # %entry
188+ ; SFB-NEXT: ret
114189entry:
115190 %and = and i8 %cond , 1
116191 %cmp10 = icmp eq i8 %and , 0
@@ -129,6 +204,16 @@ define i16 @select_xor_1b(i16 %A, i8 %cond) {
129204; NOSFB-NEXT: andi a1, a1, 43
130205; NOSFB-NEXT: xor a0, a0, a1
131206; NOSFB-NEXT: ret
207+ ;
208+ ; SFB-LABEL: select_xor_1b:
209+ ; SFB: # %bb.0: # %entry
210+ ; SFB-NEXT: xori a2, a0, 43
211+ ; SFB-NEXT: andi a1, a1, 1
212+ ; SFB-NEXT: beqz a1, .LBB8_2
213+ ; SFB-NEXT: # %bb.1: # %entry
214+ ; SFB-NEXT: mv a0, a2
215+ ; SFB-NEXT: .LBB8_2: # %entry
216+ ; SFB-NEXT: ret
132217entry:
133218 %and = and i8 %cond , 1
134219 %cmp10 = icmp ne i8 %and , 1
@@ -145,6 +230,15 @@ define i32 @select_xor_2(i32 %A, i32 %B, i8 %cond) {
145230; NOSFB-NEXT: and a1, a1, a2
146231; NOSFB-NEXT: xor a0, a0, a1
147232; NOSFB-NEXT: ret
233+ ;
234+ ; SFB-LABEL: select_xor_2:
235+ ; SFB: # %bb.0: # %entry
236+ ; SFB-NEXT: andi a2, a2, 1
237+ ; SFB-NEXT: beqz a2, .LBB9_2
238+ ; SFB-NEXT: # %bb.1: # %entry
239+ ; SFB-NEXT: xor a0, a0, a1
240+ ; SFB-NEXT: .LBB9_2: # %entry
241+ ; SFB-NEXT: ret
148242entry:
149243 %and = and i8 %cond , 1
150244 %cmp10 = icmp eq i8 %and , 0
@@ -163,6 +257,15 @@ define i32 @select_xor_2b(i32 %A, i32 %B, i8 %cond) {
163257; NOSFB-NEXT: and a1, a1, a2
164258; NOSFB-NEXT: xor a0, a0, a1
165259; NOSFB-NEXT: ret
260+ ;
261+ ; SFB-LABEL: select_xor_2b:
262+ ; SFB: # %bb.0: # %entry
263+ ; SFB-NEXT: andi a2, a2, 1
264+ ; SFB-NEXT: beqz a2, .LBB10_2
265+ ; SFB-NEXT: # %bb.1: # %entry
266+ ; SFB-NEXT: xor a0, a0, a1
267+ ; SFB-NEXT: .LBB10_2: # %entry
268+ ; SFB-NEXT: ret
166269entry:
167270 %and = and i8 %cond , 1
168271 %cmp10 = icmp ne i8 %and , 1
@@ -179,6 +282,15 @@ define i32 @select_or(i32 %A, i32 %B, i8 %cond) {
179282; NOSFB-NEXT: and a1, a1, a2
180283; NOSFB-NEXT: or a0, a0, a1
181284; NOSFB-NEXT: ret
285+ ;
286+ ; SFB-LABEL: select_or:
287+ ; SFB: # %bb.0: # %entry
288+ ; SFB-NEXT: andi a2, a2, 1
289+ ; SFB-NEXT: beqz a2, .LBB11_2
290+ ; SFB-NEXT: # %bb.1: # %entry
291+ ; SFB-NEXT: or a0, a0, a1
292+ ; SFB-NEXT: .LBB11_2: # %entry
293+ ; SFB-NEXT: ret
182294entry:
183295 %and = and i8 %cond , 1
184296 %cmp10 = icmp eq i8 %and , 0
@@ -197,6 +309,15 @@ define i32 @select_or_b(i32 %A, i32 %B, i8 %cond) {
197309; NOSFB-NEXT: and a1, a1, a2
198310; NOSFB-NEXT: or a0, a0, a1
199311; NOSFB-NEXT: ret
312+ ;
313+ ; SFB-LABEL: select_or_b:
314+ ; SFB: # %bb.0: # %entry
315+ ; SFB-NEXT: andi a2, a2, 1
316+ ; SFB-NEXT: beqz a2, .LBB12_2
317+ ; SFB-NEXT: # %bb.1: # %entry
318+ ; SFB-NEXT: or a0, a0, a1
319+ ; SFB-NEXT: .LBB12_2: # %entry
320+ ; SFB-NEXT: ret
200321entry:
201322 %and = and i8 %cond , 1
202323 %cmp10 = icmp ne i8 %and , 1
@@ -213,6 +334,15 @@ define i32 @select_or_1(i32 %A, i32 %B, i32 %cond) {
213334; NOSFB-NEXT: and a1, a1, a2
214335; NOSFB-NEXT: or a0, a0, a1
215336; NOSFB-NEXT: ret
337+ ;
338+ ; SFB-LABEL: select_or_1:
339+ ; SFB: # %bb.0: # %entry
340+ ; SFB-NEXT: andi a2, a2, 1
341+ ; SFB-NEXT: beqz a2, .LBB13_2
342+ ; SFB-NEXT: # %bb.1: # %entry
343+ ; SFB-NEXT: or a0, a0, a1
344+ ; SFB-NEXT: .LBB13_2: # %entry
345+ ; SFB-NEXT: ret
216346entry:
217347 %and = and i32 %cond , 1
218348 %cmp10 = icmp eq i32 %and , 0
@@ -231,6 +361,15 @@ define i32 @select_or_1b(i32 %A, i32 %B, i32 %cond) {
231361; NOSFB-NEXT: and a1, a1, a2
232362; NOSFB-NEXT: or a0, a0, a1
233363; NOSFB-NEXT: ret
364+ ;
365+ ; SFB-LABEL: select_or_1b:
366+ ; SFB: # %bb.0: # %entry
367+ ; SFB-NEXT: andi a2, a2, 1
368+ ; SFB-NEXT: beqz a2, .LBB14_2
369+ ; SFB-NEXT: # %bb.1: # %entry
370+ ; SFB-NEXT: or a0, a0, a1
371+ ; SFB-NEXT: .LBB14_2: # %entry
372+ ; SFB-NEXT: ret
234373entry:
235374 %and = and i32 %cond , 1
236375 %cmp10 = icmp ne i32 %and , 1
@@ -264,6 +403,32 @@ define void @sextw_removal_ccor(i1 %c, i32 signext %arg, i32 signext %arg1, i32
264403; NOSFB-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
265404; NOSFB-NEXT: addi sp, sp, 32
266405; NOSFB-NEXT: ret
406+ ;
407+ ; SFB-LABEL: sextw_removal_ccor:
408+ ; SFB: # %bb.0: # %bb
409+ ; SFB-NEXT: addi sp, sp, -32
410+ ; SFB-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
411+ ; SFB-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
412+ ; SFB-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
413+ ; SFB-NEXT: andi a0, a0, 1
414+ ; SFB-NEXT: mv s0, a2
415+ ; SFB-NEXT: beqz a0, .LBB15_4
416+ ; SFB-NEXT: # %bb.3: # %bb
417+ ; SFB-NEXT: or a3, a3, a1
418+ ; SFB-NEXT: .LBB15_4: # %bb
419+ ; SFB-NEXT: .LBB15_1: # %bb2
420+ ; SFB-NEXT: # =>This Inner Loop Header: Depth=1
421+ ; SFB-NEXT: mv a0, a3
422+ ; SFB-NEXT: sllw s1, a3, s0
423+ ; SFB-NEXT: call bar@plt
424+ ; SFB-NEXT: mv a3, s1
425+ ; SFB-NEXT: bnez a0, .LBB15_1
426+ ; SFB-NEXT: # %bb.2: # %bb7
427+ ; SFB-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
428+ ; SFB-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
429+ ; SFB-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
430+ ; SFB-NEXT: addi sp, sp, 32
431+ ; SFB-NEXT: ret
267432bb:
268433 %sel = select i1 %c , i32 %arg , i32 0
269434 %or = or i32 %sel , %arg2
@@ -306,6 +471,32 @@ define void @sextw_removal_ccaddw(i1 %c, i32 signext %arg, i32 signext %arg1, i3
306471; NOSFB-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
307472; NOSFB-NEXT: addi sp, sp, 32
308473; NOSFB-NEXT: ret
474+ ;
475+ ; SFB-LABEL: sextw_removal_ccaddw:
476+ ; SFB: # %bb.0: # %bb
477+ ; SFB-NEXT: addi sp, sp, -32
478+ ; SFB-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
479+ ; SFB-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
480+ ; SFB-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
481+ ; SFB-NEXT: andi a0, a0, 1
482+ ; SFB-NEXT: mv s0, a2
483+ ; SFB-NEXT: beqz a0, .LBB16_4
484+ ; SFB-NEXT: # %bb.3: # %bb
485+ ; SFB-NEXT: addw a1, a1, a3
486+ ; SFB-NEXT: .LBB16_4: # %bb
487+ ; SFB-NEXT: .LBB16_1: # %bb2
488+ ; SFB-NEXT: # =>This Inner Loop Header: Depth=1
489+ ; SFB-NEXT: mv a0, a1
490+ ; SFB-NEXT: sllw s1, a1, s0
491+ ; SFB-NEXT: call bar@plt
492+ ; SFB-NEXT: mv a1, s1
493+ ; SFB-NEXT: bnez a0, .LBB16_1
494+ ; SFB-NEXT: # %bb.2: # %bb7
495+ ; SFB-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
496+ ; SFB-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
497+ ; SFB-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
498+ ; SFB-NEXT: addi sp, sp, 32
499+ ; SFB-NEXT: ret
309500bb:
310501 %sel = select i1 %c , i32 %arg2 , i32 0
311502 %or = add i32 %sel , %arg
0 commit comments