[llvm] ef1773a - [VPlan] Rewrite cloneSESE to use 2 depth-first passes (NFCI).
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 23 12:38:09 PDT 2024
Author: Florian Hahn
Date: 2024-06-23T20:37:51+01:00
New Revision: ef1773ad57507727e4cafdb43b9c28ac03e01ae5
URL: https://github.com/llvm/llvm-project/commit/ef1773ad57507727e4cafdb43b9c28ac03e01ae5
DIFF: https://github.com/llvm/llvm-project/commit/ef1773ad57507727e4cafdb43b9c28ac03e01ae5.diff
LOG: [VPlan] Rewrite cloneSESE to use 2 depth-first passes (NFCI).
Rewrite cloneSESE to perform 2 depth-first passes with the first one
cloning blocks and the second one updating the predecessors and
successors.
This is needed to preserve the correct predecessor/successor ordering
with https://github.com/llvm/llvm-project/pull/92651 and has been split
off as suggested.
Added:
Modified:
llvm/lib/Transforms/Vectorize/VPlan.cpp
llvm/lib/Transforms/Vectorize/VPlan.h
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.cpp b/llvm/lib/Transforms/Vectorize/VPlan.cpp
index af0376dd343d0..d6a5d841e69d7 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlan.cpp
@@ -655,22 +655,38 @@ static std::pair<VPBlockBase *, VPBlockBase *> cloneSESE(VPBlockBase *Entry);
// cloned region.
static std::pair<VPBlockBase *, VPBlockBase *> cloneSESE(VPBlockBase *Entry) {
DenseMap<VPBlockBase *, VPBlockBase *> Old2NewVPBlocks;
- ReversePostOrderTraversal<VPBlockShallowTraversalWrapper<VPBlockBase *>> RPOT(
- Entry);
- for (VPBlockBase *BB : RPOT) {
+ VPBlockBase *Exiting = nullptr;
+ // First, clone blocks reachable from Entry.
+ for (VPBlockBase *BB : vp_depth_first_shallow(Entry)) {
VPBlockBase *NewBB = BB->clone();
- for (VPBlockBase *Pred : BB->getPredecessors())
- VPBlockUtils::connectBlocks(Old2NewVPBlocks[Pred], NewBB);
-
Old2NewVPBlocks[BB] = NewBB;
+ if (BB->getNumSuccessors() == 0) {
+ assert(!Exiting && "Multiple exiting blocks?");
+ Exiting = BB;
+ }
+ }
+
+ // Second, update the predecessors & successors of the cloned blocks.
+ for (VPBlockBase *BB : vp_depth_first_shallow(Entry)) {
+ VPBlockBase *NewBB = Old2NewVPBlocks[BB];
+ SmallVector<VPBlockBase *> NewPreds;
+ for (VPBlockBase *Pred : BB->getPredecessors()) {
+ NewPreds.push_back(Old2NewVPBlocks[Pred]);
+ }
+ NewBB->setPredecessors(NewPreds);
+ SmallVector<VPBlockBase *> NewSuccs;
+ for (VPBlockBase *Succ : BB->successors()) {
+ NewSuccs.push_back(Old2NewVPBlocks[Succ]);
+ }
+ NewBB->setSuccessors(NewSuccs);
}
#if !defined(NDEBUG)
// Verify that the order of predecessors and successors matches in the cloned
// version.
- ReversePostOrderTraversal<VPBlockShallowTraversalWrapper<VPBlockBase *>>
- NewRPOT(Old2NewVPBlocks[Entry]);
- for (const auto &[OldBB, NewBB] : zip(RPOT, NewRPOT)) {
+ for (const auto &[OldBB, NewBB] :
+ zip(vp_depth_first_shallow(Entry),
+ vp_depth_first_shallow(Old2NewVPBlocks[Entry]))) {
for (const auto &[OldPred, NewPred] :
zip(OldBB->getPredecessors(), NewBB->getPredecessors()))
assert(NewPred == Old2NewVPBlocks[OldPred] && "Different predecessors");
@@ -681,8 +697,7 @@ static std::pair<VPBlockBase *, VPBlockBase *> cloneSESE(VPBlockBase *Entry) {
}
#endif
- return std::make_pair(Old2NewVPBlocks[Entry],
- Old2NewVPBlocks[*reverse(RPOT).begin()]);
+ return std::make_pair(Old2NewVPBlocks[Entry], Old2NewVPBlocks[Exiting]);
}
VPRegionBlock *VPRegionBlock::clone() {
diff --git a/llvm/lib/Transforms/Vectorize/VPlan.h b/llvm/lib/Transforms/Vectorize/VPlan.h
index fc25ed907b153..8916bab2aaf06 100644
--- a/llvm/lib/Transforms/Vectorize/VPlan.h
+++ b/llvm/lib/Transforms/Vectorize/VPlan.h
@@ -614,6 +614,15 @@ class VPBlockBase {
appendPredecessor(Pred);
}
+ /// Set each VPBasicBlock in \p NewSuccss as successor of this VPBlockBase.
+ /// This VPBlockBase must have no successors. This VPBlockBase is not added
+ /// as predecessor of any VPBasicBlock in \p NewSuccs.
+ void setSuccessors(ArrayRef<VPBlockBase *> NewSuccs) {
+ assert(Successors.empty() && "Block successors already set.");
+ for (auto *Succ : NewSuccs)
+ appendSuccessor(Succ);
+ }
+
/// Remove all the predecessor of this block.
void clearPredecessors() { Predecessors.clear(); }
More information about the llvm-commits
mailing list