| Index: src/compiler/simplified-lowering.cc
|
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
|
| index ca3ed1f75909630d9ae5f3a7757ad90c181f9203..a2b67db13bf04862ca2daaa571b233d395f8996b 100644
|
| --- a/src/compiler/simplified-lowering.cc
|
| +++ b/src/compiler/simplified-lowering.cc
|
| @@ -858,26 +858,8 @@ class RepresentationSelector {
|
| return MachineRepresentation::kTagged;
|
| } else if (type->Is(Type::Number())) {
|
| return MachineRepresentation::kFloat64;
|
| - } else if (type->Is(Type::Internal())) {
|
| - // We mark (u)int64 as Type::Internal.
|
| - // TODO(jarin) This is a workaround for our lack of (u)int64
|
| - // types. This can be removed once we can represent (u)int64
|
| - // unambiguously. (At the moment internal objects, such as the hole,
|
| - // are also Type::Internal()).
|
| - bool is_word64 = GetInfo(node->InputAt(0))->representation() ==
|
| - MachineRepresentation::kWord64;
|
| -#ifdef DEBUG
|
| - if (node->opcode() != IrOpcode::kTypeGuard) {
|
| - // Check that all the inputs agree on being Word64.
|
| - DCHECK_EQ(IrOpcode::kPhi, node->opcode()); // This only works for phis.
|
| - for (int i = 1; i < node->op()->ValueInputCount(); i++) {
|
| - DCHECK_EQ(is_word64, GetInfo(node->InputAt(i))->representation() ==
|
| - MachineRepresentation::kWord64);
|
| - }
|
| - }
|
| -#endif
|
| - return is_word64 ? MachineRepresentation::kWord64
|
| - : MachineRepresentation::kTagged;
|
| + } else if (type->Is(Type::ExternalPointer())) {
|
| + return MachineType::PointerRepresentation();
|
| }
|
| return MachineRepresentation::kTagged;
|
| }
|
| @@ -1015,7 +997,15 @@ class RepresentationSelector {
|
| void VisitObjectState(Node* node) {
|
| if (propagate()) {
|
| for (int i = 0; i < node->InputCount(); i++) {
|
| - EnqueueInput(node, i, UseInfo::Any());
|
| + Node* input = node->InputAt(i);
|
| + 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.
|
| + UseInfo use_info = input_type->Is(Type::ExternalPointer())
|
| + ? UseInfo::PointerInt()
|
| + : UseInfo::Any();
|
| + EnqueueInput(node, i, use_info);
|
| }
|
| } else if (lower()) {
|
| Zone* zone = jsgraph_->zone();
|
| @@ -1026,15 +1016,22 @@ class RepresentationSelector {
|
| 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;
|
| + // TODO(turbofan): Special treatment for ExternalPointer here,
|
| + // to avoid incompatible truncations. We really need a story
|
| + // for the JSFunction::entry field.
|
| + 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);
|
| + (*types)[i] = machine_type;
|
| + }
|
| }
|
| NodeProperties::ChangeOp(node,
|
| jsgraph_->common()->TypedObjectState(types));
|
| @@ -1384,6 +1381,14 @@ class RepresentationSelector {
|
| return VisitLeaf(node, MachineRepresentation::kTagged);
|
| case IrOpcode::kHeapConstant:
|
| return VisitLeaf(node, MachineRepresentation::kTaggedPointer);
|
| + case IrOpcode::kPointerConstant: {
|
| + VisitLeaf(node, MachineType::PointerRepresentation());
|
| + if (lower()) {
|
| + intptr_t const value = OpParameter<intptr_t>(node);
|
| + DeferReplacement(node, lowering->jsgraph()->IntPtrConstant(value));
|
| + }
|
| + return;
|
| + }
|
|
|
| case IrOpcode::kBranch:
|
| ProcessInput(node, 0, UseInfo::Bool());
|
|
|