diff options
| author | 2015-06-24 12:50:33 +0000 | |
|---|---|---|
| committer | 2015-06-24 12:50:33 +0000 | |
| commit | d61d77d67a90f2e12ef89997e181f91f8858d7a8 (patch) | |
| tree | 50d71ef83f27827f0acfe6708acdb46e159f7506 /compiler/optimizing/dead_code_elimination.cc | |
| parent | a256ee9ccbd01407541958476f388ae7c687a9c2 (diff) | |
| parent | 1f82ecc6a0c9f88d03d6d1a6d95eeb8707bd06c1 (diff) | |
Merge "Recompute dominator tree after DCE."
Diffstat (limited to 'compiler/optimizing/dead_code_elimination.cc')
| -rw-r--r-- | compiler/optimizing/dead_code_elimination.cc | 9 |
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(); |