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(); |
} |