@@ -11300,16 +11300,20 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral(
11300
11300
HValue* object_size_constant = Add<HConstant>(initial_map->instance_size());
11301
11301
11302
11302
PretenureFlag pretenure_flag = NOT_TENURED;
11303
- Handle<AllocationSite> current_site (*site_context->current (), isolate());
11303
+ Handle<AllocationSite> top_site (*site_context->top (), isolate());
11304
11304
if (FLAG_allocation_site_pretenuring) {
11305
- pretenure_flag = current_site->GetPretenureMode();
11306
- top_info()->dependencies()->AssumeTenuringDecision(current_site);
11305
+ pretenure_flag = top_site->GetPretenureMode();
11307
11306
}
11308
11307
11308
+ Handle<AllocationSite> current_site(*site_context->current(), isolate());
11309
+ if (*top_site == *current_site) {
11310
+ // We install a dependency for pretenuring only on the outermost literal.
11311
+ top_info()->dependencies()->AssumeTenuringDecision(top_site);
11312
+ }
11309
11313
top_info()->dependencies()->AssumeTransitionStable(current_site);
11310
11314
11311
11315
HInstruction* object = Add<HAllocate>(
11312
- object_size_constant, type, pretenure_flag, instance_type, current_site );
11316
+ object_size_constant, type, pretenure_flag, instance_type, top_site );
11313
11317
11314
11318
// If allocation folding reaches Page::kMaxRegularHeapObjectSize the
11315
11319
// elements array may not get folded into the object. Hence, we set the
@@ -11349,9 +11353,8 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral(
11349
11353
HValue* object_elements_size = Add<HConstant>(elements_size);
11350
11354
InstanceType instance_type = boilerplate_object->HasFastDoubleElements()
11351
11355
? FIXED_DOUBLE_ARRAY_TYPE : FIXED_ARRAY_TYPE;
11352
- object_elements =
11353
- Add<HAllocate>(object_elements_size, HType::HeapObject(),
11354
- pretenure_flag, instance_type, current_site);
11356
+ object_elements = Add<HAllocate>(object_elements_size, HType::HeapObject(),
11357
+ pretenure_flag, instance_type, top_site);
11355
11358
BuildEmitElements(boilerplate_object, elements, object_elements,
11356
11359
site_context);
11357
11360
Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(),
@@ -11452,10 +11455,6 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties(
11452
11455
if (representation.IsDouble()) {
11453
11456
// Allocate a HeapNumber box and store the value into it.
11454
11457
HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize);
11455
- // This heap number alloc does not have a corresponding
11456
- // AllocationSite. That is okay because
11457
- // 1) it's a child object of another object with a valid allocation site
11458
- // 2) we can just use the mode of the parent object for pretenuring
11459
11458
HInstruction* double_box =
11460
11459
Add<HAllocate>(heap_number_constant, HType::HeapObject(),
11461
11460
pretenure_flag, MUTABLE_HEAP_NUMBER_TYPE);
0 commit comments