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