aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Lebedev <lebedev.ri@gmail.com>2021-04-11 22:39:22 +0300
committerRoman Lebedev <lebedev.ri@gmail.com>2021-04-11 23:56:22 +0300
commit2def9c3d8ed9df5a5dc737343c891ac17de1afc1 (patch)
tree29fdc151e4bb56e38e7e30d5fe184e643b809abf
parent[NFCI][DomTreeUpdater] applyUpdates(): reserve space for updates first (diff)
downloadllvm-project-2def9c3d8ed9df5a5dc737343c891ac17de1afc1.tar.gz
llvm-project-2def9c3d8ed9df5a5dc737343c891ac17de1afc1.tar.bz2
llvm-project-2def9c3d8ed9df5a5dc737343c891ac17de1afc1.zip
[NFCI][Local] TryToSimplifyUncondBranchFromEmptyBlock(): improve Dominator Tree updating
First, we don't need vector-ness for the predecessor lists. Secondly, like elsewhere, do insertions before deletions. Lastly, the check that we actually need to insert an edge, that it doesn't exist already, is backwards. Instead of looking at successors of every single 'PredOfBB', just always look at predecessors of the 'Succ'. The result is always the same, but we avoid *really* inefficient code.
-rw-r--r--llvm/lib/Transforms/Utils/Local.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index 6f30d17e87c6..10e185956a49 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -1072,14 +1072,15 @@ bool llvm::TryToSimplifyUncondBranchFromEmptyBlock(BasicBlock *BB,
SmallVector<DominatorTree::UpdateType, 32> Updates;
if (DTU) {
// All predecessors of BB will be moved to Succ.
- SmallSetVector<BasicBlock *, 8> Predecessors(pred_begin(BB), pred_end(BB));
- Updates.reserve(Updates.size() + 2 * Predecessors.size());
- for (auto *Predecessor : Predecessors) {
+ SmallPtrSet<BasicBlock *, 8> PredsOfBB(pred_begin(BB), pred_end(BB));
+ SmallPtrSet<BasicBlock *, 8> PredsOfSucc(pred_begin(Succ), pred_end(Succ));
+ Updates.reserve(Updates.size() + 2 * PredsOfBB.size() + 1);
+ for (auto *PredOfBB : PredsOfBB)
// This predecessor of BB may already have Succ as a successor.
- if (!llvm::is_contained(successors(Predecessor), Succ))
- Updates.push_back({DominatorTree::Insert, Predecessor, Succ});
- Updates.push_back({DominatorTree::Delete, Predecessor, BB});
- }
+ if (!PredsOfSucc.contains(PredOfBB))
+ Updates.push_back({DominatorTree::Insert, PredOfBB, Succ});
+ for (auto *PredOfBB : PredsOfBB)
+ Updates.push_back({DominatorTree::Delete, PredOfBB, BB});
Updates.push_back({DominatorTree::Delete, BB, Succ});
}