diff --git a/src/maglev/maglev-code-generator.cc b/src/maglev/maglev-code-generator.cc index 9226143b9a..371b1f0c73 100644 --- a/src/maglev/maglev-code-generator.cc +++ b/src/maglev/maglev-code-generator.cc @@ -1375,7 +1375,7 @@ class MaglevFrameTranslationBuilder { object->double_elements()); } DCHECK_EQ(object->type(), VirtualObject::kDefault); - translation_array_builder_->BeginCapturedObject(object->slot_count()); + translation_array_builder_->BeginCapturedObject(object->slot_count() + 1); translation_array_builder_->StoreLiteral( GetDeoptLiteral(*object->map().object())); for (uint32_t i = 0; i < object->slot_count(); i++) { diff --git a/src/maglev/maglev-graph-builder.cc b/src/maglev/maglev-graph-builder.cc index b8fbd18943..51245747dd 100644 --- a/src/maglev/maglev-graph-builder.cc +++ b/src/maglev/maglev-graph-builder.cc @@ -8659,6 +8659,22 @@ ReduceResult MaglevGraphBuilder::ReduceCallWithArrayLikeForArgumentsObject( return ReduceCall(target_node, new_args); } + if (Constant* constant_value = elements_value->TryCast()) { + DCHECK(constant_value->object().IsFixedArray()); + compiler::FixedArrayRef elements = constant_value->object().AsFixedArray(); + base::SmallVector arg_list; + DCHECK_NOT_NULL(args.receiver()); + arg_list.push_back(args.receiver()); + for (int i = 0; i < static_cast(args.count()); i++) { + arg_list.push_back(args[i]); + } + for (int i = 0; i < elements.length(); i++) { + arg_list.push_back(GetConstant(*elements.TryGet(broker(), i))); + } + CallArguments new_args(ConvertReceiverMode::kAny, std::move(arg_list)); + return ReduceCall(target_node, new_args); + } + DCHECK(elements_value->Is()); InlinedAllocation* allocation = elements_value->Cast(); VirtualObject* elements = allocation->object(); @@ -10589,6 +10605,7 @@ void MaglevGraphBuilder::AddNonEscapingUses(InlinedAllocation* allocation, } void MaglevGraphBuilder::AddDeoptUse(VirtualObject* vobject) { + if (vobject->type() != VirtualObject::kDefault) return; for (uint32_t i = 0; i < vobject->slot_count(); i++) { ValueNode* value = vobject->get_by_index(i); if (!IsConstantNode(value->opcode()) && @@ -10648,6 +10665,7 @@ ValueNode* MaglevGraphBuilder::BuildInlinedAllocation( if (node->Is()) { VirtualObject* nested = node->Cast(); node = BuildInlinedAllocation(nested, allocation_type); + vobject->set_by_index(i, node); } else if (node->Is()) { node = BuildInlinedAllocationForHeapNumber( CreateHeapNumber(node->Cast()->value()), @@ -10659,7 +10677,7 @@ ValueNode* MaglevGraphBuilder::BuildInlinedAllocation( } InlinedAllocation* allocation = ExtendOrReallocateCurrentAllocationBlock(allocation_type, vobject); - AddNonEscapingUses(allocation, vobject->slot_count()); + AddNonEscapingUses(allocation, vobject->slot_count() + 1); BuildStoreMap(allocation, vobject->map(), StoreMap::initializing_kind(allocation_type)); for (uint32_t i = 0; i < vobject->slot_count(); i++) { diff --git a/src/maglev/maglev-ir.h b/src/maglev/maglev-ir.h index 988d9e266b..ec02ff606d 100644 --- a/src/maglev/maglev-ir.h +++ b/src/maglev/maglev-ir.h @@ -4991,6 +4991,11 @@ class VirtualObject : public FixedInputValueNodeT<0, VirtualObject> { return slots_.data[i]; } + void set_by_index(uint32_t i, ValueNode* value) { + DCHECK_EQ(type_, kDefault); + slots_.data[i] = value; + } + void set(uint32_t offset, ValueNode* value) { DCHECK_NE(offset, 0); // Don't try to set the map through this setter. DCHECK_EQ(type_, kDefault);