Skip to content

Commit 932d0ce

Browse files
committed
Recommit "[RISCV] Prefer (select (x < 0), y, z) -> x >> (XLEN - 1) & (y - z) + z even with Zicond. (llvm#125772)"
With the test changes. Original message: The Zicond version of this requires an li instruction and an additional register. Without Zicond we match this in a DAGCombine on RISCVISD::SELECT_CC. This PR has 2 commits. I'll pre-commit the test change if this looks good.
1 parent 2ef2587 commit 932d0ce

File tree

2 files changed

+51
-84
lines changed

2 files changed

+51
-84
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8460,6 +8460,33 @@ SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
84608460
if (isa<ConstantSDNode>(TrueV) && isa<ConstantSDNode>(FalseV)) {
84618461
const APInt &TrueVal = TrueV->getAsAPIntVal();
84628462
const APInt &FalseVal = FalseV->getAsAPIntVal();
8463+
8464+
// Prefer these over Zicond to avoid materializing an immediate:
8465+
// (select (x < 0), y, z) -> x >> (XLEN - 1) & (y - z) + z
8466+
// (select (x > -1), z, y) -> x >> (XLEN - 1) & (y - z) + z
8467+
if (CondV.getOpcode() == ISD::SETCC &&
8468+
CondV.getOperand(0).getValueType() == VT && CondV.hasOneUse()) {
8469+
ISD::CondCode CCVal = cast<CondCodeSDNode>(CondV.getOperand(2))->get();
8470+
if ((CCVal == ISD::SETLT && isNullConstant(CondV.getOperand(1))) ||
8471+
(CCVal == ISD::SETGT && isAllOnesConstant(CondV.getOperand(1)))) {
8472+
int64_t TrueImm = TrueVal.getSExtValue();
8473+
int64_t FalseImm = FalseVal.getSExtValue();
8474+
if (CCVal == ISD::SETGT)
8475+
std::swap(TrueImm, FalseImm);
8476+
if (isInt<12>(TrueImm) && isInt<12>(FalseImm) &&
8477+
isInt<12>(TrueImm - FalseImm)) {
8478+
SDValue SRA =
8479+
DAG.getNode(ISD::SRA, DL, VT, CondV.getOperand(0),
8480+
DAG.getConstant(Subtarget.getXLen() - 1, DL, VT));
8481+
SDValue AND =
8482+
DAG.getNode(ISD::AND, DL, VT, SRA,
8483+
DAG.getSignedConstant(TrueImm - FalseImm, DL, VT));
8484+
return DAG.getNode(ISD::ADD, DL, VT, AND,
8485+
DAG.getSignedConstant(FalseImm, DL, VT));
8486+
}
8487+
}
8488+
}
8489+
84638490
const int TrueValCost = RISCVMatInt::getIntMatCost(
84648491
TrueVal, Subtarget.getXLen(), Subtarget, /*CompressionCost=*/true);
84658492
const int FalseValCost = RISCVMatInt::getIntMatCost(

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

Lines changed: 24 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -445,98 +445,38 @@ define i32 @select_ne_10001_10002(i32 signext %a, i32 signext %b) {
445445
}
446446

447447
define i32 @select_slt_zero_constant1_constant2(i32 signext %x) {
448-
; RV32I-LABEL: select_slt_zero_constant1_constant2:
449-
; RV32I: # %bb.0:
450-
; RV32I-NEXT: srai a0, a0, 31
451-
; RV32I-NEXT: andi a0, a0, 10
452-
; RV32I-NEXT: addi a0, a0, -3
453-
; RV32I-NEXT: ret
454-
;
455-
; RV32IF-LABEL: select_slt_zero_constant1_constant2:
456-
; RV32IF: # %bb.0:
457-
; RV32IF-NEXT: srai a0, a0, 31
458-
; RV32IF-NEXT: andi a0, a0, 10
459-
; RV32IF-NEXT: addi a0, a0, -3
460-
; RV32IF-NEXT: ret
461-
;
462-
; RV32ZICOND-LABEL: select_slt_zero_constant1_constant2:
463-
; RV32ZICOND: # %bb.0:
464-
; RV32ZICOND-NEXT: slti a0, a0, 0
465-
; RV32ZICOND-NEXT: li a1, -10
466-
; RV32ZICOND-NEXT: czero.nez a0, a1, a0
467-
; RV32ZICOND-NEXT: addi a0, a0, 7
468-
; RV32ZICOND-NEXT: ret
469-
;
470-
; RV64I-LABEL: select_slt_zero_constant1_constant2:
471-
; RV64I: # %bb.0:
472-
; RV64I-NEXT: srai a0, a0, 63
473-
; RV64I-NEXT: andi a0, a0, 10
474-
; RV64I-NEXT: addi a0, a0, -3
475-
; RV64I-NEXT: ret
476-
;
477-
; RV64IFD-LABEL: select_slt_zero_constant1_constant2:
478-
; RV64IFD: # %bb.0:
479-
; RV64IFD-NEXT: srai a0, a0, 63
480-
; RV64IFD-NEXT: andi a0, a0, 10
481-
; RV64IFD-NEXT: addi a0, a0, -3
482-
; RV64IFD-NEXT: ret
448+
; RV32-LABEL: select_slt_zero_constant1_constant2:
449+
; RV32: # %bb.0:
450+
; RV32-NEXT: srai a0, a0, 31
451+
; RV32-NEXT: andi a0, a0, 10
452+
; RV32-NEXT: addi a0, a0, -3
453+
; RV32-NEXT: ret
483454
;
484-
; RV64ZICOND-LABEL: select_slt_zero_constant1_constant2:
485-
; RV64ZICOND: # %bb.0:
486-
; RV64ZICOND-NEXT: slti a0, a0, 0
487-
; RV64ZICOND-NEXT: li a1, -10
488-
; RV64ZICOND-NEXT: czero.nez a0, a1, a0
489-
; RV64ZICOND-NEXT: addi a0, a0, 7
490-
; RV64ZICOND-NEXT: ret
455+
; RV64-LABEL: select_slt_zero_constant1_constant2:
456+
; RV64: # %bb.0:
457+
; RV64-NEXT: srai a0, a0, 63
458+
; RV64-NEXT: andi a0, a0, 10
459+
; RV64-NEXT: addi a0, a0, -3
460+
; RV64-NEXT: ret
491461
%cmp = icmp slt i32 %x, 0
492462
%cond = select i1 %cmp, i32 7, i32 -3
493463
ret i32 %cond
494464
}
495465

496466
define i32 @select_sgt_negative_one_constant1_constant2(i32 signext %x) {
497-
; RV32I-LABEL: select_sgt_negative_one_constant1_constant2:
498-
; RV32I: # %bb.0:
499-
; RV32I-NEXT: srai a0, a0, 31
500-
; RV32I-NEXT: andi a0, a0, -10
501-
; RV32I-NEXT: addi a0, a0, 7
502-
; RV32I-NEXT: ret
503-
;
504-
; RV32IF-LABEL: select_sgt_negative_one_constant1_constant2:
505-
; RV32IF: # %bb.0:
506-
; RV32IF-NEXT: srai a0, a0, 31
507-
; RV32IF-NEXT: andi a0, a0, -10
508-
; RV32IF-NEXT: addi a0, a0, 7
509-
; RV32IF-NEXT: ret
510-
;
511-
; RV32ZICOND-LABEL: select_sgt_negative_one_constant1_constant2:
512-
; RV32ZICOND: # %bb.0:
513-
; RV32ZICOND-NEXT: slti a0, a0, 0
514-
; RV32ZICOND-NEXT: li a1, -10
515-
; RV32ZICOND-NEXT: czero.eqz a0, a1, a0
516-
; RV32ZICOND-NEXT: addi a0, a0, 7
517-
; RV32ZICOND-NEXT: ret
518-
;
519-
; RV64I-LABEL: select_sgt_negative_one_constant1_constant2:
520-
; RV64I: # %bb.0:
521-
; RV64I-NEXT: srai a0, a0, 63
522-
; RV64I-NEXT: andi a0, a0, -10
523-
; RV64I-NEXT: addi a0, a0, 7
524-
; RV64I-NEXT: ret
525-
;
526-
; RV64IFD-LABEL: select_sgt_negative_one_constant1_constant2:
527-
; RV64IFD: # %bb.0:
528-
; RV64IFD-NEXT: srai a0, a0, 63
529-
; RV64IFD-NEXT: andi a0, a0, -10
530-
; RV64IFD-NEXT: addi a0, a0, 7
531-
; RV64IFD-NEXT: ret
467+
; RV32-LABEL: select_sgt_negative_one_constant1_constant2:
468+
; RV32: # %bb.0:
469+
; RV32-NEXT: srai a0, a0, 31
470+
; RV32-NEXT: andi a0, a0, -10
471+
; RV32-NEXT: addi a0, a0, 7
472+
; RV32-NEXT: ret
532473
;
533-
; RV64ZICOND-LABEL: select_sgt_negative_one_constant1_constant2:
534-
; RV64ZICOND: # %bb.0:
535-
; RV64ZICOND-NEXT: slti a0, a0, 0
536-
; RV64ZICOND-NEXT: li a1, -10
537-
; RV64ZICOND-NEXT: czero.eqz a0, a1, a0
538-
; RV64ZICOND-NEXT: addi a0, a0, 7
539-
; RV64ZICOND-NEXT: ret
474+
; RV64-LABEL: select_sgt_negative_one_constant1_constant2:
475+
; RV64: # %bb.0:
476+
; RV64-NEXT: srai a0, a0, 63
477+
; RV64-NEXT: andi a0, a0, -10
478+
; RV64-NEXT: addi a0, a0, 7
479+
; RV64-NEXT: ret
540480
%cmp = icmp sgt i32 %x, -1
541481
%cond = select i1 %cmp, i32 7, i32 -3
542482
ret i32 %cond

0 commit comments

Comments
 (0)