diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2021-04-11 22:39:22 +0300 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2021-04-11 23:56:22 +0300 |
commit | 2def9c3d8ed9df5a5dc737343c891ac17de1afc1 (patch) | |
tree | 29fdc151e4bb56e38e7e30d5fe184e643b809abf | |
parent | [NFCI][DomTreeUpdater] applyUpdates(): reserve space for updates first (diff) | |
download | llvm-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.cpp | 15 |
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}); } |