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