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