aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/Local.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/Local.cpp13
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});
}