[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) {
----------------
preames wrote:
This seems like a general useful function, surely we have parts of this repeated elsewhere already?
https://github.com/llvm/llvm-project/pull/93596
More information about the llvm-commits
mailing list