diff options
Diffstat (limited to 'deps/v8/src/compiler/machine-graph-verifier.cc')
-rw-r--r-- | deps/v8/src/compiler/machine-graph-verifier.cc | 118 |
1 files changed, 110 insertions, 8 deletions
diff --git a/deps/v8/src/compiler/machine-graph-verifier.cc b/deps/v8/src/compiler/machine-graph-verifier.cc index 8521666681..f8e78b2169 100644 --- a/deps/v8/src/compiler/machine-graph-verifier.cc +++ b/deps/v8/src/compiler/machine-graph-verifier.cc @@ -206,8 +206,29 @@ class MachineRepresentationInferrer { case IrOpcode::kChangeUint32ToTagged: case IrOpcode::kBitcastWordToTagged: case IrOpcode::kTaggedPoisonOnSpeculation: + case IrOpcode::kChangeCompressedToTagged: representation_vector_[node->id()] = MachineRepresentation::kTagged; break; + case IrOpcode::kChangeCompressedPointerToTaggedPointer: + representation_vector_[node->id()] = + MachineRepresentation::kTaggedPointer; + break; + case IrOpcode::kChangeCompressedSignedToTaggedSigned: + representation_vector_[node->id()] = + MachineRepresentation::kTaggedSigned; + break; + case IrOpcode::kChangeTaggedToCompressed: + representation_vector_[node->id()] = + MachineRepresentation::kCompressed; + break; + case IrOpcode::kChangeTaggedPointerToCompressedPointer: + representation_vector_[node->id()] = + MachineRepresentation::kCompressedPointer; + break; + case IrOpcode::kChangeTaggedSignedToCompressedSigned: + representation_vector_[node->id()] = + MachineRepresentation::kCompressedSigned; + break; case IrOpcode::kWord32PoisonOnSpeculation: representation_vector_[node->id()] = MachineRepresentation::kWord32; break; @@ -363,6 +384,29 @@ class MachineRepresentationChecker { CHECK_EQ(MachineRepresentation::kTagged, inferrer_->GetRepresentation(node->InputAt(0))); break; + case IrOpcode::kChangeCompressedToTagged: + CHECK(IsAnyCompressed( + inferrer_->GetRepresentation(node->InputAt(0)))); + break; + case IrOpcode::kChangeCompressedPointerToTaggedPointer: + CHECK(CanBeCompressedPointer( + inferrer_->GetRepresentation(node->InputAt(0)))); + break; + case IrOpcode::kChangeCompressedSignedToTaggedSigned: + CHECK(CanBeCompressedSigned( + inferrer_->GetRepresentation(node->InputAt(0)))); + break; + case IrOpcode::kChangeTaggedToCompressed: + CHECK(IsAnyTagged(inferrer_->GetRepresentation(node->InputAt(0)))); + break; + case IrOpcode::kChangeTaggedPointerToCompressedPointer: + CHECK(CanBeTaggedPointer( + inferrer_->GetRepresentation(node->InputAt(0)))); + break; + case IrOpcode::kChangeTaggedSignedToCompressedSigned: + CHECK(CanBeTaggedSigned( + inferrer_->GetRepresentation(node->InputAt(0)))); + break; case IrOpcode::kRoundInt64ToFloat64: case IrOpcode::kRoundUint64ToFloat64: case IrOpcode::kRoundInt64ToFloat32: @@ -454,8 +498,8 @@ class MachineRepresentationChecker { node, 1, inferrer_->GetRepresentation(node->InputAt(0))); } } else { - CheckValueInputForInt32Op(node, 0); - CheckValueInputForInt32Op(node, 1); + CheckValueIsCompressedOrInt32(node, 0); + CheckValueIsCompressedOrInt32(node, 1); } break; @@ -558,6 +602,11 @@ class MachineRepresentationChecker { case MachineRepresentation::kTaggedSigned: CheckValueInputIsTagged(node, 2); break; + case MachineRepresentation::kCompressed: + case MachineRepresentation::kCompressedPointer: + case MachineRepresentation::kCompressedSigned: + CheckValueInputIsCompressed(node, 2); + break; default: CheckValueInputRepresentationIs( node, 2, inferrer_->GetRepresentation(node)); @@ -597,6 +646,13 @@ class MachineRepresentationChecker { CheckValueInputIsTagged(node, i); } break; + case MachineRepresentation::kCompressed: + case MachineRepresentation::kCompressedPointer: + case MachineRepresentation::kCompressedSigned: + for (int i = 0; i < node->op()->ValueInputCount(); ++i) { + CheckValueInputIsCompressed(node, i); + } + break; case MachineRepresentation::kWord32: for (int i = 0; i < node->op()->ValueInputCount(); ++i) { CheckValueInputForInt32Op(node, i); @@ -685,6 +741,24 @@ class MachineRepresentationChecker { } } + void CheckValueInputIsCompressed(Node const* node, int index) { + Node const* input = node->InputAt(index); + switch (inferrer_->GetRepresentation(input)) { + case MachineRepresentation::kCompressed: + case MachineRepresentation::kCompressedPointer: + case MachineRepresentation::kCompressedSigned: + return; + default: + break; + } + std::ostringstream str; + str << "TypeError: node #" << node->id() << ":" << *node->op() + << " uses node #" << input->id() << ":" << *input->op() + << " which doesn't have a compressed representation."; + PrintDebugHelp(str, node); + FATAL("%s", str.str().c_str()); + } + void CheckValueInputIsTagged(Node const* node, int index) { Node const* input = node->InputAt(index); switch (inferrer_->GetRepresentation(input)) { @@ -764,6 +838,38 @@ class MachineRepresentationChecker { FATAL("%s", str.str().c_str()); } + void CheckValueIsCompressedOrInt32(Node const* node, int index) { + Node const* input = node->InputAt(index); + switch (inferrer_->GetRepresentation(input)) { + case MachineRepresentation::kBit: + case MachineRepresentation::kWord8: + case MachineRepresentation::kWord16: + case MachineRepresentation::kWord32: + return; + case MachineRepresentation::kCompressed: + case MachineRepresentation::kCompressedSigned: + case MachineRepresentation::kCompressedPointer: + return; + case MachineRepresentation::kNone: { + std::ostringstream str; + str << "TypeError: node #" << input->id() << ":" << *input->op() + << " is untyped."; + PrintDebugHelp(str, node); + FATAL("%s", str.str().c_str()); + break; + } + default: + break; + } + std::ostringstream str; + str << "TypeError: node #" << node->id() << ":" << *node->op() + << " uses node #" << input->id() << ":" << *input->op() + << " which doesn't have a compressed or int32-compatible " + "representation."; + PrintDebugHelp(str, node); + FATAL("%s", str.str().c_str()); + } + void CheckValueInputForInt64Op(Node const* node, int index) { Node const* input = node->InputAt(index); MachineRepresentation input_representation = @@ -882,13 +988,9 @@ class MachineRepresentationChecker { MachineRepresentation actual) { switch (expected) { case MachineRepresentation::kTagged: - return (actual == MachineRepresentation::kTagged || - actual == MachineRepresentation::kTaggedSigned || - actual == MachineRepresentation::kTaggedPointer); + return IsAnyTagged(actual); case MachineRepresentation::kCompressed: - return (actual == MachineRepresentation::kCompressed || - actual == MachineRepresentation::kCompressedSigned || - actual == MachineRepresentation::kCompressedPointer); + return IsAnyCompressed(actual); case MachineRepresentation::kTaggedSigned: case MachineRepresentation::kTaggedPointer: case MachineRepresentation::kCompressedSigned: |