[llvm] 39fe48b - [RISCV] Move VFMADD_VL DAG combine to a function. NFC
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri May 12 12:34:32 PDT 2023
Author: Craig Topper
Date: 2023-05-12T12:34:23-07:00
New Revision: 39fe48b74eeaa037874f1117f76c4916dc722743
URL: https://github.com/llvm/llvm-project/commit/39fe48b74eeaa037874f1117f76c4916dc722743
DIFF: https://github.com/llvm/llvm-project/commit/39fe48b74eeaa037874f1117f76c4916dc722743.diff
LOG: [RISCV] Move VFMADD_VL DAG combine to a function. NFC
This is preparation for an additional combine.
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 65647b64ffe4..d4df9b178fdf 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -11201,6 +11201,43 @@ static unsigned negateFMAOpcode(unsigned Opcode, bool NegMul, bool NegAcc) {
return Opcode;
}
+static SDValue performVFMADD_VLCombine(SDNode *N, SelectionDAG &DAG) {
+ // Fold FNEG_VL into FMA opcodes.
+ // The first operand of strict-fp is chain.
+ unsigned Offset = N->isTargetStrictFPOpcode();
+ SDValue A = N->getOperand(0 + Offset);
+ SDValue B = N->getOperand(1 + Offset);
+ SDValue C = N->getOperand(2 + Offset);
+ SDValue Mask = N->getOperand(3 + Offset);
+ SDValue VL = N->getOperand(4 + Offset);
+
+ auto invertIfNegative = [&Mask, &VL](SDValue &V) {
+ if (V.getOpcode() == RISCVISD::FNEG_VL && V.getOperand(1) == Mask &&
+ V.getOperand(2) == VL) {
+ // Return the negated input.
+ V = V.getOperand(0);
+ return true;
+ }
+
+ return false;
+ };
+
+ bool NegA = invertIfNegative(A);
+ bool NegB = invertIfNegative(B);
+ bool NegC = invertIfNegative(C);
+
+ // If no operands are negated, we're done.
+ if (!NegA && !NegB && !NegC)
+ return SDValue();
+
+ unsigned NewOpcode = negateFMAOpcode(N->getOpcode(), NegA != NegB, NegC);
+ if (N->isTargetStrictFPOpcode())
+ return DAG.getNode(NewOpcode, SDLoc(N), N->getVTList(),
+ {N->getOperand(0), A, B, C, Mask, VL});
+ return DAG.getNode(NewOpcode, SDLoc(N), N->getValueType(0), A, B, C, Mask,
+ VL);
+}
+
static SDValue performSRACombine(SDNode *N, SelectionDAG &DAG,
const RISCVSubtarget &Subtarget) {
assert(N->getOpcode() == ISD::SRA && "Unexpected opcode");
@@ -12073,42 +12110,8 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
case RISCVISD::STRICT_VFMADD_VL:
case RISCVISD::STRICT_VFNMADD_VL:
case RISCVISD::STRICT_VFMSUB_VL:
- case RISCVISD::STRICT_VFNMSUB_VL: {
- // Fold FNEG_VL into FMA opcodes.
- // The first operand of strict-fp is chain.
- unsigned Offset = N->isTargetStrictFPOpcode();
- SDValue A = N->getOperand(0 + Offset);
- SDValue B = N->getOperand(1 + Offset);
- SDValue C = N->getOperand(2 + Offset);
- SDValue Mask = N->getOperand(3 + Offset);
- SDValue VL = N->getOperand(4 + Offset);
-
- auto invertIfNegative = [&Mask, &VL](SDValue &V) {
- if (V.getOpcode() == RISCVISD::FNEG_VL && V.getOperand(1) == Mask &&
- V.getOperand(2) == VL) {
- // Return the negated input.
- V = V.getOperand(0);
- return true;
- }
-
- return false;
- };
-
- bool NegA = invertIfNegative(A);
- bool NegB = invertIfNegative(B);
- bool NegC = invertIfNegative(C);
-
- // If no operands are negated, we're done.
- if (!NegA && !NegB && !NegC)
- return SDValue();
-
- unsigned NewOpcode = negateFMAOpcode(N->getOpcode(), NegA != NegB, NegC);
- if (Offset > 0)
- return DAG.getNode(NewOpcode, SDLoc(N), N->getVTList(),
- {N->getOperand(0), A, B, C, Mask, VL});
- return DAG.getNode(NewOpcode, SDLoc(N), N->getValueType(0), A, B, C, Mask,
- VL);
- }
+ case RISCVISD::STRICT_VFNMSUB_VL:
+ return performVFMADD_VLCombine(N, DAG);
case ISD::LOAD:
case ISD::STORE: {
if (DCI.isAfterLegalizeDAG())
More information about the llvm-commits
mailing list