| Index: src/compiler/js-typed-lowering.cc
|
| diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
|
| index 8fb28a600c7fe9e8ac913642c5b8ed31fb690ffe..d13355a610ec6b2a662227b1704bb16bfa17cb7d 100644
|
| --- a/src/compiler/js-typed-lowering.cc
|
| +++ b/src/compiler/js-typed-lowering.cc
|
| @@ -2270,159 +2270,6 @@ Reduction JSTypedLowering::ReduceJSForInDone(Node* node) {
|
| }
|
|
|
|
|
| -Reduction JSTypedLowering::ReduceJSForInPrepare(Node* node) {
|
| - DCHECK_EQ(IrOpcode::kJSForInPrepare, node->opcode());
|
| - Node* receiver = NodeProperties::GetValueInput(node, 0);
|
| - Node* context = NodeProperties::GetContextInput(node);
|
| - Node* frame_state = NodeProperties::GetFrameStateInput(node, 0);
|
| - Node* effect = NodeProperties::GetEffectInput(node);
|
| - Node* control = NodeProperties::GetControlInput(node);
|
| -
|
| - // Get the set of properties to enumerate.
|
| - Node* cache_type = effect = graph()->NewNode(
|
| - javascript()->CallRuntime(Runtime::kGetPropertyNamesFast), receiver,
|
| - context, frame_state, effect, control);
|
| - control = graph()->NewNode(common()->IfSuccess(), cache_type);
|
| -
|
| - Node* receiver_map = effect =
|
| - graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()),
|
| - receiver, effect, control);
|
| - Node* cache_type_map = effect =
|
| - graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()),
|
| - cache_type, effect, control);
|
| - Node* meta_map = jsgraph()->HeapConstant(factory()->meta_map());
|
| -
|
| - // If we got a map from the GetPropertyNamesFast runtime call, we can do a
|
| - // fast modification check. Otherwise, we got a fixed array, and we have to
|
| - // perform a slow check on every iteration.
|
| - Node* check0 = graph()->NewNode(simplified()->ReferenceEqual(Type::Any()),
|
| - cache_type_map, meta_map);
|
| - Node* branch0 =
|
| - graph()->NewNode(common()->Branch(BranchHint::kTrue), check0, control);
|
| -
|
| - Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0);
|
| - Node* cache_array_true0;
|
| - Node* cache_length_true0;
|
| - Node* cache_type_true0;
|
| - Node* etrue0;
|
| - {
|
| - // Enum cache case.
|
| - Node* cache_type_enum_length = etrue0 = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForMapBitField3()), cache_type,
|
| - effect, if_true0);
|
| - cache_length_true0 = graph()->NewNode(
|
| - simplified()->NumberBitwiseAnd(), cache_type_enum_length,
|
| - jsgraph()->Int32Constant(Map::EnumLengthBits::kMask));
|
| -
|
| - Node* check1 =
|
| - graph()->NewNode(machine()->Word32Equal(), cache_length_true0,
|
| - jsgraph()->Int32Constant(0));
|
| - Node* branch1 =
|
| - graph()->NewNode(common()->Branch(BranchHint::kTrue), check1, if_true0);
|
| -
|
| - Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
|
| - Node* cache_array_true1;
|
| - Node* etrue1;
|
| - {
|
| - // No properties to enumerate.
|
| - cache_array_true1 =
|
| - jsgraph()->HeapConstant(factory()->empty_fixed_array());
|
| - etrue1 = etrue0;
|
| - }
|
| -
|
| - Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
|
| - Node* cache_array_false1;
|
| - Node* efalse1;
|
| - {
|
| - // Load the enumeration cache from the instance descriptors of {receiver}.
|
| - Node* receiver_map_descriptors = efalse1 = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForMapDescriptors()),
|
| - receiver_map, etrue0, if_false1);
|
| - Node* object_map_enum_cache = efalse1 = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForDescriptorArrayEnumCache()),
|
| - receiver_map_descriptors, efalse1, if_false1);
|
| - cache_array_false1 = efalse1 = graph()->NewNode(
|
| - simplified()->LoadField(
|
| - AccessBuilder::ForDescriptorArrayEnumCacheBridgeCache()),
|
| - object_map_enum_cache, efalse1, if_false1);
|
| - }
|
| -
|
| - if_true0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
|
| - etrue0 =
|
| - graph()->NewNode(common()->EffectPhi(2), etrue1, efalse1, if_true0);
|
| - cache_array_true0 =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
|
| - cache_array_true1, cache_array_false1, if_true0);
|
| -
|
| - cache_type_true0 = cache_type;
|
| - }
|
| -
|
| - Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0);
|
| - Node* cache_array_false0;
|
| - Node* cache_length_false0;
|
| - Node* cache_type_false0;
|
| - Node* efalse0;
|
| - {
|
| - // FixedArray case.
|
| - cache_type_false0 = jsgraph()->OneConstant(); // Smi means slow check
|
| - cache_array_false0 = cache_type;
|
| - cache_length_false0 = efalse0 = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForFixedArrayLength()),
|
| - cache_array_false0, effect, if_false0);
|
| - }
|
| -
|
| - control = graph()->NewNode(common()->Merge(2), if_true0, if_false0);
|
| - effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control);
|
| - Node* cache_array =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
|
| - cache_array_true0, cache_array_false0, control);
|
| - Node* cache_length =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
|
| - cache_length_true0, cache_length_false0, control);
|
| - cache_type =
|
| - graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
|
| - cache_type_true0, cache_type_false0, control);
|
| -
|
| - for (auto edge : node->use_edges()) {
|
| - Node* const use = edge.from();
|
| - if (NodeProperties::IsEffectEdge(edge)) {
|
| - edge.UpdateTo(effect);
|
| - Revisit(use);
|
| - } else {
|
| - if (NodeProperties::IsControlEdge(edge)) {
|
| - if (use->opcode() == IrOpcode::kIfSuccess) {
|
| - Replace(use, control);
|
| - } else if (use->opcode() == IrOpcode::kIfException) {
|
| - edge.UpdateTo(cache_type_true0);
|
| - continue;
|
| - } else {
|
| - UNREACHABLE();
|
| - }
|
| - } else {
|
| - DCHECK(NodeProperties::IsValueEdge(edge));
|
| - DCHECK_EQ(IrOpcode::kProjection, use->opcode());
|
| - switch (ProjectionIndexOf(use->op())) {
|
| - case 0:
|
| - Replace(use, cache_type);
|
| - break;
|
| - case 1:
|
| - Replace(use, cache_array);
|
| - break;
|
| - case 2:
|
| - Replace(use, cache_length);
|
| - break;
|
| - default:
|
| - UNREACHABLE();
|
| - break;
|
| - }
|
| - }
|
| - use->Kill();
|
| - }
|
| - }
|
| - return NoChange(); // All uses were replaced already above.
|
| -}
|
| -
|
| -
|
| Reduction JSTypedLowering::ReduceJSForInNext(Node* node) {
|
| DCHECK_EQ(IrOpcode::kJSForInNext, node->opcode());
|
| Node* receiver = NodeProperties::GetValueInput(node, 0);
|
| @@ -2670,8 +2517,6 @@ Reduction JSTypedLowering::Reduce(Node* node) {
|
| return ReduceJSForInDone(node);
|
| case IrOpcode::kJSForInNext:
|
| return ReduceJSForInNext(node);
|
| - case IrOpcode::kJSForInPrepare:
|
| - return ReduceJSForInPrepare(node);
|
| case IrOpcode::kJSForInStep:
|
| return ReduceJSForInStep(node);
|
| case IrOpcode::kSelect:
|
|
|