17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file. 47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node.h" 67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-properties.h" 77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-properties-inl.h" 87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/schedule.h" 97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/ostreams.h" 107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 { 127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal { 137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler { 147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgOStream& operator<<(OStream& os, const BasicBlockData::Control& c) { 167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org switch (c) { 177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case BasicBlockData::kNone: 187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os << "none"; 197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case BasicBlockData::kGoto: 207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os << "goto"; 217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case BasicBlockData::kBranch: 227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os << "branch"; 237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case BasicBlockData::kReturn: 247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os << "return"; 257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org case BasicBlockData::kThrow: 267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os << "throw"; 277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org UNREACHABLE(); 297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os; 307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgOStream& operator<<(OStream& os, const Schedule& s) { 347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // TODO(svenpanne) Const-correct the RPO stuff/iterators. 357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlockVector* rpo = const_cast<Schedule*>(&s)->rpo_order(); 367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (BasicBlockVectorIter i = rpo->begin(); i != rpo->end(); ++i) { 377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlock* block = *i; 387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << "--- BLOCK B" << block->id(); 397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (block->PredecessorCount() != 0) os << " <- "; 407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlock::Predecessors predecessors = block->predecessors(); 417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org bool comma = false; 427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (BasicBlock::Predecessors::iterator j = predecessors.begin(); 437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org j != predecessors.end(); ++j) { 447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (comma) os << ", "; 457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org comma = true; 467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << "B" << (*j)->id(); 477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << " ---\n"; 497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (BasicBlock::const_iterator j = block->begin(); j != block->end(); 507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org ++j) { 517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Node* node = *j; 527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << " " << *node; 537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!NodeProperties::IsControl(node)) { 547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Bounds bounds = NodeProperties::GetBounds(node); 557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << " : "; 567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org bounds.lower->PrintTo(os); 577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (!bounds.upper->Is(bounds.lower)) { 587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << ".."; 597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org bounds.upper->PrintTo(os); 607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << "\n"; 637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlock::Control control = block->control_; 657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (control != BasicBlock::kNone) { 667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << " "; 677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (block->control_input_ != NULL) { 687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << *block->control_input_; 697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << "Goto"; 717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << " -> "; 737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org BasicBlock::Successors successors = block->successors(); 747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org comma = false; 757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org for (BasicBlock::Successors::iterator j = successors.begin(); 767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org j != successors.end(); ++j) { 777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (comma) os << ", "; 787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org comma = true; 797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << "B" << (*j)->id(); 807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org os << "\n"; 827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return os; 857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} 867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace compiler 877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace internal 887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org} // namespace v8 89