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..aadfac2c9917b9a74c60c427c2413f01bfd852a1 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. |
| @@ -142,7 +144,10 @@ class HFlowEngine { |
| for (int i = 0; i < max; i++) { |
| HBasicBlock* succ = block->end()->SuccessorAt(i); |
| IncrementPredecessorCount(succ); |
| - if (StateAt(succ) == NULL) { |
| + if (succ->IsUnreachable()) { |
| + // Unreachable blocks do not modify state of predecessor. |
| + SetStateAt(succ, state); |
|
titzer
2014/01/14 13:40:32
This is still not quite correct, because an unreac
Igor Sheludko
2014/01/14 15:28:00
Done.
|
| + } else if (StateAt(succ) == NULL) { |
| // This is the first state to reach the successor. |
| if (max == 1 && succ->predecessors()->length() == 1) { |
| // Optimization: successor can inherit this state. |
| @@ -185,6 +190,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_); |