Chromium Code Reviews| Index: src/hydrogen-flow-engine.h |
| diff --git a/src/hydrogen-flow-engine.h b/src/hydrogen-flow-engine.h |
| index 4e1275546f611e2401e467484976f73d59b3e784..3cc6ee3e279a5dbb3369de70fbd2c6af38cfe778 100644 |
| --- a/src/hydrogen-flow-engine.h |
| +++ b/src/hydrogen-flow-engine.h |
| @@ -124,17 +124,19 @@ class HFlowEngine { |
| if (SkipNonDominatedBlock(root, block)) continue; |
| State* state = StateAt(block); |
| - if (block->IsLoopHeader()) { |
| - // Apply loop effects before analyzing loop body. |
| - ComputeLoopEffects(block)->Apply(state); |
| - } else { |
| - // Must have visited all predecessors before this block. |
| - CheckPredecessorCount(block); |
| - } |
| + if (block->IsReachable()) { |
| + if (block->IsLoopHeader()) { |
| + // Apply loop effects before analyzing loop body. |
| + ComputeLoopEffects(block)->Apply(state); |
| + } else { |
| + // Must have visited all predecessors before this block. |
| + CheckPredecessorCount(block); |
| + } |
| - // Go through all instructions of the current block, updating the state. |
| - for (HInstructionIterator it(block); !it.Done(); it.Advance()) { |
| - state = state->Process(it.Current(), zone_); |
| + // Go through all instructions of the current block, updating the state. |
| + for (HInstructionIterator it(block); !it.Done(); it.Advance()) { |
| + state = state->Process(it.Current(), zone_); |
| + } |
| } |
| // Propagate the block state forward to all successor blocks. |
| @@ -149,11 +151,11 @@ class HFlowEngine { |
| SetStateAt(succ, state); |
| } else { |
| // Successor needs a copy of the state. |
| - SetStateAt(succ, state->Copy(succ, zone_)); |
| + SetStateAt(succ, state->Copy(succ, block, zone_)); |
| } |
| } else { |
| // Merge the current state with the state already at the successor. |
| - SetStateAt(succ, state->Merge(succ, StateAt(succ), zone_)); |
| + StateAt(succ)->Merge(succ, state, block, zone_); |
|
titzer
2014/01/27 12:42:32
You will want to keep SetStateAt() as per previous
Igor Sheludko
2014/01/28 16:55:42
Done.
|
| } |
| } |
| } |
| @@ -185,6 +187,7 @@ class HFlowEngine { |
| i = member->loop_information()->GetLastBackEdge()->block_id(); |
| } else { |
| // Process all the effects of the block. |
| + if (member->IsUnreachable()) continue; |
| ASSERT(member->current_loop() == loop); |
| for (HInstructionIterator it(member); !it.Done(); it.Advance()) { |
| effects->Process(it.Current(), zone_); |