[llvm] 98683b0 - [VPlan] Construct VPBlendRecipe from VPWidenPHIRecipe (NFC).
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed May 14 03:17:37 PDT 2025
Author: Florian Hahn
Date: 2025-05-14T11:17:26+01:00
New Revision: 98683b0a48d438f757db4185bd0ddff329bab31d
URL: https://github.com/llvm/llvm-project/commit/98683b0a48d438f757db4185bd0ddff329bab31d
DIFF: https://github.com/llvm/llvm-project/commit/98683b0a48d438f757db4185bd0ddff329bab31d.diff
LOG: [VPlan] Construct VPBlendRecipe from VPWidenPHIRecipe (NFC).
Update VPRecipeBuilder to construct VPBlendRecipe from VPWidenPHIRecipe,
starting to thread recipes through the builder instead of the
underlying IR instruction up-front.
Landing first part of approved
https://github.com/llvm/llvm-project/pull/139475 separately as NFC as
suggested.
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index d04fea5d9b0ac..6a27a1339f381 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -8539,10 +8539,7 @@ VPWidenIntOrFpInductionRecipe *VPRecipeBuilder::tryToOptimizeInductionTruncate(
return nullptr;
}
-VPBlendRecipe *VPRecipeBuilder::tryToBlend(PHINode *Phi,
- ArrayRef<VPValue *> Operands) {
- unsigned NumIncoming = Phi->getNumIncomingValues();
-
+VPBlendRecipe *VPRecipeBuilder::tryToBlend(VPWidenPHIRecipe *PhiR) {
// We know that all PHIs in non-header blocks are converted into selects, so
// we don't have to worry about the insertion order and we can just use the
// builder. At this point we generate the predication tree. There may be
@@ -8552,9 +8549,11 @@ VPBlendRecipe *VPRecipeBuilder::tryToBlend(PHINode *Phi,
// Map incoming IR BasicBlocks to incoming VPValues, for lookup below.
// TODO: Add operands and masks in order from the VPlan predecessors.
DenseMap<BasicBlock *, VPValue *> VPIncomingValues;
+ auto *Phi = cast<PHINode>(PhiR->getUnderlyingInstr());
for (const auto &[Idx, Pred] : enumerate(predecessors(Phi->getParent())))
- VPIncomingValues[Pred] = Operands[Idx];
+ VPIncomingValues[Pred] = PhiR->getOperand(Idx);
+ unsigned NumIncoming = PhiR->getNumIncoming();
SmallVector<VPValue *, 2> OperandsWithMask;
for (unsigned In = 0; In < NumIncoming; In++) {
BasicBlock *Pred = Phi->getIncomingBlock(In);
@@ -8562,7 +8561,7 @@ VPBlendRecipe *VPRecipeBuilder::tryToBlend(PHINode *Phi,
VPValue *EdgeMask = getEdgeMask(Pred, Phi->getParent());
if (!EdgeMask) {
assert(In == 0 && "Both null and non-null edge masks found");
- assert(all_equal(Operands) &&
+ assert(all_equal(PhiR->operands()) &&
"Distinct incoming values with one having a full mask");
break;
}
@@ -8955,15 +8954,21 @@ bool VPRecipeBuilder::getScaledReductions(
return false;
}
-VPRecipeBase *VPRecipeBuilder::tryToCreateWidenRecipe(
- Instruction *Instr, ArrayRef<VPValue *> Operands, VFRange &Range) {
+VPRecipeBase *VPRecipeBuilder::tryToCreateWidenRecipe(VPSingleDefRecipe *R,
+ VFRange &Range) {
// First, check for specific widening recipes that deal with inductions, Phi
// nodes, calls and memory operations.
VPRecipeBase *Recipe;
- if (auto *Phi = dyn_cast<PHINode>(Instr)) {
- if (Phi->getParent() != OrigLoop->getHeader())
- return tryToBlend(Phi, Operands);
-
+ Instruction *Instr = R->getUnderlyingInstr();
+ SmallVector<VPValue *, 4> Operands(R->operands());
+ if (auto *PhiR = dyn_cast<VPWidenPHIRecipe>(R)) {
+ VPBasicBlock *Parent = PhiR->getParent();
+ VPRegionBlock *LoopRegionOf = Parent->getEnclosingLoopRegion();
+ // Handle phis in non-header blocks.
+ if (!LoopRegionOf || LoopRegionOf->getEntry() != Parent)
+ return tryToBlend(PhiR);
+
+ auto *Phi = cast<PHINode>(R->getUnderlyingInstr());
assert(Operands.size() == 2 && "Must have 2 operands for header phis");
if ((Recipe = tryToOptimizeInductionPHI(Phi, Operands, Range)))
return Recipe;
@@ -9528,11 +9533,12 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range,
continue;
}
- SmallVector<VPValue *, 4> Operands(R.operands());
VPRecipeBase *Recipe =
- RecipeBuilder.tryToCreateWidenRecipe(Instr, Operands, Range);
- if (!Recipe)
+ RecipeBuilder.tryToCreateWidenRecipe(SingleDef, Range);
+ if (!Recipe) {
+ SmallVector<VPValue *, 4> Operands(R.operands());
Recipe = RecipeBuilder.handleReplication(Instr, Operands, Range);
+ }
RecipeBuilder.setRecipe(Instr, Recipe);
if (isa<VPWidenIntOrFpInductionRecipe>(Recipe) && isa<TruncInst>(Instr)) {
diff --git a/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h b/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
index 5c7a3aa9f68d7..ae86181487261 100644
--- a/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
+++ b/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
@@ -122,10 +122,10 @@ class VPRecipeBuilder {
tryToOptimizeInductionTruncate(TruncInst *I, ArrayRef<VPValue *> Operands,
VFRange &Range);
- /// Handle non-loop phi nodes. Return a new VPBlendRecipe otherwise. Currently
+ /// Handle non-loop phi nodes, returning a new VPBlendRecipe. Currently
/// all such phi nodes are turned into a sequence of select instructions as
/// the vectorizer currently performs full if-conversion.
- VPBlendRecipe *tryToBlend(PHINode *Phi, ArrayRef<VPValue *> Operands);
+ VPBlendRecipe *tryToBlend(VPWidenPHIRecipe *PhiR);
/// Handle call instructions. If \p CI can be widened for \p Range.Start,
/// return a new VPWidenCallRecipe or VPWidenIntrinsicRecipe. Range.End may be
@@ -179,11 +179,9 @@ class VPRecipeBuilder {
/// that are valid so recipes can be formed later.
void collectScaledReductions(VFRange &Range);
- /// Create and return a widened recipe for \p I if one can be created within
+ /// Create and return a widened recipe for \p R if one can be created within
/// the given VF \p Range.
- VPRecipeBase *tryToCreateWidenRecipe(Instruction *Instr,
- ArrayRef<VPValue *> Operands,
- VFRange &Range);
+ VPRecipeBase *tryToCreateWidenRecipe(VPSingleDefRecipe *R, VFRange &Range);
/// Create and return a partial reduction recipe for a reduction instruction
/// along with binary operation and reduction phi operands.
More information about the llvm-commits
mailing list