[llvm] f9d0bf0 - Revert "[RISCV] Fold binary op into select if profitable."
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 13 18:17:48 PDT 2023
Author: Craig Topper
Date: 2023-06-13T18:17:36-07:00
New Revision: f9d0bf06319203a8cbb47d89c2f39d2c782f3887
URL: https://github.com/llvm/llvm-project/commit/f9d0bf06319203a8cbb47d89c2f39d2c782f3887
DIFF: https://github.com/llvm/llvm-project/commit/f9d0bf06319203a8cbb47d89c2f39d2c782f3887.diff
LOG: Revert "[RISCV] Fold binary op into select if profitable."
This reverts commit d0189584631e587279ee5f0af5feb94d8045bb31.
Build failures have been reported in the Linux kernel.
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
Removed:
llvm/test/CodeGen/RISCV/fold-binop-into-select.ll
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 57ec652d446d5..02f3b584d19aa 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -5617,65 +5617,6 @@ static SDValue combineSelectToBinOp(SDNode *N, SelectionDAG &DAG,
return SDValue();
}
-// Transform `binOp (select cond, x, c0), c1` where `c0` and `c1` are constants
-// into `select cond, binOp(x, c1), binOp(c0, c1)` if profitable.
-// For now we only consider transformation profitable if `binOp(c0, c1)` ends up
-// being `0` or `-1`. In such cases we can replace `select` with `and`.
-// TODO: Should we also do this if `binOp(c0, c1)` is cheaper to materialize
-// than `c0`?
-static SDValue
-foldBinOpIntoSelectIfProfitable(SDNode *BO, SelectionDAG &DAG,
- const RISCVSubtarget &Subtarget) {
- if (Subtarget.hasShortForwardBranchOpt())
- return SDValue();
-
- unsigned SelOpNo = 0;
- SDValue Sel = BO->getOperand(0);
- if (Sel.getOpcode() != ISD::SELECT || !Sel.hasOneUse()) {
- SelOpNo = 1;
- Sel = BO->getOperand(1);
- }
-
- if (Sel.getOpcode() != ISD::SELECT || !Sel.hasOneUse())
- return SDValue();
-
- unsigned ConstSelOpNo = 1;
- unsigned OtherSelOpNo = 2;
- SDValue ConstSelOp = Sel->getOperand(1);
- ConstantSDNode *ConstSelOpNode = dyn_cast<ConstantSDNode>(ConstSelOp);
- if (!ConstSelOpNode) {
- ConstSelOpNo = 2;
- OtherSelOpNo = 1;
- ConstSelOp = Sel->getOperand(2);
- ConstSelOpNode = dyn_cast<ConstantSDNode>(ConstSelOp);
- }
- if (!ConstSelOpNode)
- return SDValue();
- if (!ConstSelOpNode || ConstSelOpNode->isOpaque())
- return SDValue();
-
- SDValue ConstBinOp = BO->getOperand(SelOpNo ^ 1);
- ConstantSDNode *ConstBinOpNode = dyn_cast<ConstantSDNode>(ConstBinOp);
- if (!ConstBinOpNode || ConstBinOpNode->isOpaque())
- return SDValue();
-
- SDLoc DL(Sel);
- EVT VT = BO->getValueType(0);
-
- SDValue NewConstOp = DAG.FoldConstantArithmetic(BO->getOpcode(), DL, VT,
- {ConstSelOp, ConstBinOp});
- const APInt &NewConstAPInt =
- cast<ConstantSDNode>(NewConstOp)->getAPIntValue();
- if (!NewConstAPInt.isZero() && !NewConstAPInt.isAllOnes())
- return SDValue();
-
- SDValue NewNonConstOp = DAG.getNode(
- BO->getOpcode(), DL, VT, Sel->getOperand(OtherSelOpNo), ConstBinOp);
- SDValue NewT = (ConstSelOpNo == 1) ? NewConstOp : NewNonConstOp;
- SDValue NewF = (ConstSelOpNo == 1) ? NewNonConstOp : NewConstOp;
- return DAG.getSelect(DL, VT, Sel.getOperand(0), NewT, NewF);
-}
-
SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
SDValue CondV = Op.getOperand(0);
SDValue TrueV = Op.getOperand(1);
@@ -5694,15 +5635,6 @@ SDValue RISCVTargetLowering::lowerSELECT(SDValue Op, SelectionDAG &DAG) const {
if (SDValue V = combineSelectToBinOp(Op.getNode(), DAG, Subtarget))
return V;
- if (Op.hasOneUse() && isBinOp(Op->use_begin()->getOpcode())) {
- SDNode *BinOp = *Op->use_begin();
- if (SDValue NewSel =
- foldBinOpIntoSelectIfProfitable(*Op->use_begin(), DAG, Subtarget)) {
- DAG.ReplaceAllUsesWith(BinOp, &NewSel);
- return lowerSELECT(NewSel, DAG);
- }
- }
-
// (select cc, 1.0, 0.0) -> (sint_to_fp (zext cc))
// (select cc, 0.0, 1.0) -> (sint_to_fp (zext (xor cc, 1)))
const ConstantFPSDNode *FPTV = dyn_cast<ConstantFPSDNode>(TrueV);
diff --git a/llvm/test/CodeGen/RISCV/fold-binop-into-select.ll b/llvm/test/CodeGen/RISCV/fold-binop-into-select.ll
deleted file mode 100644
index ba3b0201912d5..0000000000000
--- a/llvm/test/CodeGen/RISCV/fold-binop-into-select.ll
+++ /dev/null
@@ -1,31 +0,0 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
-; RUN: llc -mtriple=riscv64 < %s | FileCheck %s
-
-define i64 @select_add(i1 %c, i64 %x) {
-; CHECK-LABEL: select_add:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: andi a0, a0, 1
-; CHECK-NEXT: addi a1, a1, 2
-; CHECK-NEXT: addi a0, a0, -1
-; CHECK-NEXT: and a0, a0, a1
-; CHECK-NEXT: ret
-entry:
- %select_ = select i1 %c, i64 -2, i64 %x
- %res = add i64 %select_, 2
- ret i64 %res
-}
-
-define i64 @select_and(i1 %c, i64 %x) {
-; CHECK-LABEL: select_and:
-; CHECK: # %bb.0: # %entry
-; CHECK-NEXT: andi a0, a0, 1
-; CHECK-NEXT: addiw a0, a0, -1
-; CHECK-NEXT: and a0, a1, a0
-; CHECK-NEXT: andi a0, a0, 64
-; CHECK-NEXT: ret
-entry:
- %select_ = select i1 %c, i64 63, i64 %x
- %res = and i64 %select_, 64
- ret i64 %res
-}
-
More information about the llvm-commits
mailing list