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 |