From aa90e62ba0f74a1c10e74446d21aac10b0284d7b Mon Sep 17 00:00:00 2001 From: "mvstanton@chromium.org" Date: Tue, 1 Oct 2013 08:22:01 +0000 Subject: [PATCH] In crankshafted code, we were creating allocation mementos for shallow SMI array literals when we shouldn't. The idea is that we should have learned by this point what type of array we'll end up with. R=hpayer@chromium.org Review URL: https://codereview.chromium.org/25146007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17028 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen.cc | 62 +++++++------------------------------------------ src/hydrogen.h | 4 +--- 2 files changed, 10 insertions(+), 56 deletions(-) diff --git a/src/hydrogen.cc b/src/hydrogen.cc index b7d175637e..c22d6c319a 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -4321,9 +4321,7 @@ void HOptimizedGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { &max_properties)) { Handle boilerplate_object = Handle::cast(boilerplate); - literal = BuildFastLiteral(boilerplate_object, - Handle::null(), - DONT_TRACK_ALLOCATION_SITE); + literal = BuildFastLiteral(boilerplate_object); } else { NoObservableSideEffectsScope no_effects(this); Handle closure_literals(closure->literals(), isolate()); @@ -4467,22 +4465,7 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) { 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); + literal = BuildFastLiteral(boilerplate_object); } else { NoObservableSideEffectsScope no_effects(this); // Boilerplate already exists and constant elements are never accessed, @@ -8379,44 +8362,21 @@ HInstruction* HOptimizedGraphBuilder::BuildThisFunction() { HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( - Handle boilerplate_object, - Handle allocation_site_object, - AllocationSiteMode mode) { + Handle boilerplate_object) { NoObservableSideEffectsScope no_effects(this); - - Handle elements(boilerplate_object->elements()); - int object_size = boilerplate_object->map()->instance_size(); - int object_offset = object_size; - InstanceType instance_type = boilerplate_object->map()->instance_type(); - bool create_allocation_site_info = mode == TRACK_ALLOCATION_SITE; - - // 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() && - isolate()->heap()->GetPretenureMode() == NOT_TENURED)); - - if (create_allocation_site_info) { - object_size += AllocationMemento::kSize; - } - ASSERT(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE); + HType type = instance_type == JS_ARRAY_TYPE ? HType::JSArray() : HType::JSObject(); - HValue* object_size_constant = Add(object_size); + HValue* object_size_constant = Add( + boilerplate_object->map()->instance_size()); HInstruction* object = Add(object_size_constant, type, isolate()->heap()->GetPretenureMode(), instance_type); BuildEmitObjectHeader(boilerplate_object, object); - if (create_allocation_site_info) { - HInstruction* allocation_site = Add(allocation_site_object); - BuildCreateAllocationMemento(object, object_offset, allocation_site); - } - + Handle elements(boilerplate_object->elements()); int elements_size = (elements->length() > 0 && elements->map() != isolate()->heap()->fixed_cow_array_map()) ? elements->Size() : 0; @@ -8518,9 +8478,7 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( if (value->IsJSObject()) { Handle value_object = Handle::cast(value); - HInstruction* result = - BuildFastLiteral(value_object, - Handle::null(), DONT_TRACK_ALLOCATION_SITE); + HInstruction* result = BuildFastLiteral(value_object); Add(object, access, result); } else { Representation representation = details.representation(); @@ -8606,9 +8564,7 @@ void HOptimizedGraphBuilder::BuildEmitFixedArray( HValue* key_constant = Add(i); if (value->IsJSObject()) { Handle value_object = Handle::cast(value); - HInstruction* result = - BuildFastLiteral(value_object, - Handle::null(), DONT_TRACK_ALLOCATION_SITE); + HInstruction* result = BuildFastLiteral(value_object); Add(object_elements, key_constant, result, kind); } else { HInstruction* value_instruction = diff --git a/src/hydrogen.h b/src/hydrogen.h index 9b998c92b9..6c8bde1def 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -2244,9 +2244,7 @@ class HOptimizedGraphBuilder V8_FINAL HInstruction* BuildThisFunction(); - HInstruction* BuildFastLiteral(Handle boilerplate_object, - Handle allocation_site, - AllocationSiteMode mode); + HInstruction* BuildFastLiteral(Handle boilerplate_object); void BuildEmitObjectHeader(Handle boilerplate_object, HInstruction* object);