[llvm] [RISCV] Combine vslidedown_vl with known VL and offset to a smaller LMUL (PR #66267)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 21 03:26:35 PDT 2023
================
@@ -14266,6 +14257,43 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
if (SDValue V = performCONCAT_VECTORSCombine(N, DAG, Subtarget, *this))
return V;
break;
+ case RISCVISD::VSLIDEDOWN_VL: {
+ MVT OrigVT = N->getSimpleValueType(0);
+ auto *CVL = dyn_cast<ConstantSDNode>(N->getOperand(4));
+ auto *CIdx = dyn_cast<ConstantSDNode>(N->getOperand(2));
+ if (!CVL || !CIdx)
+ break;
+ unsigned MaxIdx = CVL->getZExtValue() + CIdx->getZExtValue() - 1;
+ // We can try and reduce the LMUL that a vslidedown uses if we know where
+ // the maximum index is. For example, if the target has Zvl128b, a
+ // vslidedown of e32 with with an offset of 4 and VL of 2 is only going to
+ // read from the first 2 registers at most. So if we were operating at
+ // LMUL=4 (nxv8i32), we can reduce it to LMUL=2(nxv4i32).
+ if (auto ShrunkVT =
+ getSmallestVTForIndex(OrigVT, MaxIdx, DL, DAG, Subtarget)) {
+ SDValue ShrunkPassthru =
+ DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, *ShrunkVT, N->getOperand(0),
+ DAG.getVectorIdxConstant(0, DL));
+ SDValue ShrunkInVec =
+ DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, *ShrunkVT, N->getOperand(1),
+ DAG.getVectorIdxConstant(0, DL));
+
+ // The only mask ever used in vslide*_vl nodes is vmset_vl, and the only
----------------
lukel97 wrote:
Agreed. I'll try adding a masked pattern, hopefully RISCVISelDAGToDAG will be able to convert it to the unmasked pseudo
https://github.com/llvm/llvm-project/pull/66267
More information about the llvm-commits
mailing list