summaryrefslogtreecommitdiff
path: root/compiler/optimizing/dead_code_elimination.cc
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2015-06-24 12:50:33 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2015-06-24 12:50:33 +0000
commitd61d77d67a90f2e12ef89997e181f91f8858d7a8 (patch)
tree50d71ef83f27827f0acfe6708acdb46e159f7506 /compiler/optimizing/dead_code_elimination.cc
parenta256ee9ccbd01407541958476f388ae7c687a9c2 (diff)
parent1f82ecc6a0c9f88d03d6d1a6d95eeb8707bd06c1 (diff)
Merge "Recompute dominator tree after DCE."
Diffstat (limited to 'compiler/optimizing/dead_code_elimination.cc')
-rw-r--r--compiler/optimizing/dead_code_elimination.cc9
1 files changed, 9 insertions, 0 deletions
diff --git a/compiler/optimizing/dead_code_elimination.cc b/compiler/optimizing/dead_code_elimination.cc
index fdfe518e95..5de629d605 100644
--- a/compiler/optimizing/dead_code_elimination.cc
+++ b/compiler/optimizing/dead_code_elimination.cc
@@ -68,6 +68,7 @@ void HDeadCodeElimination::RemoveDeadBlocks() {
ArenaBitVector affected_loops(allocator, graph_->GetBlocks().Size(), false);
MarkReachableBlocks(graph_->GetEntryBlock(), &live_blocks);
+ bool removed_one_or_more_blocks = false;
// Remove all dead blocks. Iterate in post order because removal needs the
// block's chain of dominators and nested loops need to be updated from the
@@ -84,9 +85,17 @@ void HDeadCodeElimination::RemoveDeadBlocks() {
MaybeRecordDeadBlock(block);
MarkLoopHeadersContaining(*block, &affected_loops);
block->DisconnectAndDelete();
+ removed_one_or_more_blocks = true;
}
}
+ // If we removed at least one block, we need to recompute the full
+ // dominator tree.
+ if (removed_one_or_more_blocks) {
+ graph_->ClearDominanceInformation();
+ graph_->ComputeDominanceInformation();
+ }
+
// Connect successive blocks created by dead branches. Order does not matter.
for (HReversePostOrderIterator it(*graph_); !it.Done();) {
HBasicBlock* block = it.Current();