Index: src/compiler/simplified-lowering.cc |
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
index 3430db1b12cf39b923714417c522be2bb87dc73a..9555a3fe00a5dc9e46884420bf488e2d68311957 100644 |
--- a/src/compiler/simplified-lowering.cc |
+++ b/src/compiler/simplified-lowering.cc |
@@ -1012,6 +1012,36 @@ class RepresentationSelector { |
SetOutput(node, MachineRepresentation::kTagged); |
} |
+ void VisitObjectState(Node* node) { |
+ if (propagate()) { |
+ for (int i = 0; i < node->InputCount(); i++) { |
+ EnqueueInput(node, i, UseInfo::Any()); |
+ } |
+ } else if (lower()) { |
+ Zone* zone = jsgraph_->zone(); |
+ ZoneVector<MachineType>* types = |
+ new (zone->New(sizeof(ZoneVector<MachineType>))) |
+ 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; |
+ } |
+ NodeProperties::ChangeOp(node, |
+ jsgraph_->common()->TypedObjectState(types)); |
+ } |
+ SetOutput(node, MachineRepresentation::kTagged); |
+ } |
+ |
const Operator* Int32Op(Node* node) { |
return changer_->Int32OperatorFor(node->opcode()); |
} |
@@ -2456,6 +2486,8 @@ class RepresentationSelector { |
return; |
case IrOpcode::kStateValues: |
return VisitStateValues(node); |
+ case IrOpcode::kObjectState: |
+ return VisitObjectState(node); |
case IrOpcode::kTypeGuard: { |
// We just get rid of the sigma here. In principle, it should be |
// possible to refine the truncation and representation based on |
@@ -2497,7 +2529,6 @@ class RepresentationSelector { |
case IrOpcode::kThrow: |
case IrOpcode::kBeginRegion: |
case IrOpcode::kProjection: |
- case IrOpcode::kObjectState: |
case IrOpcode::kOsrValue: |
// All JavaScript operators except JSToNumber have uniform handling. |
#define OPCODE_CASE(name) case IrOpcode::k##name: |