[llvm-branch-commits] [llvm] [RISCV] Support i64 accumulator for Zvdot4a8i partial reductions (PR #215517)
Philip Reames via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Aug 13 08:10:34 PDT 2026
================
@@ -9884,15 +9893,49 @@ SDValue RISCVTargetLowering::lowerPARTIAL_REDUCE_MLA(SDValue Op,
SDLoc DL(Op);
MVT VT = Op.getSimpleValueType();
SDValue Accum = Op.getOperand(0);
- assert(Accum.getSimpleValueType() == VT &&
- VT.getVectorElementType() == MVT::i32);
SDValue A = Op.getOperand(1);
SDValue B = Op.getOperand(2);
MVT ArgVT = A.getSimpleValueType();
assert(ArgVT == B.getSimpleValueType() &&
ArgVT.getVectorElementType() == MVT::i8);
(void)ArgVT;
+ // vdot4a* only produces an i32 result. For an i64 accumulator, perform the
+ // dot product into a fresh i32 accumulator (each result is the sum of four
+ // i8 products, which cannot overflow i32), reduce those i32 partial sums
+ // down to the accumulator's element count while still in i32 (a sum of eight
+ // i8 products still cannot overflow i32), and only then extend to i64 and add
+ // to the accumulator.
+ if (VT.getVectorElementType() == MVT::i64) {
+ assert(Accum.getSimpleValueType() == VT);
+ // vdot4a* reduces each group of four i8 lanes into one i32 lane, so the
+ // intermediate i32 result has 1/4 the element count of the i8 inputs.
+ MVT DotVT = MVT::getVectorVT(
+ MVT::i32, ArgVT.getVectorElementCount().divideCoefficientBy(4));
+ SDValue Dot = DAG.getNode(Op.getOpcode(), DL, DotVT,
+ {DAG.getConstant(0, DL, DotVT), A, B});
+ // Add the i32 partial sums down to the accumulator's element count by
+ // extracting and summing the subvectors (still in i32 to avoid a wider
+ // extend).
+ MVT NarrowVT = VT.changeVectorElementType(MVT::i32);
+ unsigned Stride = NarrowVT.getVectorMinNumElements();
+ SDValue Sum = DAG.getExtractSubvector(DL, NarrowVT, Dot, 0);
+ for (unsigned I = 1, E = DotVT.getVectorMinNumElements() / Stride; I != E;
----------------
preames wrote:
Not for this patch, but for the case where we're doing more than a 2x collapse, we probably want to use a reduce tree here.
https://github.com/llvm/llvm-project/pull/215517
More information about the llvm-branch-commits
mailing list