[llvm] cfde685 - [VPlan] Sink VPB2IRBB lookups to VPRecipeBuilder (NFC).
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sat May 10 14:01:09 PDT 2025
Author: Florian Hahn
Date: 2025-05-10T22:00:58+01:00
New Revision: cfde685e22d7babe0693fd4daf90e3bc20e98ec0
URL: https://github.com/llvm/llvm-project/commit/cfde685e22d7babe0693fd4daf90e3bc20e98ec0
DIFF: https://github.com/llvm/llvm-project/commit/cfde685e22d7babe0693fd4daf90e3bc20e98ec0.diff
LOG: [VPlan] Sink VPB2IRBB lookups to VPRecipeBuilder (NFC).
This allows migrating some more code to be based on VPBBs in
VPRecipeBuilder, in preparation for
https://github.com/llvm/llvm-project/pull/128420.
Added:
Modified:
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
llvm/lib/Transforms/Vectorize/VPlanTransforms.h
llvm/unittests/Transforms/Vectorize/VPlanTestBase.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
index aabb04d03bc8d..0b8b0c7dcdfc9 100644
--- a/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -9378,7 +9378,7 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range,
return !CM.requiresScalarEpilogue(VF.isVector());
},
Range);
- DenseMap<VPBlockBase *, BasicBlock *> VPB2IRBB;
+ DenseMap<const VPBlockBase *, BasicBlock *> VPB2IRBB;
auto Plan = VPlanTransforms::buildPlainCFG(OrigLoop, *LI, VPB2IRBB);
VPlanTransforms::prepareForVectorization(
*Plan, Legal->getWidestInductionType(), PSE, RequiresScalarEpilogueCheck,
@@ -9412,7 +9412,7 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range,
}
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE,
- Builder, LVer);
+ Builder, VPB2IRBB, LVer);
// ---------------------------------------------------------------------------
// Pre-construction: record ingredients whose recipes we'll need to further
@@ -9476,7 +9476,7 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range,
// FIXME: At the moment, masks need to be placed at the beginning of the
// block, as blends introduced for phi nodes need to use it. The created
// blends should be sunk after the mask recipes.
- RecipeBuilder.createBlockInMask(VPB2IRBB.lookup(VPBB));
+ RecipeBuilder.createBlockInMask(VPBB);
}
// Convert input VPInstructions to widened recipes.
@@ -9681,7 +9681,7 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan(VFRange &Range) {
assert(!OrigLoop->isInnermost());
assert(EnableVPlanNativePath && "VPlan-native path is not enabled.");
- DenseMap<VPBlockBase *, BasicBlock *> VPB2IRBB;
+ DenseMap<const VPBlockBase *, BasicBlock *> VPB2IRBB;
auto Plan = VPlanTransforms::buildPlainCFG(OrigLoop, *LI, VPB2IRBB);
VPlanTransforms::prepareForVectorization(
*Plan, Legal->getWidestInductionType(), PSE, true, false, OrigLoop,
@@ -9702,7 +9702,7 @@ VPlanPtr LoopVectorizationPlanner::tryToBuildVPlan(VFRange &Range) {
// Collect mapping of IR header phis to header phi recipes, to be used in
// addScalarResumePhis.
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE,
- Builder, nullptr /*LVer*/);
+ Builder, VPB2IRBB, nullptr /*LVer*/);
for (auto &R : Plan->getVectorLoopRegion()->getEntryBasicBlock()->phis()) {
if (isa<VPCanonicalIVPHIRecipe>(&R))
continue;
diff --git a/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h b/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
index caa18e263676b..5c7a3aa9f68d7 100644
--- a/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
+++ b/llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h
@@ -90,6 +90,10 @@ class VPRecipeBuilder {
/// A mapping of partial reduction exit instructions to their scaling factor.
DenseMap<const Instruction *, unsigned> ScaledReductionMap;
+ /// A mapping from VP blocks to IR blocks, used temporarily while migrating
+ /// away from IR references.
+ const DenseMap<const VPBlockBase *, BasicBlock *> &VPB2IRBB;
+
/// Loop versioning instance for getting noalias metadata guaranteed by
/// runtime checks.
LoopVersioning *LVer;
@@ -160,9 +164,10 @@ class VPRecipeBuilder {
LoopVectorizationLegality *Legal,
LoopVectorizationCostModel &CM,
PredicatedScalarEvolution &PSE, VPBuilder &Builder,
+ const DenseMap<const VPBlockBase *, BasicBlock *> &VPB2IRBB,
LoopVersioning *LVer)
: Plan(Plan), OrigLoop(OrigLoop), TLI(TLI), TTI(TTI), Legal(Legal),
- CM(CM), PSE(PSE), Builder(Builder), LVer(LVer) {}
+ CM(CM), PSE(PSE), Builder(Builder), VPB2IRBB(VPB2IRBB), LVer(LVer) {}
std::optional<unsigned> getScalingForReduction(const Instruction *ExitInst) {
auto It = ScaledReductionMap.find(ExitInst);
@@ -199,8 +204,16 @@ class VPRecipeBuilder {
/// A helper function that computes the predicate of the block BB, assuming
/// that the header block of the loop is set to True or the loop mask when
/// tail folding.
+ void createBlockInMask(const VPBasicBlock *VPBB) {
+ return createBlockInMask(VPB2IRBB.lookup(VPBB));
+ }
void createBlockInMask(BasicBlock *BB);
+ /// Returns the *entry* mask for the block \p VPBB.
+ VPValue *getBlockInMask(const VPBasicBlock *VPBB) const {
+ return getBlockInMask(VPB2IRBB.lookup(VPBB));
+ }
+
/// Returns the *entry* mask for the block \p BB.
VPValue *getBlockInMask(BasicBlock *BB) const;
@@ -213,6 +226,9 @@ class VPRecipeBuilder {
/// A helper that returns the previously computed predicate of the edge
/// between SRC and DST.
+ VPValue *getEdgeMask(const VPBasicBlock *Src, const VPBasicBlock *Dst) const {
+ return getEdgeMask(VPB2IRBB.lookup(Src), VPB2IRBB.lookup(Dst));
+ }
VPValue *getEdgeMask(BasicBlock *Src, BasicBlock *Dst) const;
/// Return the recipe created for given ingredient.
diff --git a/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp b/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
index a0edd296caab8..35e5415a6d4e3 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanConstruction.cpp
@@ -67,7 +67,7 @@ class PlainCFGBuilder {
/// Build plain CFG for TheLoop and connects it to Plan's entry.
std::unique_ptr<VPlan>
- buildPlainCFG(DenseMap<VPBlockBase *, BasicBlock *> &VPB2IRBB);
+ buildPlainCFG(DenseMap<const VPBlockBase *, BasicBlock *> &VPB2IRBB);
};
} // anonymous namespace
@@ -243,7 +243,7 @@ void PlainCFGBuilder::createVPInstructionsForVPBB(VPBasicBlock *VPBB,
// Main interface to build the plain CFG.
std::unique_ptr<VPlan> PlainCFGBuilder::buildPlainCFG(
- DenseMap<VPBlockBase *, BasicBlock *> &VPB2IRBB) {
+ DenseMap<const VPBlockBase *, BasicBlock *> &VPB2IRBB) {
VPIRBasicBlock *Entry = cast<VPIRBasicBlock>(Plan->getEntry());
BB2VPBB[Entry->getIRBasicBlock()] = Entry;
for (VPIRBasicBlock *ExitVPBB : Plan->getExitBlocks())
@@ -343,7 +343,7 @@ std::unique_ptr<VPlan> PlainCFGBuilder::buildPlainCFG(
std::unique_ptr<VPlan> VPlanTransforms::buildPlainCFG(
Loop *TheLoop, LoopInfo &LI,
- DenseMap<VPBlockBase *, BasicBlock *> &VPB2IRBB) {
+ DenseMap<const VPBlockBase *, BasicBlock *> &VPB2IRBB) {
PlainCFGBuilder Builder(TheLoop, &LI);
return Builder.buildPlainCFG(VPB2IRBB);
}
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
index 7a05816f2e2da..cb127d37661c7 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.h
@@ -55,7 +55,7 @@ struct VPlanTransforms {
static std::unique_ptr<VPlan>
buildPlainCFG(Loop *TheLoop, LoopInfo &LI,
- DenseMap<VPBlockBase *, BasicBlock *> &VPB2IRBB);
+ DenseMap<const VPBlockBase *, BasicBlock *> &VPB2IRBB);
/// Prepare the plan for vectorization. It will introduce a dedicated
/// VPBasicBlock for the vector pre-header as well as a VPBasicBlock as exit
diff --git a/llvm/unittests/Transforms/Vectorize/VPlanTestBase.h b/llvm/unittests/Transforms/Vectorize/VPlanTestBase.h
index bf67a5596b270..d9bd413bcc186 100644
--- a/llvm/unittests/Transforms/Vectorize/VPlanTestBase.h
+++ b/llvm/unittests/Transforms/Vectorize/VPlanTestBase.h
@@ -70,7 +70,7 @@ class VPlanTestIRBase : public testing::Test {
Loop *L = LI->getLoopFor(LoopHeader);
PredicatedScalarEvolution PSE(*SE, *L);
- DenseMap<VPBlockBase *, BasicBlock *> VPB2IRBB;
+ DenseMap<const VPBlockBase *, BasicBlock *> VPB2IRBB;
auto Plan = VPlanTransforms::buildPlainCFG(L, *LI, VPB2IRBB);
VPlanTransforms::prepareForVectorization(*Plan, IntegerType::get(*Ctx, 64),
PSE, true, false, L, {});
More information about the llvm-commits
mailing list