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 |