Skip to content

Commit 734120d

Browse files
committed
VPlan: thread plan to VPBuilder (NFC)
Construct VPBuilder with a VPlan object, and change VPRecipeBuilder to own the VPBuilder, in preparation to use the VPlan object in VPBuilder to implement constant-folding. The VPlan reference in VPBuilder is unused for now.
1 parent c6b13a2 commit 734120d

File tree

7 files changed

+44
-46
lines changed

7 files changed

+44
-46
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorizationPlanner.h

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#define LLVM_TRANSFORMS_VECTORIZE_LOOPVECTORIZATIONPLANNER_H
2626

2727
#include "VPlan.h"
28-
#include "llvm/ADT/SmallSet.h"
2928
#include "llvm/Support/InstructionCost.h"
3029

3130
namespace llvm {
@@ -46,6 +45,7 @@ struct VFRange;
4645
class VPBuilder {
4746
VPBasicBlock *BB = nullptr;
4847
VPBasicBlock::iterator InsertPt = VPBasicBlock::iterator();
48+
[[maybe_unused]] VPlan &Plan;
4949

5050
/// Insert \p VPI in BB at InsertPt if BB is set.
5151
template <typename T> T *tryInsertInstruction(T *R) {
@@ -67,10 +67,15 @@ class VPBuilder {
6767
}
6868

6969
public:
70-
VPBuilder() = default;
71-
VPBuilder(VPBasicBlock *InsertBB) { setInsertPoint(InsertBB); }
72-
VPBuilder(VPRecipeBase *InsertPt) { setInsertPoint(InsertPt); }
73-
VPBuilder(VPBasicBlock *TheBB, VPBasicBlock::iterator IP) {
70+
VPBuilder(VPlan &Plan) : Plan(Plan) {}
71+
VPBuilder(VPlan &Plan, VPBasicBlock *InsertBB) : Plan(Plan) {
72+
setInsertPoint(InsertBB);
73+
}
74+
VPBuilder(VPlan &Plan, VPRecipeBase *InsertPt) : Plan(Plan) {
75+
setInsertPoint(InsertPt);
76+
}
77+
VPBuilder(VPlan &Plan, VPBasicBlock *TheBB, VPBasicBlock::iterator IP)
78+
: Plan(Plan) {
7479
setInsertPoint(TheBB, IP);
7580
}
7681

@@ -84,13 +89,6 @@ class VPBuilder {
8489
VPBasicBlock *getInsertBlock() const { return BB; }
8590
VPBasicBlock::iterator getInsertPoint() const { return InsertPt; }
8691

87-
/// Create a VPBuilder to insert after \p R.
88-
static VPBuilder getToInsertAfter(VPRecipeBase *R) {
89-
VPBuilder B;
90-
B.setInsertPoint(R->getParent(), std::next(R->getIterator()));
91-
return B;
92-
}
93-
9492
/// InsertPoint - A saved insertion point.
9593
class VPInsertPoint {
9694
VPBasicBlock *Block = nullptr;
@@ -394,9 +392,6 @@ class LoopVectorizationPlanner {
394392
/// Profitable vector factors.
395393
SmallVector<VectorizationFactor, 8> ProfitableVFs;
396394

397-
/// A builder used to construct the current plan.
398-
VPBuilder Builder;
399-
400395
/// Computes the cost of \p Plan for vectorization factor \p VF.
401396
///
402397
/// The current implementation requires access to the

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8986,7 +8986,7 @@ static void addCanonicalIVRecipes(VPlan &Plan, Type *IdxTy, bool HasNUW,
89868986
VPBasicBlock *Header = TopRegion->getEntryBasicBlock();
89878987
Header->insert(CanonicalIVPHI, Header->begin());
89888988

8989-
VPBuilder Builder(TopRegion->getExitingBasicBlock());
8989+
VPBuilder Builder(Plan, TopRegion->getExitingBasicBlock());
89908990
// Add a VPInstruction to increment the scalar canonical IV by VF * UF.
89918991
auto *CanonicalIVIncrement = Builder.createOverflowingOp(
89928992
Instruction::Add, {CanonicalIVPHI, &Plan.getVFxUF()}, {HasNUW, false}, DL,
@@ -9046,9 +9046,9 @@ static void addScalarResumePhis(VPRecipeBuilder &Builder, VPlan &Plan,
90469046
auto *MiddleVPBB = cast<VPBasicBlock>(ScalarPH->getSinglePredecessor());
90479047
VPRegionBlock *VectorRegion = Plan.getVectorLoopRegion();
90489048
VPBuilder VectorPHBuilder(
9049-
cast<VPBasicBlock>(VectorRegion->getSinglePredecessor()));
9050-
VPBuilder MiddleBuilder(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9051-
VPBuilder ScalarPHBuilder(ScalarPH);
9049+
Plan, cast<VPBasicBlock>(VectorRegion->getSinglePredecessor()));
9050+
VPBuilder MiddleBuilder(Plan, MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9051+
VPBuilder ScalarPHBuilder(Plan, ScalarPH);
90529052
VPValue *OneVPV = Plan.getOrAddLiveIn(
90539053
ConstantInt::get(Plan.getCanonicalIV()->getScalarType(), 1));
90549054
for (VPRecipeBase &ScalarPhiR : *Plan.getScalarHeader()) {
@@ -9140,7 +9140,7 @@ addUsersInExitBlocks(VPlan &Plan,
91409140
return;
91419141

91429142
auto *MiddleVPBB = Plan.getMiddleBlock();
9143-
VPBuilder B(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9143+
VPBuilder B(Plan, MiddleVPBB, MiddleVPBB->getFirstNonPhi());
91449144

91459145
// Introduce extract for exiting values and update the VPIRInstructions
91469146
// modeling the corresponding LCSSA phis.
@@ -9162,8 +9162,8 @@ static void addExitUsersForFirstOrderRecurrences(
91629162
VPRegionBlock *VectorRegion = Plan.getVectorLoopRegion();
91639163
auto *ScalarPHVPBB = Plan.getScalarPreheader();
91649164
auto *MiddleVPBB = Plan.getMiddleBlock();
9165-
VPBuilder ScalarPHBuilder(ScalarPHVPBB);
9166-
VPBuilder MiddleBuilder(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9165+
VPBuilder ScalarPHBuilder(Plan, ScalarPHVPBB);
9166+
VPBuilder MiddleBuilder(Plan, MiddleVPBB, MiddleVPBB->getFirstNonPhi());
91679167
VPValue *TwoVPV = Plan.getOrAddLiveIn(
91689168
ConstantInt::get(Plan.getCanonicalIV()->getScalarType(), 2));
91699169

@@ -9300,8 +9300,7 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
93009300
bool HasNUW = !IVUpdateMayOverflow || Style == TailFoldingStyle::None;
93019301
addCanonicalIVRecipes(*Plan, Legal->getWidestInductionType(), HasNUW, DL);
93029302

9303-
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE,
9304-
Builder);
9303+
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE);
93059304

93069305
// ---------------------------------------------------------------------------
93079306
// Pre-construction: record ingredients whose recipes we'll need to further
@@ -9357,7 +9356,7 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
93579356
// ingredients and fill a new VPBasicBlock.
93589357
if (VPBB != HeaderVPBB)
93599358
VPBB->setName(BB->getName());
9360-
Builder.setInsertPoint(VPBB);
9359+
RecipeBuilder.setInsertPoint(VPBB);
93619360

93629361
if (VPBB == HeaderVPBB)
93639362
RecipeBuilder.createHeaderMask();
@@ -9521,7 +9520,7 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
95219520
// Sink users of fixed-order recurrence past the recipe defining the previous
95229521
// value and introduce FirstOrderRecurrenceSplice VPInstructions.
95239522
if (!VPlanTransforms::runPass(VPlanTransforms::adjustFixedOrderRecurrences,
9524-
*Plan, Builder))
9523+
*Plan, RecipeBuilder.getIRBuilder()))
95259524
return nullptr;
95269525

95279526
if (useActiveLaneMask(Style)) {
@@ -9571,8 +9570,7 @@ VPlanPtr LoopVectorizationPlanner::buildVPlan(VFRange &Range) {
95719570

95729571
// Collect mapping of IR header phis to header phi recipes, to be used in
95739572
// addScalarResumePhis.
9574-
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE,
9575-
Builder);
9573+
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE);
95769574
for (auto &R : Plan->getVectorLoopRegion()->getEntryBasicBlock()->phis()) {
95779575
if (isa<VPCanonicalIVPHIRecipe>(&R))
95789576
continue;
@@ -9737,6 +9735,7 @@ void LoopVectorizationPlanner::adjustRecipesForReductions(
97379735
}
97389736
}
97399737
VPBasicBlock *LatchVPBB = VectorLoopRegion->getExitingBasicBlock();
9738+
VPBuilder Builder(*Plan);
97409739
Builder.setInsertPoint(&*LatchVPBB->begin());
97419740
VPBasicBlock::iterator IP = MiddleVPBB->getFirstNonPhi();
97429741
for (VPRecipeBase &R :
@@ -10248,7 +10247,7 @@ static void preparePlanForMainVectorLoop(VPlan &MainPlan, VPlan &EpiPlan) {
1024810247
m_Specific(VectorTC), m_SpecificInt(0)));
1024910248
}))
1025010249
return;
10251-
VPBuilder ScalarPHBuilder(MainScalarPH, MainScalarPH->begin());
10250+
VPBuilder ScalarPHBuilder(MainPlan, MainScalarPH, MainScalarPH->begin());
1025210251
ScalarPHBuilder.createNaryOp(
1025310252
VPInstruction::ResumePhi,
1025410253
{VectorTC, MainPlan.getCanonicalIV()->getStartValue()}, {},

llvm/lib/Transforms/Vectorize/VPRecipeBuilder.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include "LoopVectorizationPlanner.h"
1313
#include "VPlan.h"
1414
#include "llvm/ADT/DenseMap.h"
15-
#include "llvm/ADT/PointerUnion.h"
1615
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
1716
#include "llvm/IR/IRBuilder.h"
1817

@@ -66,7 +65,7 @@ class VPRecipeBuilder {
6665

6766
PredicatedScalarEvolution &PSE;
6867

69-
VPBuilder &Builder;
68+
VPBuilder Builder;
7069

7170
/// When we if-convert we need to create edge masks. We have to cache values
7271
/// so that we don't end up with exponential recursion/IR. Note that
@@ -155,9 +154,13 @@ class VPRecipeBuilder {
155154
const TargetTransformInfo *TTI,
156155
LoopVectorizationLegality *Legal,
157156
LoopVectorizationCostModel &CM,
158-
PredicatedScalarEvolution &PSE, VPBuilder &Builder)
157+
PredicatedScalarEvolution &PSE)
159158
: Plan(Plan), OrigLoop(OrigLoop), TLI(TLI), TTI(TTI), Legal(Legal),
160-
CM(CM), PSE(PSE), Builder(Builder) {}
159+
CM(CM), PSE(PSE), Builder(Plan) {}
160+
161+
void setInsertPoint(VPBasicBlock *VPBB) { Builder.setInsertPoint(VPBB); }
162+
163+
VPBuilder &getIRBuilder() { return Builder; }
161164

162165
std::optional<unsigned> getScalingForReduction(const Instruction *ExitInst) {
163166
auto It = ScaledReductionMap.find(ExitInst);

llvm/lib/Transforms/Vectorize/VPlan.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -922,7 +922,7 @@ VPlanPtr VPlan::createInitialVPlan(Type *InductionTy,
922922
// of the corresponding compare because they may have ended up with
923923
// different line numbers and we want to avoid awkward line stepping while
924924
// debugging. Eg. if the compare has got a line number inside the loop.
925-
VPBuilder Builder(MiddleVPBB);
925+
VPBuilder Builder(*Plan, MiddleVPBB);
926926
VPValue *Cmp =
927927
TailFolded
928928
? Plan->getOrAddLiveIn(ConstantInt::getTrue(

llvm/lib/Transforms/Vectorize/VPlanHCFGBuilder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class PlainCFGBuilder {
7272

7373
public:
7474
PlainCFGBuilder(Loop *Lp, LoopInfo *LI, VPlan &P)
75-
: TheLoop(Lp), LI(LI), Plan(P) {}
75+
: TheLoop(Lp), LI(LI), Plan(P), VPIRBuilder(Plan) {}
7676

7777
/// Build plain CFG for TheLoop and connects it to Plan's entry.
7878
void buildPlainCFG();

llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ static void legalizeAndOptimizeInductions(VPlan &Plan) {
592592
using namespace llvm::VPlanPatternMatch;
593593
VPBasicBlock *HeaderVPBB = Plan.getVectorLoopRegion()->getEntryBasicBlock();
594594
bool HasOnlyVectorVFs = !Plan.hasScalarVFOnly();
595-
VPBuilder Builder(HeaderVPBB, HeaderVPBB->getFirstNonPhi());
595+
VPBuilder Builder(Plan, HeaderVPBB, HeaderVPBB->getFirstNonPhi());
596596
for (VPRecipeBase &Phi : HeaderVPBB->phis()) {
597597
auto *PhiR = dyn_cast<VPWidenInductionRecipe>(&Phi);
598598
if (!PhiR)
@@ -745,7 +745,7 @@ void VPlanTransforms::optimizeInductionExitUsers(
745745
"predecessor must be the middle block");
746746

747747
VPTypeAnalysis TypeInfo(Plan.getCanonicalIV()->getScalarType());
748-
VPBuilder B(Plan.getMiddleBlock()->getTerminator());
748+
VPBuilder B(Plan, Plan.getMiddleBlock()->getTerminator());
749749
for (VPRecipeBase &R : *ExitVPBB) {
750750
auto *ExitIRI = cast<VPIRInstruction>(&R);
751751
if (!isa<PHINode>(ExitIRI->getInstruction()))
@@ -1503,7 +1503,7 @@ static VPActiveLaneMaskPHIRecipe *addVPLaneMaskPhiAndUpdateExitBranch(
15031503
// we have to take unrolling into account. Each part needs to start at
15041504
// Part * VF
15051505
auto *VecPreheader = Plan.getVectorPreheader();
1506-
VPBuilder Builder(VecPreheader);
1506+
VPBuilder Builder(Plan, VecPreheader);
15071507

15081508
// Create the ActiveLaneMask instruction using the correct start values.
15091509
VPValue *TC = Plan.getTripCount();
@@ -1622,7 +1622,8 @@ void VPlanTransforms::addActiveLaneMask(
16221622
LaneMask = addVPLaneMaskPhiAndUpdateExitBranch(
16231623
Plan, DataAndControlFlowWithoutRuntimeCheck);
16241624
} else {
1625-
VPBuilder B = VPBuilder::getToInsertAfter(WideCanonicalIV);
1625+
VPBuilder B(Plan, WideCanonicalIV->getParent(),
1626+
std::next(WideCanonicalIV->getIterator()));
16261627
LaneMask = B.createNaryOp(VPInstruction::ActiveLaneMask,
16271628
{WideCanonicalIV, Plan.getTripCount()}, nullptr,
16281629
"active.lane.mask");
@@ -1826,7 +1827,7 @@ bool VPlanTransforms::tryAddExplicitVectorLength(
18261827
// Create the ExplicitVectorLengthPhi recipe in the main loop.
18271828
auto *EVLPhi = new VPEVLBasedIVPHIRecipe(StartV, DebugLoc());
18281829
EVLPhi->insertAfter(CanonicalIVPHI);
1829-
VPBuilder Builder(Header, Header->getFirstNonPhi());
1830+
VPBuilder Builder(Plan, Header, Header->getFirstNonPhi());
18301831
// Compute original TC - IV as the AVL (application vector length).
18311832
VPValue *AVL = Builder.createNaryOp(
18321833
Instruction::Sub, {Plan.getTripCount(), EVLPhi}, DebugLoc(), "avl");
@@ -1907,7 +1908,7 @@ void VPlanTransforms::dropPoisonGeneratingRecipes(
19071908
// where the operands are disjoint or poison otherwise.
19081909
if (match(RecWithFlags, m_BinaryOr(m_VPValue(A), m_VPValue(B))) &&
19091910
RecWithFlags->isDisjoint()) {
1910-
VPBuilder Builder(RecWithFlags);
1911+
VPBuilder Builder(Plan, RecWithFlags);
19111912
VPInstruction *New = Builder.createOverflowingOp(
19121913
Instruction::Add, {A, B}, {false, false},
19131914
RecWithFlags->getDebugLoc());
@@ -2021,7 +2022,7 @@ void VPlanTransforms::createInterleaveGroups(
20212022
/*IsSigned=*/true);
20222023
VPValue *OffsetVPV = Plan.getOrAddLiveIn(
20232024
ConstantInt::get(IRInsertPos->getParent()->getContext(), -Offset));
2024-
VPBuilder B(InsertPos);
2025+
VPBuilder B(Plan, InsertPos);
20252026
Addr = InBounds ? B.createInBoundsPtrAdd(InsertPos->getAddr(), OffsetVPV)
20262027
: B.createPtrAdd(InsertPos->getAddr(), OffsetVPV);
20272028
}
@@ -2067,7 +2068,7 @@ void VPlanTransforms::handleUncountableEarlyExit(
20672068
BasicBlock *UncountableExitingBlock, VPRecipeBuilder &RecipeBuilder) {
20682069
VPRegionBlock *LoopRegion = Plan.getVectorLoopRegion();
20692070
auto *LatchVPBB = cast<VPBasicBlock>(LoopRegion->getExiting());
2070-
VPBuilder Builder(LatchVPBB->getTerminator());
2071+
VPBuilder Builder(Plan, LatchVPBB->getTerminator());
20712072
auto *MiddleVPBB = Plan.getMiddleBlock();
20722073
VPValue *IsEarlyExitTaken = nullptr;
20732074

@@ -2108,8 +2109,8 @@ void VPlanTransforms::handleUncountableEarlyExit(
21082109
VPBlockUtils::connectBlocks(VectorEarlyExitVPBB, VPEarlyExitBlock);
21092110

21102111
// Update the exit phis in the early exit block.
2111-
VPBuilder MiddleBuilder(NewMiddle);
2112-
VPBuilder EarlyExitB(VectorEarlyExitVPBB);
2112+
VPBuilder MiddleBuilder(Plan, NewMiddle);
2113+
VPBuilder EarlyExitB(Plan, VectorEarlyExitVPBB);
21132114
for (VPRecipeBase &R : *VPEarlyExitBlock) {
21142115
auto *ExitIRI = cast<VPIRInstruction>(&R);
21152116
auto *ExitPhi = dyn_cast<PHINode>(&ExitIRI->getInstruction());

llvm/lib/Transforms/Vectorize/VPlanUnroll.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ void UnrollState::unrollWidenInductionByUF(
156156
FMFs = ID.getInductionBinOp()->getFastMathFlags();
157157

158158
VPValue *VectorStep = &Plan.getVF();
159-
VPBuilder Builder(PH);
159+
VPBuilder Builder(Plan, PH);
160160
if (TypeInfo.inferScalarType(VectorStep) != IVTy) {
161161
Instruction::CastOps CastOp =
162162
IVTy->isFloatingPointTy() ? Instruction::UIToFP : Instruction::Trunc;

0 commit comments

Comments
 (0)