1// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/compiler/graph-replay.h"
6
7#include "src/compiler/common-operator.h"
8#include "src/compiler/graph.h"
9#include "src/compiler/graph-inl.h"
10#include "src/compiler/node.h"
11#include "src/compiler/operator.h"
12#include "src/compiler/operator-properties-inl.h"
13
14namespace v8 {
15namespace internal {
16namespace compiler {
17
18#ifdef DEBUG
19
20void GraphReplayPrinter::PrintReplay(Graph* graph) {
21  GraphReplayPrinter replay;
22  PrintF("  Node* nil = graph.NewNode(common_builder.Dead());\n");
23  graph->VisitNodeInputsFromEnd(&replay);
24}
25
26
27GenericGraphVisit::Control GraphReplayPrinter::Pre(Node* node) {
28  PrintReplayOpCreator(node->op());
29  PrintF("  Node* n%d = graph.NewNode(op", node->id());
30  for (int i = 0; i < node->InputCount(); ++i) {
31    PrintF(", nil");
32  }
33  PrintF("); USE(n%d);\n", node->id());
34  return GenericGraphVisit::CONTINUE;
35}
36
37
38void GraphReplayPrinter::PostEdge(Node* from, int index, Node* to) {
39  PrintF("  n%d->ReplaceInput(%d, n%d);\n", from->id(), index, to->id());
40}
41
42
43void GraphReplayPrinter::PrintReplayOpCreator(const Operator* op) {
44  IrOpcode::Value opcode = static_cast<IrOpcode::Value>(op->opcode());
45  const char* builder =
46      IrOpcode::IsCommonOpcode(opcode) ? "common_builder" : "js_builder";
47  const char* mnemonic = IrOpcode::IsCommonOpcode(opcode)
48                             ? IrOpcode::Mnemonic(opcode)
49                             : IrOpcode::Mnemonic(opcode) + 2;
50  PrintF("  op = %s.%s(", builder, mnemonic);
51  switch (opcode) {
52    case IrOpcode::kParameter:
53    case IrOpcode::kNumberConstant:
54      PrintF("0");
55      break;
56    case IrOpcode::kLoad:
57      PrintF("unique_name");
58      break;
59    case IrOpcode::kHeapConstant:
60      PrintF("unique_constant");
61      break;
62    case IrOpcode::kPhi:
63      PrintF("%d", op->InputCount());
64      break;
65    case IrOpcode::kEffectPhi:
66      PrintF("%d", OperatorProperties::GetEffectInputCount(op));
67      break;
68    case IrOpcode::kLoop:
69    case IrOpcode::kMerge:
70      PrintF("%d", OperatorProperties::GetControlInputCount(op));
71      break;
72    default:
73      break;
74  }
75  PrintF(");\n");
76}
77
78#endif  // DEBUG
79}
80}
81}  // namespace v8::internal::compiler
82