[llvm] [RISCV] Move vnclipu patterns into DAGCombiner. (PR #93596)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Tue May 28 12:50:55 PDT 2024
================
@@ -16139,6 +16139,66 @@ static SDValue combineTruncOfSraSext(SDNode *N, SelectionDAG &DAG) {
return DAG.getNode(ISD::SRA, SDLoc(N), N->getValueType(0), N00, SMin);
}
+// Combine (truncate_vector_vl (umin X, C)) -> (vnclipu_vl X) if C is maximum
+// value for the truncated type.
+static SDValue combineTruncToVnclipu(SDNode *N, SelectionDAG &DAG,
+ const RISCVSubtarget &Subtarget) {
+ assert(N->getOpcode() == RISCVISD::TRUNCATE_VECTOR_VL);
+
+ MVT VT = N->getSimpleValueType(0);
+
+ SDValue Mask = N->getOperand(1);
+ SDValue VL = N->getOperand(2);
+
+ SDValue Src = N->getOperand(0);
+
+ // Src must be a UMIN or UMIN_VL.
+ if (Src.getOpcode() != ISD::UMIN &&
+ !(Src.getOpcode() == RISCVISD::UMIN_VL && Src.getOperand(2).isUndef() &&
+ Src.getOperand(3) == Mask && Src.getOperand(4) == VL))
+ return SDValue();
+
+ auto IsSplat = [&VL](SDValue Op, APInt &SplatVal) {
+ // Peek through conversion between fixed and scalable vectors.
+ if (Op.getOpcode() == ISD::INSERT_SUBVECTOR && Op.getOperand(0).isUndef() &&
+ isNullConstant(Op.getOperand(2)) &&
+ Op.getOperand(1).getValueType().isFixedLengthVector() &&
+ Op.getOperand(1).getOpcode() == ISD::EXTRACT_SUBVECTOR &&
+ Op.getOperand(1).getOperand(0).getValueType() == Op.getValueType() &&
+ isNullConstant(Op.getOperand(1).getOperand(1)))
+ Op = Op.getOperand(1).getOperand(0);
+
+ if (ISD::isConstantSplatVector(Op.getNode(), SplatVal))
+ return true;
+
+ if (Op.getOpcode() == RISCVISD::VMV_V_X_VL && Op.getOperand(0).isUndef() &&
----------------
preames wrote:
Should we add vmv_s_x when VL=1?
https://github.com/llvm/llvm-project/pull/93596
More information about the llvm-commits
mailing list