Skip to content

Commit d6e3ade

Browse files
authored
[RISCV] Account for ADDI immediate range in select of two constants w/ zicond (#155471)
When choosing to materialize a select of two constants using zicond, we have a choice of which direction to compute the delta. The prior cost was looking only at the cost of the values without accounting for the fact it's actually the delta which is the highest cost and that sometimes the addend can fold into an addi.
1 parent ab3c0ca commit d6e3ade

File tree

2 files changed

+18
-13
lines changed

2 files changed

+18
-13
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9287,11 +9287,18 @@ SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
92879287
}
92889288
}
92899289

9290-
const int TrueValCost = RISCVMatInt::getIntMatCost(
9291-
TrueVal, Subtarget.getXLen(), Subtarget, /*CompressionCost=*/true);
9292-
const int FalseValCost = RISCVMatInt::getIntMatCost(
9293-
FalseVal, Subtarget.getXLen(), Subtarget, /*CompressionCost=*/true);
9294-
bool IsCZERO_NEZ = TrueValCost <= FalseValCost;
9290+
auto getCost = [&](const APInt &Delta, const APInt &Addend) {
9291+
const int DeltaCost = RISCVMatInt::getIntMatCost(
9292+
Delta, Subtarget.getXLen(), Subtarget, /*CompressionCost=*/true);
9293+
// Does the addend fold into an ADDI
9294+
if (Addend.isSignedIntN(12))
9295+
return DeltaCost;
9296+
const int AddendCost = RISCVMatInt::getIntMatCost(
9297+
Addend, Subtarget.getXLen(), Subtarget, /*CompressionCost=*/true);
9298+
return AddendCost + DeltaCost;
9299+
};
9300+
bool IsCZERO_NEZ = getCost(FalseVal - TrueVal, TrueVal) <=
9301+
getCost(TrueVal - FalseVal, FalseVal);
92959302
SDValue LHSVal = DAG.getConstant(
92969303
IsCZERO_NEZ ? FalseVal - TrueVal : TrueVal - FalseVal, DL, VT);
92979304
SDValue RHSVal =

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -506,11 +506,10 @@ define i32 @select_nonnegative_lui_addi(i32 signext %x) {
506506
; RV32ZICOND-LABEL: select_nonnegative_lui_addi:
507507
; RV32ZICOND: # %bb.0:
508508
; RV32ZICOND-NEXT: srli a0, a0, 31
509-
; RV32ZICOND-NEXT: lui a1, 1048572
510-
; RV32ZICOND-NEXT: addi a1, a1, 25
511-
; RV32ZICOND-NEXT: czero.eqz a0, a1, a0
512509
; RV32ZICOND-NEXT: lui a1, 4
513-
; RV32ZICOND-NEXT: add a0, a0, a1
510+
; RV32ZICOND-NEXT: addi a1, a1, -25
511+
; RV32ZICOND-NEXT: czero.nez a0, a1, a0
512+
; RV32ZICOND-NEXT: addi a0, a0, 25
514513
; RV32ZICOND-NEXT: ret
515514
;
516515
; RV64I-LABEL: select_nonnegative_lui_addi:
@@ -536,11 +535,10 @@ define i32 @select_nonnegative_lui_addi(i32 signext %x) {
536535
; RV64ZICOND-LABEL: select_nonnegative_lui_addi:
537536
; RV64ZICOND: # %bb.0:
538537
; RV64ZICOND-NEXT: srli a0, a0, 63
539-
; RV64ZICOND-NEXT: lui a1, 1048572
540-
; RV64ZICOND-NEXT: addi a1, a1, 25
541-
; RV64ZICOND-NEXT: czero.eqz a0, a1, a0
542538
; RV64ZICOND-NEXT: lui a1, 4
543-
; RV64ZICOND-NEXT: add a0, a0, a1
539+
; RV64ZICOND-NEXT: addi a1, a1, -25
540+
; RV64ZICOND-NEXT: czero.nez a0, a1, a0
541+
; RV64ZICOND-NEXT: addi a0, a0, 25
544542
; RV64ZICOND-NEXT: ret
545543
%cmp = icmp sgt i32 %x, -1
546544
%cond = select i1 %cmp, i32 16384, i32 25

0 commit comments

Comments
 (0)