33 void HInferTypesPhase::InferTypes(
int from_inclusive,
int to_inclusive) {
34 for (
int i = from_inclusive; i <= to_inclusive; ++i) {
35 HBasicBlock* block =
graph()->blocks()->at(i);
37 const ZoneList<HPhi*>* phis = block->phis();
38 for (
int j = 0; j < phis->length(); j++) {
39 phis->at(j)->UpdateInferredType();
42 for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
43 it.Current()->UpdateInferredType();
46 if (block->IsLoopHeader()) {
47 HBasicBlock* last_back_edge =
48 block->loop_information()->GetLastBackEdge();
49 InferTypes(i + 1, last_back_edge->block_id());
51 i = last_back_edge->block_id();
54 for (
int j = 0; j < block->phis()->length(); ++j) {
55 HPhi* phi = block->phis()->at(j);
56 worklist_.Add(phi, zone());
57 in_worklist_.
Add(phi->id());
59 while (!worklist_.is_empty()) {
60 HValue* current = worklist_.RemoveLast();
61 in_worklist_.
Remove(current->id());
62 if (current->UpdateInferredType()) {
63 for (HUseIterator it(current->uses()); !it.Done(); it.Advance()) {
64 HValue* use = it.value();
65 if (!in_worklist_.
Contains(use->id())) {
66 in_worklist_.
Add(use->id());
67 worklist_.Add(use, zone());
#define ASSERT(condition)
bool Contains(int i) const