Chromium Code Reviews| Index: src/compiler/scheduler.cc |
| diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc |
| index 0f3b4c4248dea93856a6c4a2a7b677f8c0abfba7..6f0676fae39a315af87c3e1de77698916d18e402 100644 |
| --- a/src/compiler/scheduler.cc |
| +++ b/src/compiler/scheduler.cc |
| @@ -1037,15 +1037,9 @@ void Scheduler::ComputeSpecialRPONumbering() { |
| } |
| -void Scheduler::GenerateImmediateDominatorTree() { |
| - Trace("--- IMMEDIATE BLOCK DOMINATORS -----------------------------\n"); |
| - |
| - // TODO(danno): Consider using Lengauer & Tarjan's if this becomes too slow. |
| - |
| - // Build the block dominator tree. |
| - schedule_->start()->set_dominator_depth(0); |
| - BasicBlock* second = schedule_->start()->rpo_next(); |
| - for (BasicBlock* block = second; block != NULL; block = block->rpo_next()) { |
| +// TODO(danno): Consider using Lengauer & Tarjan's if this becomes too slow. |
|
titzer
2014/11/27 10:59:59
I think we can remove this TODO
Michael Starzinger
2014/11/27 11:29:31
Done.
|
| +void Scheduler::PropagateImmediateDominators(BasicBlock* block) { |
| + for (/*nop*/; block != NULL; block = block->rpo_next()) { |
| BasicBlock::Predecessors::iterator pred = block->predecessors_begin(); |
| BasicBlock::Predecessors::iterator end = block->predecessors_end(); |
| DCHECK(pred != end); // All blocks except start have predecessors. |
| @@ -1068,6 +1062,17 @@ void Scheduler::GenerateImmediateDominatorTree() { |
| } |
| +void Scheduler::GenerateImmediateDominatorTree() { |
| + Trace("--- IMMEDIATE BLOCK DOMINATORS -----------------------------\n"); |
| + |
| + // Seed start block to be the first dominator. |
| + schedule_->start()->set_dominator_depth(0); |
| + |
| + // Build the block dominator tree resulting from the above seed. |
| + PropagateImmediateDominators(schedule_->start()->rpo_next()); |
| +} |
| + |
| + |
| // ----------------------------------------------------------------------------- |
| // Phase 3: Prepare use counts for nodes. |
| @@ -1434,11 +1439,11 @@ void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) { |
| // Iterate on phase 2: Compute special RPO and dominator tree. |
| special_rpo_->UpdateSpecialRPO(block, schedule_->block(node)); |
| // TODO(mstarzinger): Currently "iterate on" means "re-run". Fix that. |
| - for (BasicBlock* block : schedule_->all_blocks_) { |
| - block->set_dominator_depth(-1); |
| - block->set_dominator(NULL); |
| + for (BasicBlock* b = block->rpo_next(); b != NULL; b = b->rpo_next()) { |
| + b->set_dominator_depth(-1); |
| + b->set_dominator(NULL); |
| } |
| - GenerateImmediateDominatorTree(); |
| + PropagateImmediateDominators(block->rpo_next()); |
| // Iterate on phase 4: Schedule nodes early. |
| // TODO(mstarzinger): The following loop gathering the propagation roots is a |