[llvm] [DAGCombiner] Reassociate chains of vector reductions (PR #206471)
Pengcheng Wang via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 2 01:38:20 PDT 2026
================
@@ -1401,6 +1401,43 @@ SDValue DAGCombiner::reassociateReduction(unsigned RedOpc, unsigned Opc,
SDValue Op2 = DAG.getNode(Opc, DL, VT, B, D);
return DAG.getNode(Opc, DL, VT, Red, Op2);
}
+
+ // Reassociate a reduction chain so two reductions become adjacent and the
+ // folds above can merge them:
+ // op(vecreduce(X), op(vecreduce(Y), Z))
+ // -> op(vecreduce(op(X, Y)), Z)
+ // Applied to fixpoint by the combiner worklist, this collapses an
+ // arbitrarily long chain of reductions (such as the left-leaning chain SLP
+ // emits) into a single reduction.
+ auto FoldReductionChain = [&](SDValue Red0, SDValue Chain) -> SDValue {
+ SDValue X, Y, Z, RedY;
+ if (!sd_match(Red0, m_OneUse(m_UnaryOp(RedOpc, m_Value(X)))) ||
+ !sd_match(Chain, m_OneUse(m_c_BinOp(
+ Opc,
+ m_AllOf(m_OneUse(m_UnaryOp(RedOpc, m_Value(Y))),
+ m_Value(RedY)),
+ m_Value(Z)))) ||
+ sd_match(Z, m_UnaryOp(RedOpc, m_Value())) ||
----------------
wangpc-pp wrote:
Done, folded into the Chain match via `m_Value(Z, m_Unless(m_UnaryOp(RedOpc, m_Value())))`.
https://github.com/llvm/llvm-project/pull/206471
More information about the llvm-commits
mailing list