Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 824a3cd9dbf850cfa6e25ec255b81d9301d6d573..241a966ad20f167ad1755f403f57c4468f8c0c49 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -1824,8 +1824,8 @@ HValue* HGraphBuilder::BuildCreateAllocationMemento(HValue* previous_object, |
ASSERT(alloc_site != NULL); |
HInnerAllocatedObject* alloc_memento = Add<HInnerAllocatedObject>( |
previous_object, previous_object_size); |
- Handle<Map> alloc_memento_map( |
- isolate()->heap()->allocation_memento_map()); |
+ Handle<Map> alloc_memento_map = |
+ isolate()->factory()->allocation_memento_map(); |
AddStoreMapConstant(alloc_memento, alloc_memento_map); |
HObjectAccess access = HObjectAccess::ForAllocationMementoSite(); |
Add<HStoreNamedField>(alloc_memento, access, alloc_site); |
@@ -4295,17 +4295,26 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { |
ElementsKind boilerplate_elements_kind = |
Handle<JSObject>::cast(boilerplate_object)->GetElementsKind(); |
- // TODO(mvstanton): This heuristic is only a temporary solution. In the |
- // end, we want to quit creating allocation site info after a certain number |
- // of GCs for a call site. |
- AllocationSiteMode mode = AllocationSite::GetMode( |
- boilerplate_elements_kind); |
+ ASSERT(AllocationSite::CanTrack(boilerplate_object->map()->instance_type())); |
// Check whether to use fast or slow deep-copying for boilerplate. |
int max_properties = kMaxFastLiteralProperties; |
if (IsFastLiteral(boilerplate_object, |
kMaxFastLiteralDepth, |
&max_properties)) { |
+ // TODO(mvstanton): This heuristic is only a temporary solution. In the |
+ // end, we want to quit creating allocation site info after a certain number |
+ // of GCs for a call site. |
+ AllocationSiteMode mode = AllocationSite::GetMode( |
+ boilerplate_elements_kind); |
+ |
+ // it doesn't make sense to create allocation mementos if we are going to |
+ // create in old space. |
+ if (mode == TRACK_ALLOCATION_SITE && |
+ isolate()->heap()->GetPretenureMode() == TENURED) { |
+ mode = DONT_TRACK_ALLOCATION_SITE; |
+ } |
+ |
literal = BuildFastLiteral(boilerplate_object, |
site, |
mode); |
@@ -8118,13 +8127,15 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
int object_offset = object_size; |
InstanceType instance_type = boilerplate_object->map()->instance_type(); |
- bool create_allocation_site_info = mode == TRACK_ALLOCATION_SITE && |
- AllocationSite::CanTrack(instance_type); |
+ bool create_allocation_site_info = mode == TRACK_ALLOCATION_SITE; |
- // If using allocation sites, then the payload on the site should already |
- // be filled in as a valid (boilerplate) array. |
+ // If using allocation sites, then |
+ // 1) the payload on the site should already be filled in as a valid |
+ // (boilerplate) array, and |
+ // 2) we shouldn't be pretenuring the allocations. |
ASSERT(!create_allocation_site_info || |
- AllocationSite::cast(*allocation_site_object)->IsLiteralSite()); |
+ (AllocationSite::cast(*allocation_site_object)->IsLiteralSite() && |
+ isolate()->heap()->GetPretenureMode() == NOT_TENURED)); |
if (create_allocation_site_info) { |
object_size += AllocationMemento::kSize; |
@@ -8137,7 +8148,6 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
HInstruction* object = Add<HAllocate>(object_size_constant, type, |
isolate()->heap()->GetPretenureMode(), instance_type); |
- |
BuildEmitObjectHeader(boilerplate_object, object); |
if (create_allocation_site_info) { |