Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(443)

Unified Diff: src/hydrogen.cc

Issue 40063002: Bookkeeping for allocation site pretenuring (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebase built on site fields in another CL. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(),

Powered by Google App Engine
This is Rietveld 408576698