[llvm] [LV] NFCI: Add RecurKind to VPPartialReductionChain (PR #181705)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 16 09:22:52 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-vectorizers
Author: Sander de Smalen (sdesmalen-arm)
<details>
<summary>Changes</summary>
This avoids having to pass around the RecurKind or re-figure it out from the VPReductionPHI node.
This is useful in a follow-up PR, where we need to distinguish between a `Sub` and `AddWithSub` recurrence, which can't be deduced from the `ReductionBinOp` field.
---
Full diff: https://github.com/llvm/llvm-project/pull/181705.diff
1 Files Affected:
- (modified) llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp (+14-14)
``````````diff
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index bc9fe1eb81416..12606ab9f6cd4 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -5764,14 +5764,17 @@ struct VPPartialReductionChain {
/// The user of the extends that is then reduced.
VPWidenRecipe *BinOp;
unsigned ScaleFactor;
+ /// The recurrence kind for the entire partial reduction chain.
+ /// This allows distinguishing between Sub and AddWithSub recurrences,
+ /// when the ReductionBinOp is a Instruction::Sub.
+ RecurKind RK;
};
// Helper to transform a partial reduction chain into a partial reduction
// recipe. Assumes profitability has been checked.
static void transformToPartialReduction(const VPPartialReductionChain &Chain,
VPTypeAnalysis &TypeInfo, VPlan &Plan,
- VPReductionPHIRecipe *RdxPhi,
- RecurKind RK) {
+ VPReductionPHIRecipe *RdxPhi) {
VPWidenRecipe *WidenRecipe = Chain.ReductionBinOp;
assert(WidenRecipe->getNumOperands() == 2 && "Expected binary operation");
@@ -5796,7 +5799,8 @@ static void transformToPartialReduction(const VPPartialReductionChain &Chain,
// It's therefore better to choose option (2) such that the partial
// reduction is always positive (starting at '0') and to do a final
// subtract in the middle block.
- if (WidenRecipe->getOpcode() == Instruction::Sub && RK != RecurKind::Sub) {
+ if (WidenRecipe->getOpcode() == Instruction::Sub &&
+ Chain.RK != RecurKind::Sub) {
VPBuilder Builder(WidenRecipe);
Type *ElemTy = TypeInfo.inferScalarType(BinOp);
auto *Zero = Plan.getConstantInt(ElemTy, 0);
@@ -5852,7 +5856,7 @@ static void transformToPartialReduction(const VPPartialReductionChain &Chain,
// If this is the last value in a sub-reduction chain, then update the PHI
// node to start at `0` and update the reduction-result to subtract from
// the PHI's start value.
- if (RK != RecurKind::Sub)
+ if (Chain.RK != RecurKind::Sub)
return;
VPValue *OldStartValue = StartInst->getOperand(0);
@@ -5932,7 +5936,7 @@ static bool isValidPartialReduction(const VPPartialReductionChain &Chain,
/// Recursively calls itself to identify chained scaled reductions.
/// Returns true if this invocation added an entry to Chains, otherwise false.
static bool
-getScaledReductions(VPSingleDefRecipe *RedPhiR, VPValue *PrevValue,
+getScaledReductions(VPReductionPHIRecipe *RedPhiR, VPValue *PrevValue,
SmallVectorImpl<VPPartialReductionChain> &Chains,
VPCostContext &CostCtx, VFRange &Range) {
auto *UpdateR = dyn_cast<VPWidenRecipe>(PrevValue);
@@ -5964,14 +5968,11 @@ getScaledReductions(VPSingleDefRecipe *RedPhiR, VPValue *PrevValue,
// If one is found, we use the discovered reduction instruction in
// place of the accumulator for costing.
if (getScaledReductions(RedPhiR, Op, Chains, CostCtx, Range)) {
- RedPhiR = Chains.rbegin()->ReductionBinOp;
Op = UpdateR->getOperand(0);
PhiOp = UpdateR->getOperand(1);
- if (Op == RedPhiR)
+ if (Op == Chains.rbegin()->ReductionBinOp)
std::swap(Op, PhiOp);
}
- if (RedPhiR != PhiOp)
- return false;
// If the update is a binary op, check both of its operands to see if
// they are extends. Otherwise, see if the update comes directly from an
@@ -6043,9 +6044,10 @@ getScaledReductions(VPSingleDefRecipe *RedPhiR, VPValue *PrevValue,
if (!PHISize.hasKnownScalarFactor(ASize))
return false;
+ RecurKind RK = cast<VPReductionPHIRecipe>(RedPhiR)->getRecurrenceKind();
VPPartialReductionChain Chain(
{UpdateR, CastRecipes[0], CastRecipes[1], BinOp,
- static_cast<unsigned>(PHISize.getKnownScalarFactor(ASize))});
+ static_cast<unsigned>(PHISize.getKnownScalarFactor(ASize)), RK});
if (!isValidPartialReduction(Chain, PhiType, CostCtx, Range))
return false;
@@ -6143,9 +6145,7 @@ void VPlanTransforms::createPartialReductions(VPlan &Plan,
}
}
- for (auto &[Phi, Chains] : ChainsByPhi) {
- RecurKind RK = cast<VPReductionPHIRecipe>(Phi)->getRecurrenceKind();
+ for (auto &[Phi, Chains] : ChainsByPhi)
for (const VPPartialReductionChain &Chain : Chains)
- transformToPartialReduction(Chain, CostCtx.Types, Plan, Phi, RK);
- }
+ transformToPartialReduction(Chain, CostCtx.Types, Plan, Phi);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/181705
More information about the llvm-commits
mailing list