| // 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<IrOpcode::Value>(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<double>(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 |