[llvm] [RISCV] Turn certain cases of masked.load into vp.load + vp.merge (PR #217184)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 24 08:48:31 PDT 2026
================
@@ -20906,6 +20907,62 @@ static SDValue performVP_STORECombine(SDNode *N, SelectionDAG &DAG,
VPStore->isCompressingStore());
}
+/// Given
+/// ```
+/// %s = <0, 1, 2, 3, ...>
+/// %M = splat %m
+/// %p = setcc ult %s, %M
+/// %v = mask.load %addr, %p, %passthru
+/// ```
+/// we can turn this use a vp.load + vp.merge instead to avoid
+/// emitting mask. The VL of these two vp operations would be
+/// `min(%m, <number of vector elements>)`
+static SDValue performMaskedLoadToVPLoadCombine(MaskedLoadSDNode *MLoad,
+ SelectionDAG &DAG) {
+ using namespace SDPatternMatch;
+ EVT MaskVT = MLoad->getMask().getValueType();
+ assert(MaskVT.isVector());
+ if (!MaskVT.isFixedLengthVector())
+ return SDValue();
+ unsigned NumElements = MaskVT.getVectorNumElements();
+ SDLoc DL(MLoad);
+
+ SDValue SetCCLHS, SetCCRHS;
+ ISD::CondCode CC;
+ if (!sd_match(MLoad->getMask(), m_SetCC(m_Value(SetCCLHS), m_Value(SetCCRHS),
+ m_CondCode(CC))) ||
+ SetCCLHS->getOpcode() != ISD::BUILD_VECTOR ||
+ !(CC == ISD::SETULT || CC == ISD::SETLT) ||
+ !SetCCLHS.getValueType().isInteger())
+ return SDValue();
+ bool IsSigned = ISD::isSignedIntSetCC(CC);
+
+ SDValue Boundary = DAG.getSplatValue(SetCCRHS, /*LegalizeType=*/true);
+ if (!Boundary)
+ return SDValue();
+
+ // Return {a,n} from a build_vector sequence of {a, a+n, a+2n, a+3n, ....}
+ auto StepVector = cast<BuildVectorSDNode>(SetCCLHS)->isArithmeticSequence();
----------------
preames wrote:
Purely a aside, but it looks like this bit of code could be generalized into a stepvector matcher. If you wanted to then extend this transform to scalable vectors, it would make recognizing the intrinsic form fairly natural.
https://github.com/llvm/llvm-project/pull/217184
More information about the llvm-commits
mailing list