Home | History | Annotate | Download | only in compiler
      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 
     14 namespace v8 {
     15 namespace internal {
     16 namespace compiler {
     17 
     18 #ifdef DEBUG
     19 
     20 void GraphReplayPrinter::PrintReplay(Graph* graph) {
     21   GraphReplayPrinter replay;
     22   PrintF("  Node* nil = graph.NewNode(common_builder.Dead());\n");
     23   graph->VisitNodeInputsFromEnd(&replay);
     24 }
     25 
     26 
     27 GenericGraphVisit::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 
     38 void 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 
     43 void 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