[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