[llvm] [AArch64][SVE] Lower unpredicated loads/stores as fixed LDR/STR with -msve-vector-bits=128. (PR #127500)
Ricardo Jesus via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 21 07:53:11 PST 2025
================
@@ -23550,6 +23550,31 @@ static SDValue combineV3I8LoadExt(LoadSDNode *LD, SelectionDAG &DAG) {
return DAG.getMergeValues({Extract, TokenFactor}, DL);
}
+// Replace scalable loads with fixed loads when vscale_range(1, 1).
+// This enables further optimisations such as LDP folds.
+static SDValue combineVScale1Load(LoadSDNode *LD, SelectionDAG &DAG,
+ const AArch64Subtarget *Subtarget) {
+ EVT MemVT = LD->getMemoryVT();
+ if (!Subtarget->isNeonAvailable() || !MemVT.isScalableVector() ||
+ Subtarget->getMaxSVEVectorSizeInBits() != AArch64::SVEBitsPerBlock)
+ return SDValue();
+
+ // Skip unpacked types given their different layouts between Neon and SVE.
+ if (MemVT.getSizeInBits().getKnownMinValue() != AArch64::SVEBitsPerBlock)
+ return SDValue();
+
+ SDLoc DL(LD);
+ MVT NewVT = MVT::getVectorVT(MemVT.getVectorElementType().getSimpleVT(),
+ MemVT.getVectorMinNumElements());
+ SDValue NewLoad = DAG.getLoad(
+ NewVT, DL, LD->getChain(), LD->getBasePtr(), LD->getPointerInfo(),
+ LD->getOriginalAlign(), LD->getMemOperand()->getFlags(), LD->getAAInfo());
+ SDValue Insert = convertToScalableVector(DAG, MemVT, NewLoad);
+ SDValue TokenFactor = DAG.getNode(ISD::TokenFactor, DL, MVT::Other,
+ {SDValue(cast<SDNode>(NewLoad), 1)});
----------------
rj-jesus wrote:
Thank you, you're right, it's not. I've removed it.
https://github.com/llvm/llvm-project/pull/127500
More information about the llvm-commits
mailing list