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