Skip to content

Commit d701e37

Browse files
committed
[RISCV] Add test cases for failure to optimize select_cc with X < 1 or X > -1. NFC
We can use BGE with X0 to implement these, but we currently put 1 or -1 into a register.
1 parent 61f006a commit d701e37

File tree

1 file changed

+36
-9
lines changed

1 file changed

+36
-9
lines changed

llvm/test/CodeGen/RISCV/select-cc.ll

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,23 @@ define i32 @foo(i32 %a, i32 *%b) nounwind {
5252
; RV32I-NEXT: # %bb.17:
5353
; RV32I-NEXT: mv a0, a2
5454
; RV32I-NEXT: .LBB0_18:
55-
; RV32I-NEXT: lw a1, 0(a1)
56-
; RV32I-NEXT: bge a1, a0, .LBB0_20
55+
; RV32I-NEXT: lw a2, 0(a1)
56+
; RV32I-NEXT: bge a2, a0, .LBB0_20
5757
; RV32I-NEXT: # %bb.19:
58-
; RV32I-NEXT: mv a0, a1
58+
; RV32I-NEXT: mv a0, a2
5959
; RV32I-NEXT: .LBB0_20:
60+
; RV32I-NEXT: lw a2, 0(a1)
61+
; RV32I-NEXT: addi a3, zero, 1
62+
; RV32I-NEXT: blt a2, a3, .LBB0_22
63+
; RV32I-NEXT: # %bb.21:
64+
; RV32I-NEXT: mv a0, a2
65+
; RV32I-NEXT: .LBB0_22:
66+
; RV32I-NEXT: lw a1, 0(a1)
67+
; RV32I-NEXT: addi a3, zero, -1
68+
; RV32I-NEXT: blt a3, a2, .LBB0_24
69+
; RV32I-NEXT: # %bb.23:
70+
; RV32I-NEXT: mv a0, a1
71+
; RV32I-NEXT: .LBB0_24:
6072
; RV32I-NEXT: ret
6173
;
6274
; RV32IBT-LABEL: foo:
@@ -85,12 +97,19 @@ define i32 @foo(i32 %a, i32 *%b) nounwind {
8597
; RV32IBT-NEXT: cmov a0, a4, a0, a2
8698
; RV32IBT-NEXT: lw a2, 0(a1)
8799
; RV32IBT-NEXT: slt a4, a0, a3
88-
; RV32IBT-NEXT: lw a1, 0(a1)
89100
; RV32IBT-NEXT: cmov a0, a4, a3, a0
90-
; RV32IBT-NEXT: slt a3, a0, a2
91-
; RV32IBT-NEXT: cmov a0, a3, a0, a2
92-
; RV32IBT-NEXT: slt a2, a1, a0
93-
; RV32IBT-NEXT: cmov a0, a2, a1, a0
101+
; RV32IBT-NEXT: lw a3, 0(a1)
102+
; RV32IBT-NEXT: slt a4, a0, a2
103+
; RV32IBT-NEXT: lw a5, 0(a1)
104+
; RV32IBT-NEXT: cmov a0, a4, a0, a2
105+
; RV32IBT-NEXT: slt a2, a3, a0
106+
; RV32IBT-NEXT: cmov a0, a2, a3, a0
107+
; RV32IBT-NEXT: slti a2, a5, 1
108+
; RV32IBT-NEXT: lw a1, 0(a1)
109+
; RV32IBT-NEXT: cmov a0, a2, a0, a5
110+
; RV32IBT-NEXT: addi a2, zero, -1
111+
; RV32IBT-NEXT: slt a2, a2, a5
112+
; RV32IBT-NEXT: cmov a0, a2, a0, a1
94113
; RV32IBT-NEXT: ret
95114
%val1 = load volatile i32, i32* %b
96115
%tst1 = icmp eq i32 %a, %val1
@@ -132,5 +151,13 @@ define i32 @foo(i32 %a, i32 *%b) nounwind {
132151
%tst10 = icmp sle i32 %val18, %val19
133152
%val20 = select i1 %tst10, i32 %val18, i32 %val19
134153

135-
ret i32 %val20
154+
%val21 = load volatile i32, i32* %b
155+
%tst11 = icmp slt i32 %val21, 1
156+
%val22 = select i1 %tst11, i32 %val20, i32 %val21
157+
158+
%val23 = load volatile i32, i32* %b
159+
%tst12 = icmp sgt i32 %val21, -1
160+
%val24 = select i1 %tst12, i32 %val22, i32 %val23
161+
162+
ret i32 %val24
136163
}

0 commit comments

Comments
 (0)