[llvm] [AArch64][ISel] Enable masked interleaved stores for splat values (PR #207950)
Harry Ramsey via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 13 02:06:50 PDT 2026
================
@@ -27354,6 +27248,43 @@ isSequentialConcatOfVectorInterleave(SDNode *N, SmallVectorImpl<SDValue> &Ops) {
return true;
}
+static bool isSplatVectorInterleaveOps(SelectionDAG &DAG, SDLoc DL,
+ SDValue WideValue,
+ SmallVectorImpl<SDValue> &Ops) {
+ EVT WideVT = WideValue.getValueType();
+ if (!WideVT.isScalableVector())
+ return false;
+
+ SDValue SplatValue = DAG.getSplatValue(WideValue);
+ if (!SplatValue)
+ return false;
+
+ TypeSize WideSize = WideVT.getSizeInBits();
+ if (!WideSize.isKnownMultipleOf(128))
+ return false;
+
+ unsigned NumParts = WideSize.getKnownMinValue() / 128;
+ if (NumParts != 2 && NumParts != 3 && NumParts != 4)
+ return false;
+
+ ElementCount WideEC = WideVT.getVectorElementCount();
+ if (!WideEC.isKnownMultipleOf(NumParts))
+ return false;
+
+ EVT SubVecTy =
+ EVT::getVectorVT(*DAG.getContext(), WideVT.getVectorElementType(),
+ WideEC.divideCoefficientBy(NumParts));
+
+ if (SubVecTy.getSizeInBits().getKnownMinValue() != 128 ||
+ !DAG.getTargetLoweringInfo().isTypeLegal(SubVecTy))
+ return false;
+
+ SDValue NarrowSplat =
+ DAG.getNode(ISD::SPLAT_VECTOR, DL, SubVecTy, WideValue.getOperand(0));
----------------
Harry-Ramsey wrote:
Thank you for pointing this out. I updated some tests to hopefully now reflect splat vectors instead of just inline splats.
My original idea didn't consider that. :)
https://github.com/llvm/llvm-project/pull/207950
More information about the llvm-commits
mailing list