| Index: src/compiler/simplified-lowering.cc
|
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
|
| index 2132d9a493a4ad463e4ee3dd5f6e2a4ffaf4b8f3..559453d2e940e9ea77d373b8cbba5ad7ea95ab25 100644
|
| --- a/src/compiler/simplified-lowering.cc
|
| +++ b/src/compiler/simplified-lowering.cc
|
| @@ -980,7 +980,7 @@ class RepresentationSelector {
|
| }
|
| }
|
|
|
| - MachineSemantic DeoptValueSemanticOf(Type* type) {
|
| + static MachineSemantic DeoptValueSemanticOf(Type* type) {
|
| // We only need signedness to do deopt correctly.
|
| if (type->Is(Type::Signed32())) {
|
| return MachineSemantic::kInt32;
|
| @@ -991,6 +991,29 @@ class RepresentationSelector {
|
| }
|
| }
|
|
|
| + static MachineType DeoptMachineTypeOf(MachineRepresentation rep, Type* type) {
|
| + if (!type->IsInhabited()) {
|
| + return MachineType::None();
|
| + }
|
| + // TODO(turbofan): Special treatment for ExternalPointer here,
|
| + // to avoid incompatible truncations. We really need a story
|
| + // for the JSFunction::entry field.
|
| + if (type->Is(Type::ExternalPointer())) {
|
| + return MachineType::Pointer();
|
| + }
|
| + // Do not distinguish between various Tagged variations.
|
| + if (IsAnyTagged(rep)) {
|
| + return MachineType::AnyTagged();
|
| + }
|
| + MachineType machine_type(rep, DeoptValueSemanticOf(type));
|
| + DCHECK(machine_type.representation() != MachineRepresentation::kWord32 ||
|
| + machine_type.semantic() == MachineSemantic::kInt32 ||
|
| + machine_type.semantic() == MachineSemantic::kUint32);
|
| + DCHECK(machine_type.representation() != MachineRepresentation::kBit ||
|
| + type->Is(Type::Boolean()));
|
| + return machine_type;
|
| + }
|
| +
|
| void VisitStateValues(Node* node) {
|
| if (propagate()) {
|
| for (int i = 0; i < node->InputCount(); i++) {
|
| @@ -1003,17 +1026,8 @@ class RepresentationSelector {
|
| ZoneVector<MachineType>(node->InputCount(), zone);
|
| for (int i = 0; i < node->InputCount(); i++) {
|
| Node* input = node->InputAt(i);
|
| - NodeInfo* input_info = GetInfo(input);
|
| - Type* input_type = TypeOf(input);
|
| - MachineRepresentation rep = input_type->IsInhabited()
|
| - ? input_info->representation()
|
| - : MachineRepresentation::kNone;
|
| - MachineType machine_type(rep, DeoptValueSemanticOf(input_type));
|
| - DCHECK(machine_type.representation() !=
|
| - MachineRepresentation::kWord32 ||
|
| - machine_type.semantic() == MachineSemantic::kInt32 ||
|
| - machine_type.semantic() == MachineSemantic::kUint32);
|
| - (*types)[i] = machine_type;
|
| + (*types)[i] =
|
| + DeoptMachineTypeOf(GetInfo(input)->representation(), TypeOf(input));
|
| }
|
| SparseInputMask mask = SparseInputMaskOf(node->op());
|
| NodeProperties::ChangeOp(
|
| @@ -1047,28 +1061,8 @@ class RepresentationSelector {
|
| ZoneVector<MachineType>(node->InputCount(), zone);
|
| for (int i = 0; i < node->InputCount(); i++) {
|
| Node* input = node->InputAt(i);
|
| - NodeInfo* input_info = GetInfo(input);
|
| - Type* input_type = TypeOf(input);
|
| - // TODO(turbofan): Special treatment for ExternalPointer here,
|
| - // to avoid incompatible truncations. We really need a story
|
| - // for the JSFunction::entry field.
|
| - if (!input_type->IsInhabited()) {
|
| - (*types)[i] = MachineType::None();
|
| - } else if (input_type->Is(Type::ExternalPointer())) {
|
| - (*types)[i] = MachineType::Pointer();
|
| - } else {
|
| - MachineRepresentation rep = input_type->IsInhabited()
|
| - ? input_info->representation()
|
| - : MachineRepresentation::kNone;
|
| - MachineType machine_type(rep, DeoptValueSemanticOf(input_type));
|
| - DCHECK(machine_type.representation() !=
|
| - MachineRepresentation::kWord32 ||
|
| - machine_type.semantic() == MachineSemantic::kInt32 ||
|
| - machine_type.semantic() == MachineSemantic::kUint32);
|
| - DCHECK(machine_type.representation() != MachineRepresentation::kBit ||
|
| - input_type->Is(Type::Boolean()));
|
| - (*types)[i] = machine_type;
|
| - }
|
| + (*types)[i] =
|
| + DeoptMachineTypeOf(GetInfo(input)->representation(), TypeOf(input));
|
| }
|
| NodeProperties::ChangeOp(node,
|
| jsgraph_->common()->TypedObjectState(types));
|
|
|