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

Side by Side Diff: src/crankshaft/hydrogen.cc

Issue 1865013002: Quit creating array literal boilerplates from Crankshaft. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 months 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 unified diff | Download patch
« no previous file with comments | « no previous file | src/runtime/runtime.h » ('j') | src/runtime/runtime.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/crankshaft/hydrogen.h" 5 #include "src/crankshaft/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/allocation-site-scopes.h" 9 #include "src/allocation-site-scopes.h"
10 #include "src/ast/ast-numbering.h" 10 #include "src/ast/ast-numbering.h"
(...skipping 5972 matching lines...) Expand 10 before | Expand all | Expand 10 after
5983 DCHECK(!HasStackOverflow()); 5983 DCHECK(!HasStackOverflow());
5984 DCHECK(current_block() != NULL); 5984 DCHECK(current_block() != NULL);
5985 DCHECK(current_block()->HasPredecessor()); 5985 DCHECK(current_block()->HasPredecessor());
5986 ZoneList<Expression*>* subexprs = expr->values(); 5986 ZoneList<Expression*>* subexprs = expr->values();
5987 int length = subexprs->length(); 5987 int length = subexprs->length();
5988 HInstruction* literal; 5988 HInstruction* literal;
5989 5989
5990 Handle<AllocationSite> site; 5990 Handle<AllocationSite> site;
5991 Handle<LiteralsArray> literals(environment()->closure()->literals(), 5991 Handle<LiteralsArray> literals(environment()->closure()->literals(),
5992 isolate()); 5992 isolate());
5993 bool uninitialized = false;
5994 Handle<Object> literals_cell(literals->literal(expr->literal_index()), 5993 Handle<Object> literals_cell(literals->literal(expr->literal_index()),
5995 isolate()); 5994 isolate());
5996 Handle<JSObject> boilerplate_object; 5995 Handle<JSObject> boilerplate_object;
5997 if (literals_cell->IsUndefined()) { 5996 if (!literals_cell->IsUndefined()) {
5998 uninitialized = true;
5999 Handle<Object> raw_boilerplate;
6000 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
6001 isolate(), raw_boilerplate,
6002 Runtime::CreateArrayLiteralBoilerplate(isolate(), literals,
6003 expr->constant_elements()),
6004 Bailout(kArrayBoilerplateCreationFailed));
6005
6006 boilerplate_object = Handle<JSObject>::cast(raw_boilerplate);
6007 AllocationSiteCreationContext creation_context(isolate());
6008 site = creation_context.EnterNewScope();
6009 if (JSObject::DeepWalk(boilerplate_object, &creation_context).is_null()) {
6010 return Bailout(kArrayBoilerplateCreationFailed);
6011 }
6012 creation_context.ExitScope(site, boilerplate_object);
6013 literals->set_literal(expr->literal_index(), *site);
6014
6015 if (boilerplate_object->elements()->map() ==
6016 isolate()->heap()->fixed_cow_array_map()) {
6017 isolate()->counters()->cow_arrays_created_runtime()->Increment();
6018 }
6019 } else {
6020 DCHECK(literals_cell->IsAllocationSite()); 5997 DCHECK(literals_cell->IsAllocationSite());
6021 site = Handle<AllocationSite>::cast(literals_cell); 5998 site = Handle<AllocationSite>::cast(literals_cell);
6022 boilerplate_object = Handle<JSObject>( 5999 boilerplate_object = Handle<JSObject>(
6023 JSObject::cast(site->transition_info()), isolate()); 6000 JSObject::cast(site->transition_info()), isolate());
6024 } 6001 }
6025 6002
6026 DCHECK(!boilerplate_object.is_null()); 6003 ElementsKind boilerplate_elements_kind = expr->constant_elements_kind();
6027 DCHECK(site->SitePointsToLiteral()); 6004 if (!boilerplate_object.is_null()) {
6028 6005 boilerplate_elements_kind = boilerplate_object->GetElementsKind();
6029 ElementsKind boilerplate_elements_kind = 6006 }
6030 boilerplate_object->GetElementsKind();
6031 6007
6032 // Check whether to use fast or slow deep-copying for boilerplate. 6008 // Check whether to use fast or slow deep-copying for boilerplate.
6033 int max_properties = kMaxFastLiteralProperties; 6009 int max_properties = kMaxFastLiteralProperties;
6034 if (IsFastLiteral(boilerplate_object, 6010 if (!boilerplate_object.is_null() &&
6035 kMaxFastLiteralDepth, 6011 IsFastLiteral(boilerplate_object, kMaxFastLiteralDepth,
6036 &max_properties)) { 6012 &max_properties)) {
6013 DCHECK(site->SitePointsToLiteral());
6037 AllocationSiteUsageContext site_context(isolate(), site, false); 6014 AllocationSiteUsageContext site_context(isolate(), site, false);
6038 site_context.EnterNewScope(); 6015 site_context.EnterNewScope();
6039 literal = BuildFastLiteral(boilerplate_object, &site_context); 6016 literal = BuildFastLiteral(boilerplate_object, &site_context);
6040 site_context.ExitScope(site, boilerplate_object); 6017 site_context.ExitScope(site, boilerplate_object);
6041 } else { 6018 } else {
6042 NoObservableSideEffectsScope no_effects(this); 6019 NoObservableSideEffectsScope no_effects(this);
6043 // Boilerplate already exists and constant elements are never accessed, 6020 Handle<FixedArray> constants = expr->constant_elements();
6044 // pass an empty fixed array to the runtime function instead.
6045 Handle<FixedArray> constants = isolate()->factory()->empty_fixed_array();
6046 int literal_index = expr->literal_index(); 6021 int literal_index = expr->literal_index();
6047 int flags = expr->ComputeFlags(true); 6022 int flags = expr->ComputeFlags(true);
6048 6023
6049 Add<HPushArguments>(AddThisFunction(), Add<HConstant>(literal_index), 6024 Add<HPushArguments>(AddThisFunction(), Add<HConstant>(literal_index),
6050 Add<HConstant>(constants), Add<HConstant>(flags)); 6025 Add<HConstant>(constants), Add<HConstant>(flags));
6051 6026
6052 Runtime::FunctionId function_id = Runtime::kCreateArrayLiteral; 6027 Runtime::FunctionId function_id = Runtime::kCreateArrayLiteral;
6053 literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4); 6028 literal = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 4);
6054 6029
6055 // Register to deopt if the boilerplate ElementsKind changes. 6030 // Register to deopt if the boilerplate ElementsKind changes.
6056 top_info()->dependencies()->AssumeTransitionStable(site); 6031 if (!site.is_null()) {
6032 top_info()->dependencies()->AssumeTransitionStable(site);
6033 }
6057 } 6034 }
6058 6035
6059 // The array is expected in the bailout environment during computation 6036 // The array is expected in the bailout environment during computation
6060 // of the property values and is the value of the entire expression. 6037 // of the property values and is the value of the entire expression.
6061 Push(literal); 6038 Push(literal);
6062 6039
6063 HInstruction* elements = NULL; 6040 HInstruction* elements = NULL;
6064 6041
6065 for (int i = 0; i < length; i++) { 6042 for (int i = 0; i < length; i++) {
6066 Expression* subexpr = subexprs->at(i); 6043 Expression* subexpr = subexprs->at(i);
(...skipping 11 matching lines...) Expand all
6078 6055
6079 HValue* key = Add<HConstant>(i); 6056 HValue* key = Add<HConstant>(i);
6080 6057
6081 switch (boilerplate_elements_kind) { 6058 switch (boilerplate_elements_kind) {
6082 case FAST_SMI_ELEMENTS: 6059 case FAST_SMI_ELEMENTS:
6083 case FAST_HOLEY_SMI_ELEMENTS: 6060 case FAST_HOLEY_SMI_ELEMENTS:
6084 case FAST_ELEMENTS: 6061 case FAST_ELEMENTS:
6085 case FAST_HOLEY_ELEMENTS: 6062 case FAST_HOLEY_ELEMENTS:
6086 case FAST_DOUBLE_ELEMENTS: 6063 case FAST_DOUBLE_ELEMENTS:
6087 case FAST_HOLEY_DOUBLE_ELEMENTS: { 6064 case FAST_HOLEY_DOUBLE_ELEMENTS: {
6088 HStoreKeyed* instr = Add<HStoreKeyed>(elements, key, value, nullptr, 6065 Add<HStoreKeyed>(elements, key, value, nullptr,
6089 boilerplate_elements_kind); 6066 boilerplate_elements_kind);
6090 instr->SetUninitialized(uninitialized);
6091 break; 6067 break;
6092 } 6068 }
6093 default: 6069 default:
6094 UNREACHABLE(); 6070 UNREACHABLE();
6095 break; 6071 break;
6096 } 6072 }
6097 6073
6098 Add<HSimulate>(expr->GetIdForElement(i)); 6074 Add<HSimulate>(expr->GetIdForElement(i));
6099 } 6075 }
6100 6076
(...skipping 7469 matching lines...) Expand 10 before | Expand all | Expand 10 after
13570 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13546 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13571 } 13547 }
13572 13548
13573 #ifdef DEBUG 13549 #ifdef DEBUG
13574 graph_->Verify(false); // No full verify. 13550 graph_->Verify(false); // No full verify.
13575 #endif 13551 #endif
13576 } 13552 }
13577 13553
13578 } // namespace internal 13554 } // namespace internal
13579 } // namespace v8 13555 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/runtime/runtime.h » ('j') | src/runtime/runtime.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698