// 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" #include "src/compiler/all-nodes.h" #include "src/compiler/common-operator.h" #include "src/compiler/graph.h" #include "src/compiler/node.h" #include "src/compiler/operator.h" #include "src/compiler/operator-properties.h" namespace v8 { namespace internal { namespace compiler { #ifdef DEBUG void GraphReplayPrinter::PrintReplay(Graph* graph) { GraphReplayPrinter replay; PrintF(" Node* nil = graph()->NewNode(common()->Dead());\n"); Zone zone(graph->zone()->allocator(), ZONE_NAME); AllNodes nodes(&zone, graph); // Allocate the nodes first. for (Node* node : nodes.reachable) { 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()); } // Connect the nodes to their inputs. for (Node* node : nodes.reachable) { for (int i = 0; i < node->InputCount(); i++) { PrintF(" n%d->ReplaceInput(%d, n%d);\n", node->id(), i, node->InputAt(i)->id()); } } } void GraphReplayPrinter::PrintReplayOpCreator(const Operator* op) { IrOpcode::Value opcode = static_cast(op->opcode()); const char* builder = IrOpcode::IsCommonOpcode(opcode) ? "common" : "js"; const char* mnemonic = IrOpcode::IsCommonOpcode(opcode) ? IrOpcode::Mnemonic(opcode) : IrOpcode::Mnemonic(opcode) + 2; PrintF(" op = %s()->%s(", builder, mnemonic); switch (opcode) { case IrOpcode::kParameter: PrintF("%d", ParameterIndexOf(op)); break; case IrOpcode::kNumberConstant: PrintF("%g", OpParameter(op)); break; case IrOpcode::kHeapConstant: PrintF("unique_constant"); break; case IrOpcode::kPhi: PrintF("kMachAnyTagged, %d", op->ValueInputCount()); break; case IrOpcode::kStateValues: PrintF("%d", op->ValueInputCount()); break; case IrOpcode::kEffectPhi: PrintF("%d", op->EffectInputCount()); break; case IrOpcode::kLoop: case IrOpcode::kMerge: PrintF("%d", op->ControlInputCount()); break; case IrOpcode::kStart: PrintF("%d", op->ValueOutputCount() - 3); break; case IrOpcode::kFrameState: PrintF("JS_FRAME, BailoutId(-1), OutputFrameStateCombine::Ignore()"); break; default: break; } PrintF(");\n"); } #endif // DEBUG } // namespace compiler } // namespace internal } // namespace v8