Skip to content

Commit 811880a

Browse files
authored
[RISCV] Use SLLI/ADDI to when materializing select of constants (#155644)
This avoids the need to materialize the difference explicitly, and thus reduces register pressure when the condition val is otherwise unused.
1 parent 753eddd commit 811880a

File tree

3 files changed

+57
-41
lines changed

3 files changed

+57
-41
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9287,6 +9287,14 @@ SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
92879287
}
92889288
}
92899289

9290+
// Use SHL/ADDI to avoid having to materialize a constant in register
9291+
// TODO: Handle the inverse case when the condition can be cheaply flipped
9292+
if ((TrueVal - FalseVal).isPowerOf2() && FalseVal.isSignedIntN(12)) {
9293+
SDValue Log2 = DAG.getConstant((TrueVal - FalseVal).logBase2(), DL, VT);
9294+
SDValue BitDiff = DAG.getNode(ISD::SHL, DL, VT, CondV, Log2);
9295+
return DAG.getNode(ISD::ADD, DL, VT, FalseV, BitDiff);
9296+
}
9297+
92909298
auto getCost = [&](const APInt &Delta, const APInt &Addend) {
92919299
const int DeltaCost = RISCVMatInt::getIntMatCost(
92929300
Delta, Subtarget.getXLen(), Subtarget, /*CompressionCost=*/true);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -701,8 +701,8 @@ define i32 @diff_shl_addi2(i32 signext %x) {
701701
; RV32ZICOND-LABEL: diff_shl_addi2:
702702
; RV32ZICOND: # %bb.0:
703703
; RV32ZICOND-NEXT: srli a0, a0, 31
704-
; RV32ZICOND-NEXT: lui a1, 4
705-
; RV32ZICOND-NEXT: czero.nez a0, a1, a0
704+
; RV32ZICOND-NEXT: xori a0, a0, 1
705+
; RV32ZICOND-NEXT: slli a0, a0, 14
706706
; RV32ZICOND-NEXT: addi a0, a0, 25
707707
; RV32ZICOND-NEXT: ret
708708
;
@@ -731,8 +731,8 @@ define i32 @diff_shl_addi2(i32 signext %x) {
731731
; RV64ZICOND-LABEL: diff_shl_addi2:
732732
; RV64ZICOND: # %bb.0:
733733
; RV64ZICOND-NEXT: srli a0, a0, 63
734-
; RV64ZICOND-NEXT: lui a1, 4
735-
; RV64ZICOND-NEXT: czero.nez a0, a1, a0
734+
; RV64ZICOND-NEXT: xori a0, a0, 1
735+
; RV64ZICOND-NEXT: slli a0, a0, 14
736736
; RV64ZICOND-NEXT: addiw a0, a0, 25
737737
; RV64ZICOND-NEXT: ret
738738
%cmp = icmp sgt i32 %x, -1

llvm/test/CodeGen/RISCV/select.ll

Lines changed: 45 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,15 +1790,13 @@ define i32 @select_cst5_invert(i1 zeroext %cond) {
17901790
;
17911791
; RV64IMXVTCONDOPS-LABEL: select_cst5_invert:
17921792
; RV64IMXVTCONDOPS: # %bb.0:
1793-
; RV64IMXVTCONDOPS-NEXT: li a1, 2
1794-
; RV64IMXVTCONDOPS-NEXT: vt.maskc a0, a1, a0
1793+
; RV64IMXVTCONDOPS-NEXT: slli a0, a0, 1
17951794
; RV64IMXVTCONDOPS-NEXT: addi a0, a0, 2047
17961795
; RV64IMXVTCONDOPS-NEXT: ret
17971796
;
17981797
; CHECKZICOND-LABEL: select_cst5_invert:
17991798
; CHECKZICOND: # %bb.0:
1800-
; CHECKZICOND-NEXT: li a1, 2
1801-
; CHECKZICOND-NEXT: czero.eqz a0, a1, a0
1799+
; CHECKZICOND-NEXT: slli a0, a0, 1
18021800
; CHECKZICOND-NEXT: addi a0, a0, 2047
18031801
; CHECKZICOND-NEXT: ret
18041802
%ret = select i1 %cond, i32 2049, i32 2047
@@ -1873,17 +1871,21 @@ define i32 @select_cst_diff2_invert(i1 zeroext %cond) {
18731871
;
18741872
; RV64IMXVTCONDOPS-LABEL: select_cst_diff2_invert:
18751873
; RV64IMXVTCONDOPS: # %bb.0:
1876-
; RV64IMXVTCONDOPS-NEXT: li a1, -2
1877-
; RV64IMXVTCONDOPS-NEXT: vt.maskcn a0, a1, a0
1878-
; RV64IMXVTCONDOPS-NEXT: addi a0, a0, 122
1874+
; RV64IMXVTCONDOPS-NEXT: slli a0, a0, 1
1875+
; RV64IMXVTCONDOPS-NEXT: addiw a0, a0, 120
18791876
; RV64IMXVTCONDOPS-NEXT: ret
18801877
;
1881-
; CHECKZICOND-LABEL: select_cst_diff2_invert:
1882-
; CHECKZICOND: # %bb.0:
1883-
; CHECKZICOND-NEXT: li a1, -2
1884-
; CHECKZICOND-NEXT: czero.nez a0, a1, a0
1885-
; CHECKZICOND-NEXT: addi a0, a0, 122
1886-
; CHECKZICOND-NEXT: ret
1878+
; RV32IMZICOND-LABEL: select_cst_diff2_invert:
1879+
; RV32IMZICOND: # %bb.0:
1880+
; RV32IMZICOND-NEXT: slli a0, a0, 1
1881+
; RV32IMZICOND-NEXT: addi a0, a0, 120
1882+
; RV32IMZICOND-NEXT: ret
1883+
;
1884+
; RV64IMZICOND-LABEL: select_cst_diff2_invert:
1885+
; RV64IMZICOND: # %bb.0:
1886+
; RV64IMZICOND-NEXT: slli a0, a0, 1
1887+
; RV64IMZICOND-NEXT: addiw a0, a0, 120
1888+
; RV64IMZICOND-NEXT: ret
18871889
%ret = select i1 %cond, i32 122, i32 120
18881890
ret i32 %ret
18891891
}
@@ -1911,16 +1913,14 @@ define i32 @select_cst_diff4(i1 zeroext %cond) {
19111913
;
19121914
; RV64IMXVTCONDOPS-LABEL: select_cst_diff4:
19131915
; RV64IMXVTCONDOPS: # %bb.0:
1914-
; RV64IMXVTCONDOPS-NEXT: li a1, -4
1915-
; RV64IMXVTCONDOPS-NEXT: vt.maskcn a0, a1, a0
1916-
; RV64IMXVTCONDOPS-NEXT: addi a0, a0, 10
1916+
; RV64IMXVTCONDOPS-NEXT: slli a0, a0, 2
1917+
; RV64IMXVTCONDOPS-NEXT: addi a0, a0, 6
19171918
; RV64IMXVTCONDOPS-NEXT: ret
19181919
;
19191920
; CHECKZICOND-LABEL: select_cst_diff4:
19201921
; CHECKZICOND: # %bb.0:
1921-
; CHECKZICOND-NEXT: li a1, -4
1922-
; CHECKZICOND-NEXT: czero.nez a0, a1, a0
1923-
; CHECKZICOND-NEXT: addi a0, a0, 10
1922+
; CHECKZICOND-NEXT: slli a0, a0, 2
1923+
; CHECKZICOND-NEXT: addi a0, a0, 6
19241924
; CHECKZICOND-NEXT: ret
19251925
%ret = select i1 %cond, i32 10, i32 6
19261926
ret i32 %ret
@@ -1987,17 +1987,21 @@ define i32 @select_cst_diff8(i1 zeroext %cond) {
19871987
;
19881988
; RV64IMXVTCONDOPS-LABEL: select_cst_diff8:
19891989
; RV64IMXVTCONDOPS: # %bb.0:
1990-
; RV64IMXVTCONDOPS-NEXT: li a1, -8
1991-
; RV64IMXVTCONDOPS-NEXT: vt.maskcn a0, a1, a0
1992-
; RV64IMXVTCONDOPS-NEXT: addi a0, a0, 14
1990+
; RV64IMXVTCONDOPS-NEXT: slli a0, a0, 3
1991+
; RV64IMXVTCONDOPS-NEXT: addiw a0, a0, 6
19931992
; RV64IMXVTCONDOPS-NEXT: ret
19941993
;
1995-
; CHECKZICOND-LABEL: select_cst_diff8:
1996-
; CHECKZICOND: # %bb.0:
1997-
; CHECKZICOND-NEXT: li a1, -8
1998-
; CHECKZICOND-NEXT: czero.nez a0, a1, a0
1999-
; CHECKZICOND-NEXT: addi a0, a0, 14
2000-
; CHECKZICOND-NEXT: ret
1994+
; RV32IMZICOND-LABEL: select_cst_diff8:
1995+
; RV32IMZICOND: # %bb.0:
1996+
; RV32IMZICOND-NEXT: slli a0, a0, 3
1997+
; RV32IMZICOND-NEXT: addi a0, a0, 6
1998+
; RV32IMZICOND-NEXT: ret
1999+
;
2000+
; RV64IMZICOND-LABEL: select_cst_diff8:
2001+
; RV64IMZICOND: # %bb.0:
2002+
; RV64IMZICOND-NEXT: slli a0, a0, 3
2003+
; RV64IMZICOND-NEXT: addiw a0, a0, 6
2004+
; RV64IMZICOND-NEXT: ret
20012005
%ret = select i1 %cond, i32 14, i32 6
20022006
ret i32 %ret
20032007
}
@@ -2071,17 +2075,21 @@ define i32 @select_cst_diff1024(i1 zeroext %cond) {
20712075
;
20722076
; RV64IMXVTCONDOPS-LABEL: select_cst_diff1024:
20732077
; RV64IMXVTCONDOPS: # %bb.0:
2074-
; RV64IMXVTCONDOPS-NEXT: li a1, -1024
2075-
; RV64IMXVTCONDOPS-NEXT: vt.maskcn a0, a1, a0
2076-
; RV64IMXVTCONDOPS-NEXT: addi a0, a0, 1030
2078+
; RV64IMXVTCONDOPS-NEXT: slli a0, a0, 10
2079+
; RV64IMXVTCONDOPS-NEXT: addiw a0, a0, 6
20772080
; RV64IMXVTCONDOPS-NEXT: ret
20782081
;
2079-
; CHECKZICOND-LABEL: select_cst_diff1024:
2080-
; CHECKZICOND: # %bb.0:
2081-
; CHECKZICOND-NEXT: li a1, -1024
2082-
; CHECKZICOND-NEXT: czero.nez a0, a1, a0
2083-
; CHECKZICOND-NEXT: addi a0, a0, 1030
2084-
; CHECKZICOND-NEXT: ret
2082+
; RV32IMZICOND-LABEL: select_cst_diff1024:
2083+
; RV32IMZICOND: # %bb.0:
2084+
; RV32IMZICOND-NEXT: slli a0, a0, 10
2085+
; RV32IMZICOND-NEXT: addi a0, a0, 6
2086+
; RV32IMZICOND-NEXT: ret
2087+
;
2088+
; RV64IMZICOND-LABEL: select_cst_diff1024:
2089+
; RV64IMZICOND: # %bb.0:
2090+
; RV64IMZICOND-NEXT: slli a0, a0, 10
2091+
; RV64IMZICOND-NEXT: addiw a0, a0, 6
2092+
; RV64IMZICOND-NEXT: ret
20852093
%ret = select i1 %cond, i32 1030, i32 6
20862094
ret i32 %ret
20872095
}

0 commit comments

Comments
 (0)