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