summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
diff options
context:
space:
mode:
authorAlina Sbirlea <asbirlea@google.com>2019-06-07 20:43:55 +0000
committerAlina Sbirlea <asbirlea@google.com>2019-06-07 20:43:55 +0000
commiteaea538d18c1df81877850704562bea5e4284bf8 (patch)
treeccfdf10f5a0880b0d2c2392e3aa212bd8cc34083 /llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
parentc3c18f4a0dc6806dd284b3650fd1ee7ac06ee3b6 (diff)
downloadbcm5719-llvm-eaea538d18c1df81877850704562bea5e4284bf8.tar.gz
bcm5719-llvm-eaea538d18c1df81877850704562bea5e4284bf8.zip
[DomTreeUpdater] Add all insert before all delete updates to reduce compile time.
Summary: The cleanup in D62751 introduced a compile-time regression due to the way DT updates are performed. Add all insert edges then all delete edges in DTU to match the previous compile time. Compile time on the test provided by @mstorsjo before and after this patch on my machine: 113.046s vs 35.649s Repro: clang -target x86_64-w64-mingw32 -c -O3 glew-preproc.c; on https://martin.st/temp/glew-preproc.c. Reviewers: kuhar, NutshellySima, mstorsjo Subscribers: jlebar, mstorsjo, dmgreen, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62981 llvm-svn: 362839
Diffstat (limited to 'llvm/lib/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/BasicBlockUtils.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
index 842434cca15..aa69a8d0088 100644
--- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -212,13 +212,19 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU,
std::vector<DominatorTree::UpdateType> Updates;
if (DTU) {
Updates.reserve(1 + (2 * succ_size(BB)));
- Updates.push_back({DominatorTree::Delete, PredBB, BB});
- for (auto I = succ_begin(BB), E = succ_end(BB); I != E; ++I) {
- Updates.push_back({DominatorTree::Delete, BB, *I});
+ // Add insert edges first. Experimentally, for the particular case of two
+ // blocks that can be merged, with a single successor and single predecessor
+ // respectively, it is beneficial to have all insert updates first. Deleting
+ // edges first may lead to unreachable blocks, followed by inserting edges
+ // making the blocks reachable again. Such DT updates lead to high compile
+ // times. We add inserts before deletes here to reduce compile time.
+ for (auto I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
// This successor of BB may already have PredBB as a predecessor.
if (llvm::find(successors(PredBB), *I) == succ_end(PredBB))
Updates.push_back({DominatorTree::Insert, PredBB, *I});
- }
+ for (auto I = succ_begin(BB), E = succ_end(BB); I != E; ++I)
+ Updates.push_back({DominatorTree::Delete, BB, *I});
+ Updates.push_back({DominatorTree::Delete, PredBB, BB});
}
if (MSSAU)
OpenPOWER on IntegriCloud