Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index f7b310003e0c1140936a8c86d51638534acd824a..ad5c2f01ee8c9a1d594a517ea3c4fdacc1026fd9 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -2252,6 +2252,21 @@ HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, |
| BuildCreateAllocationMemento(array, |
| JSArray::kSize, |
| allocation_site_payload); |
| + if (FLAG_allocation_site_pretenuring) { |
| + // Increment create count |
|
Hannes Payer (out of office)
2013/11/21 20:52:24
Beautify comment.
mvstanton
2013/11/22 11:18:51
Done.
|
| + // TODO(mvstanton): move into BuildCreateAllocationMemento when |
| + // constructed arrays also pay attention to pretenuring. |
| + HObjectAccess access = |
| + HObjectAccess::ForAllocationSiteOffset( |
| + AllocationSite::kMementoCreateCountOffset); |
| + HValue* create_info = Add<HLoadNamedField>(allocation_site_payload, |
| + access); |
| + HInstruction* new_create_info = Add<HAdd>(create_info, |
| + graph()->GetConstant1()); |
| + HStoreNamedField* store = Add<HStoreNamedField>(allocation_site_payload, |
| + access, new_create_info); |
| + store->SkipWriteBarrier(); // I am writing a smi |
|
Hannes Payer (out of office)
2013/11/21 20:52:24
Move comment in extra line and make it nice.
mvstanton
2013/11/22 11:18:51
Done.
|
| + } |
| } |
| int elements_location = JSArray::kSize; |
| @@ -9210,8 +9225,25 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
| ? HType::JSArray() : HType::JSObject(); |
| HValue* object_size_constant = Add<HConstant>( |
| boilerplate_object->map()->instance_size()); |
| + |
| + // We should pull pre-tenure mode from the allocation site. |
| + // For now, just see what it says, and remark on it if it sez |
| + // we should pretenure. That means the rudimentary counting in the garbage |
| + // collector is having an effect. |
| + PretenureFlag pretenure_flag = isolate()->heap()->GetPretenureMode(); |
| + if (FLAG_allocation_site_pretenuring) { |
| + pretenure_flag = site_context->current()->GetPretenureMode() |
| + ? TENURED |
| + : NOT_TENURED; |
| + if (FLAG_trace_track_allocation_sites) { |
| + PrintF("Boilerplate %p %s\n", |
| + static_cast<void*>(*boilerplate_object), |
| + pretenure_flag == TENURED ? "tenured" : "not tenured"); |
| + } |
| + } |
| + |
| HInstruction* object = Add<HAllocate>(object_size_constant, type, |
| - isolate()->heap()->GetPretenureMode(), instance_type); |
| + pretenure_flag, instance_type); |
| BuildEmitObjectHeader(boilerplate_object, object); |
| @@ -9225,10 +9257,10 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
| HValue* object_elements_size = Add<HConstant>(elements_size); |
| if (boilerplate_object->HasFastDoubleElements()) { |
| object_elements = Add<HAllocate>(object_elements_size, HType::JSObject(), |
| - isolate()->heap()->GetPretenureMode(), FIXED_DOUBLE_ARRAY_TYPE); |
| + pretenure_flag, FIXED_DOUBLE_ARRAY_TYPE); |
| } else { |
| object_elements = Add<HAllocate>(object_elements_size, HType::JSObject(), |
| - isolate()->heap()->GetPretenureMode(), FIXED_ARRAY_TYPE); |
| + pretenure_flag, FIXED_ARRAY_TYPE); |
| } |
| } |
| BuildInitElementsInObjectHeader(boilerplate_object, object, object_elements); |
| @@ -9241,7 +9273,8 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
| // Copy in-object properties. |
| if (boilerplate_object->map()->NumberOfFields() != 0) { |
| - BuildEmitInObjectProperties(boilerplate_object, object, site_context); |
| + BuildEmitInObjectProperties(boilerplate_object, object, site_context, |
| + pretenure_flag); |
| } |
| return object; |
| } |
| @@ -9294,7 +9327,8 @@ void HOptimizedGraphBuilder::BuildInitElementsInObjectHeader( |
| void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
| Handle<JSObject> boilerplate_object, |
| HInstruction* object, |
| - AllocationSiteContext* site_context) { |
| + AllocationSiteContext* site_context, |
| + PretenureFlag pretenure_flag) { |
| Handle<DescriptorArray> descriptors( |
| boilerplate_object->map()->instance_descriptors()); |
| int limit = boilerplate_object->map()->NumberOfOwnDescriptors(); |
| @@ -9330,15 +9364,13 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
| if (representation.IsDouble()) { |
| // Allocate a HeapNumber box and store the value into it. |
| HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize); |
| - // TODO(mvstanton): This heap number alloc does not have a corresponding |
| + // This heap number alloc does not have a corresponding |
| // AllocationSite. That is okay because |
| // 1) it's a child object of another object with a valid allocation site |
| // 2) we can just use the mode of the parent object for pretenuring |
| - // The todo is replace GetPretenureMode() with |
| - // site_context->top()->GetPretenureMode(). |
| HInstruction* double_box = |
| Add<HAllocate>(heap_number_constant, HType::HeapNumber(), |
| - isolate()->heap()->GetPretenureMode(), HEAP_NUMBER_TYPE); |
| + pretenure_flag, HEAP_NUMBER_TYPE); |
| AddStoreMapConstant(double_box, |
| isolate()->factory()->heap_number_map()); |
| Add<HStoreNamedField>(double_box, HObjectAccess::ForHeapNumberValue(), |