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 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node-properties.h" 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/node-properties-inl.h" 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/schedule.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler { 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const BasicBlockData::Control& c) { 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (c) { 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case BasicBlockData::kNone: 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << "none"; 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case BasicBlockData::kGoto: 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << "goto"; 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case BasicBlockData::kBranch: 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << "branch"; 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case BasicBlockData::kReturn: 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << "return"; 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case BasicBlockData::kThrow: 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os << "throw"; 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os; 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const Schedule& s) { 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(svenpanne) Const-correct the RPO stuff/iterators. 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlockVector* rpo = const_cast<Schedule*>(&s)->rpo_order(); 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (BasicBlockVectorIter i = rpo->begin(); i != rpo->end(); ++i) { 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock* block = *i; 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "--- BLOCK B" << block->id(); 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (block->PredecessorCount() != 0) os << " <- "; 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock::Predecessors predecessors = block->predecessors(); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool comma = false; 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (BasicBlock::Predecessors::iterator j = predecessors.begin(); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch j != predecessors.end(); ++j) { 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (comma) os << ", "; 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch comma = true; 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "B" << (*j)->id(); 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " ---\n"; 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (BasicBlock::const_iterator j = block->begin(); j != block->end(); 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ++j) { 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Node* node = *j; 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " " << *node; 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!NodeProperties::IsControl(node)) { 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Bounds bounds = NodeProperties::GetBounds(node); 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " : "; 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bounds.lower->PrintTo(os); 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!bounds.upper->Is(bounds.lower)) { 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << ".."; 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bounds.upper->PrintTo(os); 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "\n"; 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock::Control control = block->control_; 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (control != BasicBlock::kNone) { 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " "; 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (block->control_input_ != NULL) { 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << *block->control_input_; 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "Goto"; 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << " -> "; 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BasicBlock::Successors successors = block->successors(); 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch comma = false; 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (BasicBlock::Successors::iterator j = successors.begin(); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch j != successors.end(); ++j) { 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (comma) os << ", "; 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch comma = true; 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "B" << (*j)->id(); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch os << "\n"; 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return os; 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace compiler 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace internal 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} // namespace v8 89