[llvm] [AArch64] Improve lowering of pure fixed-length partial add reductions. (PR #214691)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 11 04:50:39 PDT 2026
================
@@ -34748,6 +34710,33 @@ AArch64TargetLowering::LowerPARTIAL_REDUCE_MLA(SDValue Op,
EVT OrigResultVT = ResultVT;
EVT OpVT = LHS.getValueType();
+ // Two-way fixed-length integer add reductions.
+ if ((Op.getOpcode() == ISD::PARTIAL_REDUCE_UMLA ||
+ Op.getOpcode() == ISD::PARTIAL_REDUCE_SMLA) &&
+ Subtarget->isNeonAvailable() && ResultVT.isFixedLengthVector() &&
+ ResultVT.getScalarSizeInBits() == OpVT.getScalarSizeInBits() * 2 &&
+ ResultVT.getVectorNumElements() * 2 == OpVT.getVectorNumElements() &&
+ (OpVT.getSizeInBits() == 64 || OpVT.getSizeInBits() == 128)) {
+ // A pure partial reduction can lower to a [SU]ADALP.
+ if (isOneVector(RHS)) {
+ bool IsUnsigned = Op.getOpcode() == ISD::PARTIAL_REDUCE_UMLA;
+ unsigned Opc = IsUnsigned ? AArch64ISD::UADDLP : AArch64ISD::SADDLP;
+ return DAG.getNode(ISD::ADD, DL, ResultVT, Acc,
+ DAG.getNode(Opc, DL, ResultVT, LHS));
----------------
paulwalker-arm wrote:
Can you return `Op` and handle this in isel like we do for SVE?
https://github.com/llvm/llvm-project/pull/214691
More information about the llvm-commits
mailing list