| OLD | NEW |
| (Empty) |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "src/hydrogen-infer-types.h" | |
| 6 | |
| 7 namespace v8 { | |
| 8 namespace internal { | |
| 9 | |
| 10 void HInferTypesPhase::InferTypes(int from_inclusive, int to_inclusive) { | |
| 11 for (int i = from_inclusive; i <= to_inclusive; ++i) { | |
| 12 HBasicBlock* block = graph()->blocks()->at(i); | |
| 13 | |
| 14 const ZoneList<HPhi*>* phis = block->phis(); | |
| 15 for (int j = 0; j < phis->length(); j++) { | |
| 16 phis->at(j)->UpdateInferredType(); | |
| 17 } | |
| 18 | |
| 19 for (HInstructionIterator it(block); !it.Done(); it.Advance()) { | |
| 20 it.Current()->UpdateInferredType(); | |
| 21 } | |
| 22 | |
| 23 if (block->IsLoopHeader()) { | |
| 24 HBasicBlock* last_back_edge = | |
| 25 block->loop_information()->GetLastBackEdge(); | |
| 26 InferTypes(i + 1, last_back_edge->block_id()); | |
| 27 // Skip all blocks already processed by the recursive call. | |
| 28 i = last_back_edge->block_id(); | |
| 29 // Update phis of the loop header now after the whole loop body is | |
| 30 // guaranteed to be processed. | |
| 31 for (int j = 0; j < block->phis()->length(); ++j) { | |
| 32 HPhi* phi = block->phis()->at(j); | |
| 33 worklist_.Add(phi, zone()); | |
| 34 in_worklist_.Add(phi->id()); | |
| 35 } | |
| 36 while (!worklist_.is_empty()) { | |
| 37 HValue* current = worklist_.RemoveLast(); | |
| 38 in_worklist_.Remove(current->id()); | |
| 39 if (current->UpdateInferredType()) { | |
| 40 for (HUseIterator it(current->uses()); !it.Done(); it.Advance()) { | |
| 41 HValue* use = it.value(); | |
| 42 if (!in_worklist_.Contains(use->id())) { | |
| 43 in_worklist_.Add(use->id()); | |
| 44 worklist_.Add(use, zone()); | |
| 45 } | |
| 46 } | |
| 47 } | |
| 48 } | |
| 49 DCHECK(in_worklist_.IsEmpty()); | |
| 50 } | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 } // namespace internal | |
| 55 } // namespace v8 | |
| OLD | NEW |