Skip to content

Commit f139689

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 95c0c78 commit f139689

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 {
@@ -45,6 +44,7 @@ class VPRecipeBuilder;
4544
class VPBuilder {
4645
VPBasicBlock *BB = nullptr;
4746
VPBasicBlock::iterator InsertPt = VPBasicBlock::iterator();
47+
[[maybe_unused]] VPlan &Plan;
4848

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

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

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

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

393-
/// A builder used to construct the current plan.
394-
VPBuilder Builder;
395-
396391
/// Computes the cost of \p Plan for vectorization factor \p VF.
397392
///
398393
/// 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
@@ -8947,7 +8947,7 @@ static void addCanonicalIVRecipes(VPlan &Plan, Type *IdxTy, bool HasNUW,
89478947
VPBasicBlock *Header = TopRegion->getEntryBasicBlock();
89488948
Header->insert(CanonicalIVPHI, Header->begin());
89498949

8950-
VPBuilder Builder(TopRegion->getExitingBasicBlock());
8950+
VPBuilder Builder(Plan, TopRegion->getExitingBasicBlock());
89518951
// Add a VPInstruction to increment the scalar canonical IV by VF * UF.
89528952
auto *CanonicalIVIncrement = Builder.createOverflowingOp(
89538953
Instruction::Add, {CanonicalIVPHI, &Plan.getVFxUF()}, {HasNUW, false}, DL,
@@ -9007,9 +9007,9 @@ static void addScalarResumePhis(VPRecipeBuilder &Builder, VPlan &Plan,
90079007
auto *MiddleVPBB = cast<VPBasicBlock>(ScalarPH->getSinglePredecessor());
90089008
VPRegionBlock *VectorRegion = Plan.getVectorLoopRegion();
90099009
VPBuilder VectorPHBuilder(
9010-
cast<VPBasicBlock>(VectorRegion->getSinglePredecessor()));
9011-
VPBuilder MiddleBuilder(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9012-
VPBuilder ScalarPHBuilder(ScalarPH);
9010+
Plan, cast<VPBasicBlock>(VectorRegion->getSinglePredecessor()));
9011+
VPBuilder MiddleBuilder(Plan, MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9012+
VPBuilder ScalarPHBuilder(Plan, ScalarPH);
90139013
VPValue *OneVPV = Plan.getOrAddLiveIn(
90149014
ConstantInt::get(Plan.getCanonicalIV()->getScalarType(), 1));
90159015
for (VPRecipeBase &ScalarPhiR : *Plan.getScalarHeader()) {
@@ -9101,7 +9101,7 @@ addUsersInExitBlocks(VPlan &Plan,
91019101
return;
91029102

91039103
auto *MiddleVPBB = Plan.getMiddleBlock();
9104-
VPBuilder B(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9104+
VPBuilder B(Plan, MiddleVPBB, MiddleVPBB->getFirstNonPhi());
91059105

91069106
// Introduce extract for exiting values and update the VPIRInstructions
91079107
// modeling the corresponding LCSSA phis.
@@ -9123,8 +9123,8 @@ static void addExitUsersForFirstOrderRecurrences(
91239123
VPRegionBlock *VectorRegion = Plan.getVectorLoopRegion();
91249124
auto *ScalarPHVPBB = Plan.getScalarPreheader();
91259125
auto *MiddleVPBB = Plan.getMiddleBlock();
9126-
VPBuilder ScalarPHBuilder(ScalarPHVPBB);
9127-
VPBuilder MiddleBuilder(MiddleVPBB, MiddleVPBB->getFirstNonPhi());
9126+
VPBuilder ScalarPHBuilder(Plan, ScalarPHVPBB);
9127+
VPBuilder MiddleBuilder(Plan, MiddleVPBB, MiddleVPBB->getFirstNonPhi());
91289128
VPValue *TwoVPV = Plan.getOrAddLiveIn(
91299129
ConstantInt::get(Plan.getCanonicalIV()->getScalarType(), 2));
91309130

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

9264-
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE,
9265-
Builder);
9264+
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE);
92669265

92679266
// ---------------------------------------------------------------------------
92689267
// Pre-construction: record ingredients whose recipes we'll need to further
@@ -9318,7 +9317,7 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
93189317
// ingredients and fill a new VPBasicBlock.
93199318
if (VPBB != HeaderVPBB)
93209319
VPBB->setName(BB->getName());
9321-
Builder.setInsertPoint(VPBB);
9320+
RecipeBuilder.setInsertPoint(VPBB);
93229321

93239322
if (VPBB == HeaderVPBB)
93249323
RecipeBuilder.createHeaderMask();
@@ -9482,7 +9481,7 @@ LoopVectorizationPlanner::tryToBuildVPlanWithVPRecipes(VFRange &Range) {
94829481
// Sink users of fixed-order recurrence past the recipe defining the previous
94839482
// value and introduce FirstOrderRecurrenceSplice VPInstructions.
94849483
if (!VPlanTransforms::runPass(VPlanTransforms::adjustFixedOrderRecurrences,
9485-
*Plan, Builder))
9484+
*Plan, RecipeBuilder.getIRBuilder()))
94869485
return nullptr;
94879486

94889487
if (useActiveLaneMask(Style)) {
@@ -9532,8 +9531,7 @@ VPlanPtr LoopVectorizationPlanner::buildVPlan(VFRange &Range) {
95329531

95339532
// Collect mapping of IR header phis to header phi recipes, to be used in
95349533
// addScalarResumePhis.
9535-
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE,
9536-
Builder);
9534+
VPRecipeBuilder RecipeBuilder(*Plan, OrigLoop, TLI, &TTI, Legal, CM, PSE);
95379535
for (auto &R : Plan->getVectorLoopRegion()->getEntryBasicBlock()->phis()) {
95389536
if (isa<VPCanonicalIVPHIRecipe>(&R))
95399537
continue;
@@ -9698,6 +9696,7 @@ void LoopVectorizationPlanner::adjustRecipesForReductions(
96989696
}
96999697
}
97009698
VPBasicBlock *LatchVPBB = VectorLoopRegion->getExitingBasicBlock();
9699+
VPBuilder Builder(*Plan);
97019700
Builder.setInsertPoint(&*LatchVPBB->begin());
97029701
VPBasicBlock::iterator IP = MiddleVPBB->getFirstNonPhi();
97039702
for (VPRecipeBase &R :
@@ -10205,7 +10204,7 @@ static void preparePlanForMainVectorLoop(VPlan &MainPlan, VPlan &EpiPlan) {
1020510204
m_Specific(VectorTC), m_SpecificInt(0)));
1020610205
}))
1020710206
return;
10208-
VPBuilder ScalarPHBuilder(MainScalarPH, MainScalarPH->begin());
10207+
VPBuilder ScalarPHBuilder(MainPlan, MainScalarPH, MainScalarPH->begin());
1020910208
ScalarPHBuilder.createNaryOp(
1021010209
VPInstruction::ResumePhi,
1021110210
{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

@@ -65,7 +64,7 @@ class VPRecipeBuilder {
6564

6665
PredicatedScalarEvolution &PSE;
6766

68-
VPBuilder &Builder;
67+
VPBuilder Builder;
6968

7069
/// When we if-convert we need to create edge masks. We have to cache values
7170
/// 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
@@ -915,7 +915,7 @@ VPlanPtr VPlan::createInitialVPlan(Type *InductionTy,
915915
// of the corresponding compare because they may have ended up with
916916
// different line numbers and we want to avoid awkward line stepping while
917917
// debugging. Eg. if the compare has got a line number inside the loop.
918-
VPBuilder Builder(MiddleVPBB);
918+
VPBuilder Builder(*Plan, MiddleVPBB);
919919
VPValue *Cmp =
920920
TailFolded
921921
? 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
@@ -591,7 +591,7 @@ static void legalizeAndOptimizeInductions(VPlan &Plan) {
591591
using namespace llvm::VPlanPatternMatch;
592592
VPBasicBlock *HeaderVPBB = Plan.getVectorLoopRegion()->getEntryBasicBlock();
593593
bool HasOnlyVectorVFs = !Plan.hasVF(ElementCount::getFixed(1));
594-
VPBuilder Builder(HeaderVPBB, HeaderVPBB->getFirstNonPhi());
594+
VPBuilder Builder(Plan, HeaderVPBB, HeaderVPBB->getFirstNonPhi());
595595
for (VPRecipeBase &Phi : HeaderVPBB->phis()) {
596596
auto *PhiR = dyn_cast<VPWidenInductionRecipe>(&Phi);
597597
if (!PhiR)
@@ -744,7 +744,7 @@ void VPlanTransforms::optimizeInductionExitUsers(
744744
"predecessor must be the middle block");
745745

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

15101510
// Create the ActiveLaneMask instruction using the correct start values.
15111511
VPValue *TC = Plan.getTripCount();
@@ -1624,7 +1624,8 @@ void VPlanTransforms::addActiveLaneMask(
16241624
LaneMask = addVPLaneMaskPhiAndUpdateExitBranch(
16251625
Plan, DataAndControlFlowWithoutRuntimeCheck);
16261626
} else {
1627-
VPBuilder B = VPBuilder::getToInsertAfter(WideCanonicalIV);
1627+
VPBuilder B(Plan, WideCanonicalIV->getParent(),
1628+
std::next(WideCanonicalIV->getIterator()));
16281629
LaneMask = B.createNaryOp(VPInstruction::ActiveLaneMask,
16291630
{WideCanonicalIV, Plan.getTripCount()}, nullptr,
16301631
"active.lane.mask");
@@ -1828,7 +1829,7 @@ bool VPlanTransforms::tryAddExplicitVectorLength(
18281829
// Create the ExplicitVectorLengthPhi recipe in the main loop.
18291830
auto *EVLPhi = new VPEVLBasedIVPHIRecipe(StartV, DebugLoc());
18301831
EVLPhi->insertAfter(CanonicalIVPHI);
1831-
VPBuilder Builder(Header, Header->getFirstNonPhi());
1832+
VPBuilder Builder(Plan, Header, Header->getFirstNonPhi());
18321833
// Compute original TC - IV as the AVL (application vector length).
18331834
VPValue *AVL = Builder.createNaryOp(
18341835
Instruction::Sub, {Plan.getTripCount(), EVLPhi}, DebugLoc(), "avl");
@@ -1909,7 +1910,7 @@ void VPlanTransforms::dropPoisonGeneratingRecipes(
19091910
// where the operands are disjoint or poison otherwise.
19101911
if (match(RecWithFlags, m_BinaryOr(m_VPValue(A), m_VPValue(B))) &&
19111912
RecWithFlags->isDisjoint()) {
1912-
VPBuilder Builder(RecWithFlags);
1913+
VPBuilder Builder(Plan, RecWithFlags);
19131914
VPInstruction *New = Builder.createOverflowingOp(
19141915
Instruction::Add, {A, B}, {false, false},
19151916
RecWithFlags->getDebugLoc());
@@ -2023,7 +2024,7 @@ void VPlanTransforms::createInterleaveGroups(
20232024
/*IsSigned=*/true);
20242025
VPValue *OffsetVPV = Plan.getOrAddLiveIn(
20252026
ConstantInt::get(IRInsertPos->getParent()->getContext(), -Offset));
2026-
VPBuilder B(InsertPos);
2027+
VPBuilder B(Plan, InsertPos);
20272028
Addr = InBounds ? B.createInBoundsPtrAdd(InsertPos->getAddr(), OffsetVPV)
20282029
: B.createPtrAdd(InsertPos->getAddr(), OffsetVPV);
20292030
}
@@ -2069,7 +2070,7 @@ void VPlanTransforms::handleUncountableEarlyExit(
20692070
BasicBlock *UncountableExitingBlock, VPRecipeBuilder &RecipeBuilder) {
20702071
VPRegionBlock *LoopRegion = Plan.getVectorLoopRegion();
20712072
auto *LatchVPBB = cast<VPBasicBlock>(LoopRegion->getExiting());
2072-
VPBuilder Builder(LatchVPBB->getTerminator());
2073+
VPBuilder Builder(Plan, LatchVPBB->getTerminator());
20732074
auto *MiddleVPBB = Plan.getMiddleBlock();
20742075
VPValue *IsEarlyExitTaken = nullptr;
20752076

@@ -2110,8 +2111,8 @@ void VPlanTransforms::handleUncountableEarlyExit(
21102111
VPBlockUtils::connectBlocks(VectorEarlyExitVPBB, VPEarlyExitBlock);
21112112

21122113
// Update the exit phis in the early exit block.
2113-
VPBuilder MiddleBuilder(NewMiddle);
2114-
VPBuilder EarlyExitB(VectorEarlyExitVPBB);
2114+
VPBuilder MiddleBuilder(Plan, NewMiddle);
2115+
VPBuilder EarlyExitB(Plan, VectorEarlyExitVPBB);
21152116
for (VPRecipeBase &R : *VPEarlyExitBlock) {
21162117
auto *ExitIRI = cast<VPIRInstruction>(&R);
21172118
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)