| Index: src/compiler/verifier.cc
|
| diff --git a/src/compiler/verifier.cc b/src/compiler/verifier.cc
|
| index 20a0d76248100473cbee7c83e55e47ada12541c3..9e0a0daa98f5cc76ca70a283beecd35c78e282f3 100644
|
| --- a/src/compiler/verifier.cc
|
| +++ b/src/compiler/verifier.cc
|
| @@ -1154,6 +1154,68 @@ void ScheduleVerifier::Run(Schedule* schedule) {
|
| }
|
| }
|
| }
|
| +
|
| +
|
| +#ifdef DEBUG
|
| +
|
| +// static
|
| +void Verifier::VerifyNode(Node* node) {
|
| + CHECK_EQ(OperatorProperties::GetTotalInputCount(node->op()),
|
| + node->InputCount());
|
| + // If this node has no effect or no control outputs,
|
| + // we check that no its uses are effect or control inputs.
|
| + bool check_no_control = node->op()->ControlOutputCount() == 0;
|
| + bool check_no_effect = node->op()->EffectOutputCount() == 0;
|
| + bool check_no_frame_state = node->opcode() != IrOpcode::kFrameState;
|
| + if (check_no_effect || check_no_control) {
|
| + for (Edge edge : node->use_edges()) {
|
| + Node* const user = edge.from();
|
| + CHECK(!user->IsDead());
|
| + if (NodeProperties::IsControlEdge(edge)) {
|
| + CHECK(!check_no_control);
|
| + } else if (NodeProperties::IsEffectEdge(edge)) {
|
| + CHECK(!check_no_effect);
|
| + } else if (NodeProperties::IsFrameStateEdge(edge)) {
|
| + CHECK(!check_no_frame_state);
|
| + }
|
| + }
|
| + }
|
| + // Frame state inputs should be frame states (or sentinels).
|
| + for (int i = 0; i < OperatorProperties::GetFrameStateInputCount(node->op());
|
| + i++) {
|
| + Node* input = NodeProperties::GetFrameStateInput(node, i);
|
| + CHECK(input->opcode() == IrOpcode::kFrameState ||
|
| + input->opcode() == IrOpcode::kStart ||
|
| + input->opcode() == IrOpcode::kDead);
|
| + }
|
| + // Effect inputs should be effect-producing nodes (or sentinels).
|
| + for (int i = 0; i < node->op()->EffectInputCount(); i++) {
|
| + Node* input = NodeProperties::GetEffectInput(node, i);
|
| + CHECK(input->op()->EffectOutputCount() > 0 ||
|
| + input->opcode() == IrOpcode::kDead);
|
| + }
|
| + // Control inputs should be control-producing nodes (or sentinels).
|
| + for (int i = 0; i < node->op()->ControlInputCount(); i++) {
|
| + Node* input = NodeProperties::GetControlInput(node, i);
|
| + CHECK(input->op()->ControlOutputCount() > 0 ||
|
| + input->opcode() == IrOpcode::kDead);
|
| + }
|
| +}
|
| +
|
| +
|
| +void Verifier::VerifyEdgeInputReplacement(const Edge& edge,
|
| + const Node* replacement) {
|
| + // Check that the user does not misuse the replacement.
|
| + DCHECK(!NodeProperties::IsControlEdge(edge) ||
|
| + replacement->op()->ControlOutputCount() > 0);
|
| + DCHECK(!NodeProperties::IsEffectEdge(edge) ||
|
| + replacement->op()->EffectOutputCount() > 0);
|
| + DCHECK(!NodeProperties::IsFrameStateEdge(edge) ||
|
| + replacement->opcode() == IrOpcode::kFrameState);
|
| +}
|
| +
|
| +#endif // DEBUG
|
| +
|
| } // namespace compiler
|
| } // namespace internal
|
| } // namespace v8
|
|
|