Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1086)

Unified Diff: src/compiler/representation-change.cc

Issue 2177483002: [turbofan] Handle impossible types (Type::None()) in the backend. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix?? Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler/representation-change.cc
diff --git a/src/compiler/representation-change.cc b/src/compiler/representation-change.cc
index da62bce9ad6f6690bfd152b36aec78c56259b430..829d74239d4209d7c51205f69e9e2dc9a29d2bef 100644
--- a/src/compiler/representation-change.cc
+++ b/src/compiler/representation-change.cc
@@ -117,8 +117,10 @@ bool IsWord(MachineRepresentation rep) {
Node* RepresentationChanger::GetRepresentationFor(
Node* node, MachineRepresentation output_rep, Type* output_type,
Node* use_node, UseInfo use_info) {
- if (output_rep == MachineRepresentation::kNone) {
- // The output representation should be set.
+ if (output_rep == MachineRepresentation::kNone &&
+ output_type->IsInhabited()) {
+ // The output representation should be set if the type is inhabited (i.e.,
+ // if the value is possible).
return TypeError(node, output_rep, output_type, use_info.representation());
}
@@ -200,7 +202,11 @@ Node* RepresentationChanger::GetTaggedRepresentationFor(
}
// Select the correct X -> Tagged operator.
const Operator* op;
- if (output_rep == MachineRepresentation::kBit) {
+ if (output_rep == MachineRepresentation::kNone) {
+ // We should only asisgn this representation if the type is empty.
+ CHECK(!output_type->IsInhabited());
+ op = machine()->ImpossibleToTagged();
+ } else if (output_rep == MachineRepresentation::kBit) {
if (output_type->Is(Type::Boolean())) {
op = simplified()->ChangeBitToTagged();
} else {
@@ -271,7 +277,11 @@ Node* RepresentationChanger::GetFloat32RepresentationFor(
}
// Select the correct X -> Float32 operator.
const Operator* op = nullptr;
- if (IsWord(output_rep)) {
+ if (output_rep == MachineRepresentation::kNone) {
+ // We should only use kNone representation if the type is empty.
+ CHECK(!output_type->IsInhabited());
+ op = machine()->ImpossibleToFloat32();
+ } else if (IsWord(output_rep)) {
if (output_type->Is(Type::Signed32())) {
// int32 -> float64 -> float32
op = machine()->ChangeInt32ToFloat64();
@@ -336,7 +346,11 @@ Node* RepresentationChanger::GetFloat64RepresentationFor(
}
// Select the correct X -> Float64 operator.
const Operator* op = nullptr;
- if (IsWord(output_rep)) {
+ if (output_rep == MachineRepresentation::kNone) {
+ // We should only use kNone representation if the type is empty.
+ CHECK(!output_type->IsInhabited());
+ op = machine()->ImpossibleToFloat64();
+ } else if (IsWord(output_rep)) {
if (output_type->Is(Type::Signed32())) {
op = machine()->ChangeInt32ToFloat64();
} else if (output_type->Is(Type::Unsigned32()) ||
@@ -408,7 +422,11 @@ Node* RepresentationChanger::GetWord32RepresentationFor(
// Select the correct X -> Word32 operator.
const Operator* op = nullptr;
- if (output_rep == MachineRepresentation::kBit) {
+ if (output_rep == MachineRepresentation::kNone) {
+ // We should only use kNone representation if the type is empty.
+ CHECK(!output_type->IsInhabited());
+ op = machine()->ImpossibleToWord32();
+ } else if (output_rep == MachineRepresentation::kBit) {
return node; // Sloppy comparison -> word32
} else if (output_rep == MachineRepresentation::kFloat64) {
if (output_type->Is(Type::Unsigned32())) {
@@ -497,7 +515,11 @@ Node* RepresentationChanger::GetBitRepresentationFor(
}
// Select the correct X -> Bit operator.
const Operator* op;
- if (output_rep == MachineRepresentation::kTagged) {
+ if (output_rep == MachineRepresentation::kNone) {
+ // We should only use kNone representation if the type is empty.
+ CHECK(!output_type->IsInhabited());
+ op = machine()->ImpossibleToBit();
+ } else if (output_rep == MachineRepresentation::kTagged) {
op = simplified()->ChangeTaggedToBit();
} else {
return TypeError(node, output_rep, output_type,
@@ -508,7 +530,11 @@ Node* RepresentationChanger::GetBitRepresentationFor(
Node* RepresentationChanger::GetWord64RepresentationFor(
Node* node, MachineRepresentation output_rep, Type* output_type) {
- if (output_rep == MachineRepresentation::kBit) {
+ if (output_rep == MachineRepresentation::kNone) {
+ // We should only use kNone representation if the type is empty.
+ CHECK(!output_type->IsInhabited());
+ return jsgraph()->graph()->NewNode(machine()->ImpossibleToFloat64(), node);
+ } else if (output_rep == MachineRepresentation::kBit) {
return node; // Sloppy comparison -> word64
}
// Can't really convert Word64 to anything else. Purported to be internal.
@@ -532,7 +558,11 @@ Node* RepresentationChanger::GetCheckedWord32RepresentationFor(
// Select the correct X -> Word32 operator.
const Operator* op = nullptr;
- if (output_rep == MachineRepresentation::kWord32) {
+ if (output_rep == MachineRepresentation::kNone) {
+ // We should only use kNone representation if the type is empty.
+ CHECK(!output_type->IsInhabited());
+ op = machine()->ImpossibleToWord32();
+ } else if (output_rep == MachineRepresentation::kWord32) {
if (output_type->Is(Type::Unsigned32())) {
op = simplified()->CheckedUint32ToInt32();
}

Powered by Google App Engine
This is Rietveld 408576698