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