Chromium Code Reviews| Index: runtime/vm/flow_graph_optimizer.cc | 
| =================================================================== | 
| --- runtime/vm/flow_graph_optimizer.cc (revision 11221) | 
| +++ runtime/vm/flow_graph_optimizer.cc (working copy) | 
| @@ -955,29 +955,45 @@ | 
| } | 
| -void LocalCSE::Optimize() { | 
| - for (intptr_t i = 0; i < blocks_.length(); ++i) { | 
| - BlockEntryInstr* entry = blocks_[i]; | 
| - DirectChainedHashMap<BindInstr*> map; | 
| - ASSERT(map.IsEmpty()); | 
| - for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) { | 
| - BindInstr* instr = it.Current()->AsBind(); | 
| - if (instr == NULL || instr->computation()->HasSideEffect()) continue; | 
| - BindInstr* result = map.Lookup(instr); | 
| - if (result == NULL) { | 
| - map.Insert(instr); | 
| - continue; | 
| - } | 
| - // Replace current with lookup result. | 
| - instr->ReplaceUsesWith(result); | 
| - it.RemoveCurrentFromGraph(); | 
| - if (FLAG_trace_optimization) { | 
| - OS::Print("Replacing v%d with v%d\n", | 
| - instr->ssa_temp_index(), | 
| - result->ssa_temp_index()); | 
| - } | 
| +void DominatorBasedCSE::Optimize(BlockEntryInstr* graph_entry) { | 
| + ASSERT(graph_entry->IsGraphEntry()); | 
| + DirectChainedHashMap<BindInstr*> map; | 
| + OptimizeRecursive(graph_entry, &map); | 
| +} | 
| + | 
| + | 
| +void DominatorBasedCSE::OptimizeRecursive( | 
| + BlockEntryInstr* block, | 
| + DirectChainedHashMap<BindInstr*>* map) { | 
| + for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) { | 
| + BindInstr* instr = it.Current()->AsBind(); | 
| + if (instr == NULL || instr->computation()->HasSideEffect()) continue; | 
| + BindInstr* result = map->Lookup(instr); | 
| + if (result == NULL) { | 
| + map->Insert(instr); | 
| + continue; | 
| } | 
| + // Replace current with lookup result. | 
| + instr->ReplaceUsesWith(result); | 
| + it.RemoveCurrentFromGraph(); | 
| + if (FLAG_trace_optimization) { | 
| + OS::Print("Replacing v%d with v%d\n", | 
| + instr->ssa_temp_index(), | 
| + result->ssa_temp_index()); | 
| + } | 
| } | 
| + | 
| + // Process children in the dominator tree recursively. | 
| + intptr_t num_children = block->dominated_blocks().length(); | 
| + for (intptr_t i = 0; i < num_children; ++i) { | 
| + BlockEntryInstr* child = block->dominated_blocks()[i]; | 
| + if (i < num_children - 1) { | 
| 
 
Kevin Millikin (Google)
2012/08/23 13:12:39
There's an extra space here for some reason.
 
Florian Schneider
2012/08/23 13:17:50
Done.
 
 | 
| + DirectChainedHashMap<BindInstr*> child_map(*map); // Copy map. | 
| + OptimizeRecursive(child, &child_map); | 
| + } else { | 
| + OptimizeRecursive(child, map); // Reuse map for the last child. | 
| + } | 
| + } | 
| } |