graph-replay.cc 2.29 KB
Newer Older
1 2 3 4 5 6
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/compiler/graph-replay.h"

7
#include "src/compiler/all-nodes.h"
8 9 10 11
#include "src/compiler/common-operator.h"
#include "src/compiler/graph.h"
#include "src/compiler/node.h"
#include "src/compiler/operator.h"
12
#include "src/compiler/operator-properties.h"
13 14 15 16 17 18 19 20 21 22

namespace v8 {
namespace internal {
namespace compiler {

#ifdef DEBUG

void GraphReplayPrinter::PrintReplay(Graph* graph) {
  GraphReplayPrinter replay;
  PrintF("  Node* nil = graph.NewNode(common_builder.Dead());\n");
23 24 25 26 27 28 29 30 31 32 33
  Zone zone;
  AllNodes nodes(&zone, graph);

  // Allocate the nodes first.
  for (Node* node : nodes.live) {
    PrintReplayOpCreator(node->op());
    PrintF("  Node* n%d = graph.NewNode(op", node->id());
    for (int i = 0; i < node->InputCount(); ++i) {
      PrintF(", nil");
    }
    PrintF("); USE(n%d);\n", node->id());
34 35
  }

36 37 38 39 40 41 42
  // Connect the nodes to their inputs.
  for (Node* node : nodes.live) {
    for (int i = 0; i < node->InputCount(); i++) {
      PrintF("  n%d->ReplaceInput(%d, n%d);\n", node->id(), i,
             node->InputAt(i)->id());
    }
  }
43 44 45
}


46
void GraphReplayPrinter::PrintReplayOpCreator(const Operator* op) {
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
  IrOpcode::Value opcode = static_cast<IrOpcode::Value>(op->opcode());
  const char* builder =
      IrOpcode::IsCommonOpcode(opcode) ? "common_builder" : "js_builder";
  const char* mnemonic = IrOpcode::IsCommonOpcode(opcode)
                             ? IrOpcode::Mnemonic(opcode)
                             : IrOpcode::Mnemonic(opcode) + 2;
  PrintF("  op = %s.%s(", builder, mnemonic);
  switch (opcode) {
    case IrOpcode::kParameter:
    case IrOpcode::kNumberConstant:
      PrintF("0");
      break;
    case IrOpcode::kLoad:
      PrintF("unique_name");
      break;
    case IrOpcode::kHeapConstant:
      PrintF("unique_constant");
      break;
    case IrOpcode::kPhi:
66
      PrintF("%d", op->ValueInputCount());
67 68
      break;
    case IrOpcode::kEffectPhi:
69
      PrintF("%d", op->EffectInputCount());
70 71 72
      break;
    case IrOpcode::kLoop:
    case IrOpcode::kMerge:
73
      PrintF("%d", op->ControlInputCount());
74 75 76 77 78 79 80 81 82 83 84
      break;
    default:
      break;
  }
  PrintF(");\n");
}

#endif  // DEBUG
}
}
}  // namespace v8::internal::compiler