diff options
author | Roman Lebedev <lebedev.ri@gmail.com> | 2021-04-11 23:17:48 +0300 |
---|---|---|
committer | Roman Lebedev <lebedev.ri@gmail.com> | 2021-04-11 23:56:23 +0300 |
commit | 0699da1569870a4f7cf26534b87ca3c3b14caf3b (patch) | |
tree | 0e854c11a4c5b5b66387d74df9edd143c1c7869a /llvm/lib/Transforms/Utils/Local.cpp | |
parent | e5692a564a73ef63b7baaf80c2b7a62ad74e9e66 (diff) | |
download | llvm-0699da1569870a4f7cf26534b87ca3c3b14caf3b.zip llvm-0699da1569870a4f7cf26534b87ca3c3b14caf3b.tar.gz llvm-0699da1569870a4f7cf26534b87ca3c3b14caf3b.tar.bz2 |
[NFCI][Local] MergeBasicBlockIntoOnlyPred(): improve Dominator Tree updating
Same as with TryToSimplifyUncondBranchFromEmptyBlock()/MergeBlockIntoPredecessor() patch.
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 10e1859..e285f8a 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -738,12 +738,15 @@ void llvm::MergeBasicBlockIntoOnlyPred(BasicBlock *DestBB, SmallVector<DominatorTree::UpdateType, 32> Updates; if (DTU) { - for (BasicBlock *PredPredBB : predecessors(PredBB)) { + SmallPtrSet<BasicBlock *, 2> PredsOfPredBB(pred_begin(PredBB), + pred_end(PredBB)); + Updates.reserve(Updates.size() + 2 * PredsOfPredBB.size() + 1); + for (BasicBlock *PredOfPredBB : PredsOfPredBB) // This predecessor of PredBB may already have DestBB as a successor. - if (!llvm::is_contained(successors(PredPredBB), DestBB)) - Updates.push_back({DominatorTree::Insert, PredPredBB, DestBB}); - Updates.push_back({DominatorTree::Delete, PredPredBB, PredBB}); - } + if (PredOfPredBB != PredBB) + Updates.push_back({DominatorTree::Insert, PredOfPredBB, DestBB}); + for (BasicBlock *PredOfPredBB : PredsOfPredBB) + Updates.push_back({DominatorTree::Delete, PredOfPredBB, PredBB}); Updates.push_back({DominatorTree::Delete, PredBB, DestBB}); } |