Skip to content

Commit 3eef601

Browse files
committed
!fixup address comments, thanks!
1 parent 5468f61 commit 3eef601

File tree

3 files changed

+54
-57
lines changed

3 files changed

+54
-57
lines changed

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2428,30 +2428,24 @@ InnerLoopVectorizer::getOrCreateVectorTripCount(BasicBlock *InsertBlock) {
24282428
return VectorTripCount;
24292429
}
24302430

2431-
/// Helper to connect both the vector and scalar preheaders to the Plan's
2432-
/// entry. This is used when adjusting \p Plan during skeleton
2433-
/// creation, i.e. adjusting the plan after introducing an initial runtime
2434-
/// check.
2435-
/// TODO: Connect scalar preheader during initial VPlan construction.
2436-
static void connectScalarPreheaderAsBypassInVPlan(VPlan &Plan) {
2437-
VPBlockBase *VectorPH = Plan.getVectorPreheader();
2438-
VPBlockBase *ScalarPH = Plan.getScalarPreheader();
2439-
VPBlockBase *Entry = Plan.getEntry();
2440-
VPBlockUtils::connectBlocks(Entry, ScalarPH);
2441-
std::swap(Entry->getSuccessors()[0], Entry->getSuccessors()[1]);
2442-
}
2443-
24442431
/// Introduces a new VPIRBasicBlock for \p CheckIRBB to \p Plan between the
2445-
/// vector preheader and its predecessor, also connecting to the scalar
2446-
/// preheader.
2432+
/// vector preheader and its predecessor, also connecting the new block to the
2433+
/// scalar preheader.
24472434
static void introduceCheckBlockInVPlan(VPlan &Plan, BasicBlock *CheckIRBB) {
2435+
24482436
VPBlockBase *ScalarPH = Plan.getScalarPreheader();
24492437
VPBlockBase *VectorPH = Plan.getVectorPreheader();
24502438
VPBlockBase *PreVectorPH = VectorPH->getSinglePredecessor();
2451-
assert(PreVectorPH->getSuccessors()[0] == ScalarPH && "Unexpected successor");
2452-
VPIRBasicBlock *CheckVPIRBB = VPIRBasicBlock::fromBasicBlock(CheckIRBB);
2453-
VPBlockUtils::connectBlocks(CheckVPIRBB, ScalarPH);
2454-
VPBlockUtils::insertOnEdge(PreVectorPH, VectorPH, CheckVPIRBB);
2439+
if (PreVectorPH->getNumSuccessors() != 1) {
2440+
assert(PreVectorPH->getNumSuccessors() == 2 && "Expected 2 successors");
2441+
assert(PreVectorPH->getSuccessors()[0] == ScalarPH &&
2442+
"Unexpected successor");
2443+
VPIRBasicBlock *CheckVPIRBB = VPIRBasicBlock::fromBasicBlock(CheckIRBB);
2444+
VPBlockUtils::insertOnEdge(PreVectorPH, VectorPH, CheckVPIRBB);
2445+
PreVectorPH = CheckVPIRBB;
2446+
}
2447+
VPBlockUtils::connectBlocks(PreVectorPH, ScalarPH);
2448+
PreVectorPH->swapSuccessors();
24552449
}
24562450

24572451
void InnerLoopVectorizer::emitIterationCountCheck(BasicBlock *Bypass) {
@@ -2536,7 +2530,7 @@ void InnerLoopVectorizer::emitIterationCountCheck(BasicBlock *Bypass) {
25362530
LoopBypassBlocks.push_back(TCCheckBlock);
25372531

25382532
// TODO: Wrap LoopVectorPreHeader in VPIRBasicBlock here.
2539-
connectScalarPreheaderAsBypassInVPlan(Plan);
2533+
introduceCheckBlockInVPlan(Plan, nullptr);
25402534
}
25412535

25422536
BasicBlock *InnerLoopVectorizer::emitSCEVChecks(BasicBlock *Bypass) {
@@ -7919,13 +7913,8 @@ EpilogueVectorizerMainLoop::emitIterationCountCheck(BasicBlock *Bypass,
79197913
setBranchWeights(BI, MinItersBypassWeights, /*IsExpected=*/false);
79207914
ReplaceInstWithInst(TCCheckBlock->getTerminator(), &BI);
79217915

7922-
// Connect the vector preheader to the scalar preheader when creating the trip
7923-
// count for the epilogue loop. Otherwise there is already a runtime check and
7924-
// connection to the scalar preheader, so we introduce it as new check block.
7925-
if (ForEpilogue)
7926-
connectScalarPreheaderAsBypassInVPlan(Plan);
7927-
else
7928-
introduceCheckBlockInVPlan(Plan, TCCheckBlock);
7916+
// Connect TCCheckblock to the VPlan.
7917+
introduceCheckBlockInVPlan(Plan, TCCheckBlock);
79297918
return TCCheckBlock;
79307919
}
79317920

@@ -8071,14 +8060,15 @@ EpilogueVectorizerEpilogueLoop::emitMinimumVectorEpilogueIterCountCheck(
80718060
ReplaceInstWithInst(Insert->getTerminator(), &BI);
80728061
LoopBypassBlocks.push_back(Insert);
80738062

8074-
// A new entry block has been created for the epilogue VPlan. Hook it in.
8063+
// A new entry block has been created for the epilogue VPlan. Hook it in, as
8064+
// otherwise we would try to modify the entry to the main vector loop.
80758065
VPIRBasicBlock *NewEntry = VPIRBasicBlock::fromBasicBlock(Insert);
80768066
VPBasicBlock *OldEntry = Plan.getEntry();
80778067
VPBlockUtils::reassociateBlocks(OldEntry, NewEntry);
80788068
Plan.setEntry(NewEntry);
80798069
delete OldEntry;
80808070

8081-
connectScalarPreheaderAsBypassInVPlan(Plan);
8071+
introduceCheckBlockInVPlan(Plan, nullptr);
80828072
return Insert;
80838073
}
80848074

llvm/lib/Transforms/Vectorize/VPlan.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -821,16 +821,16 @@ void VPRegionBlock::print(raw_ostream &O, const Twine &Indent,
821821
}
822822
#endif
823823

824-
VPlan::VPlan(VPBasicBlock *Preheader, VPValue *TC, VPBasicBlock *Entry,
825-
VPIRBasicBlock *ScalarHeader)
826-
: VPlan(Preheader, TC, ScalarHeader) {
827-
VPBlockUtils::connectBlocks(Preheader, Entry);
824+
VPlan::VPlan(VPBasicBlock *OriginalPreheader, VPValue *TC,
825+
VPBasicBlock *EntryVectorPreHeader, VPIRBasicBlock *ScalarHeader)
826+
: VPlan(OriginalPreheader, TC, ScalarHeader) {
827+
VPBlockUtils::connectBlocks(OriginalPreheader, EntryVectorPreHeader);
828828
}
829829

830-
VPlan::VPlan(VPBasicBlock *Preheader, VPBasicBlock *Entry,
831-
VPIRBasicBlock *ScalarHeader)
832-
: VPlan(Preheader, ScalarHeader) {
833-
VPBlockUtils::connectBlocks(Preheader, Entry);
830+
VPlan::VPlan(VPBasicBlock *OriginalPreheader,
831+
VPBasicBlock *EntryVectorPreHeader, VPIRBasicBlock *ScalarHeader)
832+
: VPlan(OriginalPreheader, ScalarHeader) {
833+
VPBlockUtils::connectBlocks(OriginalPreheader, EntryVectorPreHeader);
834834
}
835835

836836
VPlan::~VPlan() {
@@ -1187,6 +1187,7 @@ std::string VPlan::getName() const {
11871187
}
11881188

11891189
VPRegionBlock *VPlan::getVectorLoopRegion() {
1190+
// TODO: Cache if possible.
11901191
for (VPBlockBase *B : vp_depth_first_shallow(getEntry()))
11911192
if (auto *R = dyn_cast<VPRegionBlock>(B))
11921193
return R;
@@ -1200,6 +1201,16 @@ const VPRegionBlock *VPlan::getVectorLoopRegion() const {
12001201
return nullptr;
12011202
}
12021203

1204+
VPBasicBlock *VPlan::getScalarPreheader() const {
1205+
auto *MiddleVPBB =
1206+
cast<VPBasicBlock>(getVectorLoopRegion()->getSingleSuccessor());
1207+
auto *LastSucc = MiddleVPBB->getSuccessors().back();
1208+
// If scalar preheader is connected to VPlan, it is the last successor of
1209+
// MiddleVPBB. If this last successor is a VPIRBasicBlock, it is the Exit
1210+
// block rather than the scalar preheader.
1211+
return isa<VPIRBasicBlock>(LastSucc) ? nullptr : cast<VPBasicBlock>(LastSucc);
1212+
}
1213+
12031214
LLVM_DUMP_METHOD
12041215
void VPlan::printDOT(raw_ostream &O) const {
12051216
VPlanPrinter Printer(O, *this);
@@ -1292,15 +1303,6 @@ VPlan *VPlan::duplicate() {
12921303
return NewPlan;
12931304
}
12941305

1295-
VPBasicBlock *VPlan::getScalarPreheader() {
1296-
auto *MiddleVPBB =
1297-
cast<VPBasicBlock>(getVectorLoopRegion()->getSingleSuccessor());
1298-
auto *LastSucc = MiddleVPBB->getSuccessors().back();
1299-
// Order is strict: if the last successor is VPIRBasicBlock, it must be the
1300-
// single exit.
1301-
return isa<VPIRBasicBlock>(LastSucc) ? nullptr : cast<VPBasicBlock>(LastSucc);
1302-
}
1303-
13041306
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
13051307

13061308
Twine VPlanPrinter::getUID(const VPBlockBase *Block) {

llvm/lib/Transforms/Vectorize/VPlan.h

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,12 @@ class VPBlockBase {
621621
/// Remove all the successors of this block.
622622
void clearSuccessors() { Successors.clear(); }
623623

624+
/// Swap successors of the block. The block must have exactly 2 successors.
625+
void swapSuccessors() {
626+
assert(Successors.size() == 2 && "must have 2 successors to swap");
627+
std::swap(Successors[0], Successors[1]);
628+
}
629+
624630
/// The method which generates the output IR that correspond to this
625631
/// VPBlockBase, thereby "executing" the VPlan.
626632
virtual void execute(VPTransformState *State) = 0;
@@ -3814,14 +3820,15 @@ class VPlan {
38143820
}
38153821

38163822
/// Constructor variants that take disconnected preheader and entry blocks,
3817-
/// connecting them as part of construction. Only used to reduce the need of
3818-
/// code changes during transition.
3819-
VPlan(VPBasicBlock *Preheader, VPValue *TC, VPBasicBlock *Entry,
3820-
VPIRBasicBlock *ScalarHeader);
3821-
VPlan(VPBasicBlock *Preheader, VPBasicBlock *Entry,
3823+
/// connecting them as part of construction.
3824+
/// FIXME: Only used to reduce the need of code changes during transition.
3825+
VPlan(VPBasicBlock *OriginalPreheader, VPValue *TC,
3826+
VPBasicBlock *EntryVectorPreHeader, VPIRBasicBlock *ScalarHeader);
3827+
VPlan(VPBasicBlock *OriginalPreheader, VPBasicBlock *EntryVectorPreHeader,
38223828
VPIRBasicBlock *ScalarHeader);
38233829

3824-
/// Construct a VPlan with \p Entry to the plan.
3830+
/// Construct a VPlan with \p Entry to the plan and with \p ScalarHeader
3831+
/// wrapping the original header of the scalar loop.
38253832
VPlan(VPBasicBlock *Entry, VPIRBasicBlock *ScalarHeader)
38263833
: Entry(Entry), ScalarHeader(ScalarHeader) {
38273834
Entry->setPlan(this);
@@ -3883,9 +3890,7 @@ class VPlan {
38833890
}
38843891

38853892
/// Return the VPBasicBlock for the preheader of the scalar loop.
3886-
VPBasicBlock *getScalarPreheader() const {
3887-
return cast<VPBasicBlock>(ScalarHeader->getSinglePredecessor());
3888-
}
3893+
VPBasicBlock *getScalarPreheader() const;
38893894

38903895
/// Return the VPIRBasicBlock wrapping the header of the scalar loop.
38913896
VPIRBasicBlock *getScalarHeader() const { return ScalarHeader; }
@@ -4020,14 +4025,14 @@ class VPlan {
40204025
}
40214026

40224027
/// \return The block corresponding to the original preheader.
4028+
/// FIXME: There's no separate preheader any longer and Entry now serves the
4029+
/// same purpose as the original preheader. Remove after transition.
40234030
VPBasicBlock *getPreheader() { return Entry; }
40244031
const VPBasicBlock *getPreheader() const { return Entry; }
40254032

40264033
/// Clone the current VPlan, update all VPValues of the new VPlan and cloned
40274034
/// recipes to refer to the clones, and return it.
40284035
VPlan *duplicate();
4029-
4030-
VPBasicBlock *getScalarPreheader();
40314036
};
40324037

40334038
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)

0 commit comments

Comments
 (0)