summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/machine-graph-verifier.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/machine-graph-verifier.cc')
-rw-r--r--deps/v8/src/compiler/machine-graph-verifier.cc118
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: