[llvm] [RISCV] Add combines to form binop from tail insert idioms (PR #72675)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 19 20:35:03 PST 2023
================
@@ -14159,6 +14159,75 @@ static SDValue performBUILD_VECTORCombine(SDNode *N, SelectionDAG &DAG,
DAG.getBuildVector(VT, DL, RHSOps));
}
+static SDValue performINSERT_VECTOR_ELTCombine(SDNode *N, SelectionDAG &DAG,
+ const RISCVSubtarget &Subtarget,
+ const RISCVTargetLowering &TLI) {
+ SDValue InVec = N->getOperand(0);
+ SDValue InVal = N->getOperand(1);
+ SDValue EltNo = N->getOperand(2);
+ SDLoc DL(N);
+
+ EVT VT = InVec.getValueType();
+ if (VT.isScalableVector())
+ return SDValue();
+
+ if (!InVec.hasOneUse())
+ return SDValue();
+
+ // Given insert_vector_elt (binop a, VecC), (same_binop b, C2), Elt
+ // move the insert_vector_elts into the arms of the binop. Note that
+ // the new RHS must be a constant.
+ const unsigned InVecOpcode = InVec->getOpcode();
+ if (InVecOpcode == InVal->getOpcode() && TLI.isBinOp(InVecOpcode) &&
+ InVal.hasOneUse()) {
+ SDValue InVecLHS = InVec->getOperand(0);
+ SDValue InVecRHS = InVec->getOperand(1);
+ SDValue InValLHS = InVal->getOperand(0);
+ SDValue InValRHS = InVal->getOperand(1);
+
+ if (!ISD::isBuildVectorOfConstantSDNodes(InVecRHS.getNode()))
+ return SDValue();
+ if (!isa<ConstantSDNode>(InValRHS) && !isa<ConstantFPSDNode>(InValRHS))
+ return SDValue();
+ // FIXME: Return failure if the RHS type doesn't match the LHS. Shifts may
+ // have different LHS and RHS types.
+ if (InVec.getOperand(0).getValueType() != InVec.getOperand(1).getValueType())
+ return SDValue();
+ SDValue LHS = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, VT,
+ InVecLHS, InValLHS, EltNo);
+ SDValue RHS = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, VT,
+ InVecRHS, InValRHS, EltNo);
+ return DAG.getNode(InVec->getOpcode(), DL, VT, LHS, RHS);
----------------
lukel97 wrote:
Nit
```suggestion
return DAG.getNode(InVecOpcode, DL, VT, LHS, RHS);
```
https://github.com/llvm/llvm-project/pull/72675
More information about the llvm-commits
mailing list