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

Side by Side Diff: src/hydrogen.cc

Issue 24250005: AllocationSites for all literals (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE Created 7 years, 2 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 12 matching lines...) Expand all
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #include "hydrogen.h" 28 #include "hydrogen.h"
29 29
30 #include <algorithm> 30 #include <algorithm>
31 31
32 #include "v8.h" 32 #include "v8.h"
33 #include "allocation-site-scopes.h"
33 #include "codegen.h" 34 #include "codegen.h"
34 #include "full-codegen.h" 35 #include "full-codegen.h"
35 #include "hashmap.h" 36 #include "hashmap.h"
36 #include "hydrogen-bce.h" 37 #include "hydrogen-bce.h"
37 #include "hydrogen-bch.h" 38 #include "hydrogen-bch.h"
38 #include "hydrogen-canonicalize.h" 39 #include "hydrogen-canonicalize.h"
39 #include "hydrogen-check-elimination.h" 40 #include "hydrogen-check-elimination.h"
40 #include "hydrogen-dce.h" 41 #include "hydrogen-dce.h"
41 #include "hydrogen-dehoist.h" 42 #include "hydrogen-dehoist.h"
42 #include "hydrogen-environment-liveness.h" 43 #include "hydrogen-environment-liveness.h"
(...skipping 4299 matching lines...) Expand 10 before | Expand all | Expand 10 after
4342 if (!literals_cell->IsUndefined()) { 4343 if (!literals_cell->IsUndefined()) {
4343 // Retrieve the boilerplate 4344 // Retrieve the boilerplate
4344 site = Handle<AllocationSite>::cast(literals_cell); 4345 site = Handle<AllocationSite>::cast(literals_cell);
4345 boilerplate = Handle<JSObject>(JSObject::cast(site->transition_info()), 4346 boilerplate = Handle<JSObject>(JSObject::cast(site->transition_info()),
4346 isolate()); 4347 isolate());
4347 } 4348 }
4348 4349
4349 if (!boilerplate.is_null() && 4350 if (!boilerplate.is_null() &&
4350 IsFastLiteral(boilerplate, kMaxFastLiteralDepth, &max_properties)) { 4351 IsFastLiteral(boilerplate, kMaxFastLiteralDepth, &max_properties)) {
4351 literal = BuildFastLiteral(boilerplate); 4352 literal = BuildFastLiteral(boilerplate);
4353 AllocationSiteContext site_context(isolate(), false);
4354 AllocationSiteUsageScope site_scope(&site_context, site, boilerplate);
4355 literal = BuildFastLiteral(boilerplate, &site_context);
4352 } else { 4356 } else {
4353 NoObservableSideEffectsScope no_effects(this); 4357 NoObservableSideEffectsScope no_effects(this);
4354 Handle<FixedArray> closure_literals(closure->literals(), isolate()); 4358 Handle<FixedArray> closure_literals(closure->literals(), isolate());
4355 Handle<FixedArray> constant_properties = expr->constant_properties(); 4359 Handle<FixedArray> constant_properties = expr->constant_properties();
4356 int literal_index = expr->literal_index(); 4360 int literal_index = expr->literal_index();
4357 int flags = expr->fast_elements() 4361 int flags = expr->fast_elements()
4358 ? ObjectLiteral::kFastElements : ObjectLiteral::kNoFlags; 4362 ? ObjectLiteral::kFastElements : ObjectLiteral::kNoFlags;
4359 flags |= expr->has_function() 4363 flags |= expr->has_function()
4360 ? ObjectLiteral::kHasFunction : ObjectLiteral::kNoFlags; 4364 ? ObjectLiteral::kHasFunction : ObjectLiteral::kNoFlags;
4361 4365
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
4456 isolate()); 4460 isolate());
4457 Handle<Object> raw_boilerplate; 4461 Handle<Object> raw_boilerplate;
4458 if (literals_cell->IsUndefined()) { 4462 if (literals_cell->IsUndefined()) {
4459 uninitialized = true; 4463 uninitialized = true;
4460 raw_boilerplate = Runtime::CreateArrayLiteralBoilerplate( 4464 raw_boilerplate = Runtime::CreateArrayLiteralBoilerplate(
4461 isolate(), literals, expr->constant_elements()); 4465 isolate(), literals, expr->constant_elements());
4462 if (raw_boilerplate.is_null()) { 4466 if (raw_boilerplate.is_null()) {
4463 return Bailout(kArrayBoilerplateCreationFailed); 4467 return Bailout(kArrayBoilerplateCreationFailed);
4464 } 4468 }
4465 4469
4466 site = isolate()->factory()->NewAllocationSite(); 4470 AllocationSiteContext site_context(isolate(), true);
4467 site->set_transition_info(*raw_boilerplate); 4471 AllocationSiteCreationScope site_scope(&site_context);
4472 Handle<Object> same = JSObject::DeepWalk(
4473 Handle<JSObject>::cast(raw_boilerplate), &site_context);
4474 site = site_context.top();
4475 site->set_transition_info(*same);
4468 literals->set(expr->literal_index(), *site); 4476 literals->set(expr->literal_index(), *site);
4469 4477
4470 if (JSObject::cast(*raw_boilerplate)->elements()->map() == 4478 if (JSObject::cast(*raw_boilerplate)->elements()->map() ==
4471 isolate()->heap()->fixed_cow_array_map()) { 4479 isolate()->heap()->fixed_cow_array_map()) {
4472 isolate()->counters()->cow_arrays_created_runtime()->Increment(); 4480 isolate()->counters()->cow_arrays_created_runtime()->Increment();
4473 } 4481 }
4474 } else { 4482 } else {
4475 ASSERT(literals_cell->IsAllocationSite()); 4483 ASSERT(literals_cell->IsAllocationSite());
4476 site = Handle<AllocationSite>::cast(literals_cell); 4484 site = Handle<AllocationSite>::cast(literals_cell);
4477 raw_boilerplate = Handle<Object>(site->transition_info(), isolate()); 4485 raw_boilerplate = Handle<Object>(site->transition_info(), isolate());
4478 } 4486 }
4479 4487
4480 ASSERT(!raw_boilerplate.is_null()); 4488 ASSERT(!raw_boilerplate.is_null());
4481 ASSERT(site->IsLiteralSite()); 4489 ASSERT(site->IsLiteralSite());
4482 4490
4483 Handle<JSObject> boilerplate_object = 4491 Handle<JSObject> boilerplate_object =
4484 Handle<JSObject>::cast(raw_boilerplate); 4492 Handle<JSObject>::cast(raw_boilerplate);
4485 ElementsKind boilerplate_elements_kind = 4493 ElementsKind boilerplate_elements_kind =
4486 Handle<JSObject>::cast(boilerplate_object)->GetElementsKind(); 4494 Handle<JSObject>::cast(boilerplate_object)->GetElementsKind();
4487 4495
4488 ASSERT(AllocationSite::CanTrack(boilerplate_object->map()->instance_type()));
4489
4490 // Check whether to use fast or slow deep-copying for boilerplate. 4496 // Check whether to use fast or slow deep-copying for boilerplate.
4491 int max_properties = kMaxFastLiteralProperties; 4497 int max_properties = kMaxFastLiteralProperties;
4492 if (IsFastLiteral(boilerplate_object, 4498 if (IsFastLiteral(boilerplate_object,
4493 kMaxFastLiteralDepth, 4499 kMaxFastLiteralDepth,
4494 &max_properties)) { 4500 &max_properties)) {
4495 literal = BuildFastLiteral(boilerplate_object); 4501 AllocationSiteContext site_context(isolate(), false);
4502 AllocationSiteUsageScope site_scope(&site_context, site,
4503 boilerplate_object);
4504 literal = BuildFastLiteral(boilerplate_object, &site_context);
4496 } else { 4505 } else {
4497 NoObservableSideEffectsScope no_effects(this); 4506 NoObservableSideEffectsScope no_effects(this);
4498 // Boilerplate already exists and constant elements are never accessed, 4507 // Boilerplate already exists and constant elements are never accessed,
4499 // pass an empty fixed array to the runtime function instead. 4508 // pass an empty fixed array to the runtime function instead.
4500 Handle<FixedArray> constants = isolate()->factory()->empty_fixed_array(); 4509 Handle<FixedArray> constants = isolate()->factory()->empty_fixed_array();
4501 int literal_index = expr->literal_index(); 4510 int literal_index = expr->literal_index();
4502 4511
4503 Add<HPushArgument>(Add<HConstant>(literals)); 4512 Add<HPushArgument>(Add<HConstant>(literals));
4504 Add<HPushArgument>(Add<HConstant>(literal_index)); 4513 Add<HPushArgument>(Add<HConstant>(literal_index));
4505 Add<HPushArgument>(Add<HConstant>(constants)); 4514 Add<HPushArgument>(Add<HConstant>(constants));
(...skipping 3900 matching lines...) Expand 10 before | Expand all | Expand 10 after
8406 if (function_state()->outer() != NULL) { 8415 if (function_state()->outer() != NULL) {
8407 return New<HConstant>( 8416 return New<HConstant>(
8408 function_state()->compilation_info()->closure()); 8417 function_state()->compilation_info()->closure());
8409 } else { 8418 } else {
8410 return new(zone()) HThisFunction; 8419 return new(zone()) HThisFunction;
8411 } 8420 }
8412 } 8421 }
8413 8422
8414 8423
8415 HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( 8424 HInstruction* HOptimizedGraphBuilder::BuildFastLiteral(
8416 Handle<JSObject> boilerplate_object) { 8425 Handle<JSObject> boilerplate_object,
8426 AllocationSiteContext* site_context) {
8417 NoObservableSideEffectsScope no_effects(this); 8427 NoObservableSideEffectsScope no_effects(this);
8418 InstanceType instance_type = boilerplate_object->map()->instance_type(); 8428 InstanceType instance_type = boilerplate_object->map()->instance_type();
8419 ASSERT(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE); 8429 ASSERT(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE);
8420 8430
8421 HType type = instance_type == JS_ARRAY_TYPE 8431 HType type = instance_type == JS_ARRAY_TYPE
8422 ? HType::JSArray() : HType::JSObject(); 8432 ? HType::JSArray() : HType::JSObject();
8423 HValue* object_size_constant = Add<HConstant>( 8433 HValue* object_size_constant = Add<HConstant>(
8424 boilerplate_object->map()->instance_size()); 8434 boilerplate_object->map()->instance_size());
8425 HInstruction* object = Add<HAllocate>(object_size_constant, type, 8435 HInstruction* object = Add<HAllocate>(object_size_constant, type,
8426 isolate()->heap()->GetPretenureMode(), instance_type); 8436 isolate()->heap()->GetPretenureMode(), instance_type);
(...skipping 11 matching lines...) Expand all
8438 if (boilerplate_object->HasFastDoubleElements()) { 8448 if (boilerplate_object->HasFastDoubleElements()) {
8439 object_elements = Add<HAllocate>(object_elements_size, HType::JSObject(), 8449 object_elements = Add<HAllocate>(object_elements_size, HType::JSObject(),
8440 isolate()->heap()->GetPretenureMode(), FIXED_DOUBLE_ARRAY_TYPE); 8450 isolate()->heap()->GetPretenureMode(), FIXED_DOUBLE_ARRAY_TYPE);
8441 } else { 8451 } else {
8442 object_elements = Add<HAllocate>(object_elements_size, HType::JSObject(), 8452 object_elements = Add<HAllocate>(object_elements_size, HType::JSObject(),
8443 isolate()->heap()->GetPretenureMode(), FIXED_ARRAY_TYPE); 8453 isolate()->heap()->GetPretenureMode(), FIXED_ARRAY_TYPE);
8444 } 8454 }
8445 } 8455 }
8446 BuildInitElementsInObjectHeader(boilerplate_object, object, object_elements); 8456 BuildInitElementsInObjectHeader(boilerplate_object, object, object_elements);
8447 8457
8448
8449 // Copy object elements if non-COW. 8458 // Copy object elements if non-COW.
8450 if (object_elements != NULL) { 8459 if (object_elements != NULL) {
8451 BuildEmitElements(boilerplate_object, elements, object_elements); 8460 BuildEmitElements(boilerplate_object, elements, object_elements,
8461 site_context);
8452 } 8462 }
8453 8463
8454 // Copy in-object properties. 8464 // Copy in-object properties.
8455 if (boilerplate_object->map()->NumberOfFields() != 0) { 8465 if (boilerplate_object->map()->NumberOfFields() != 0) {
8456 BuildEmitInObjectProperties(boilerplate_object, object); 8466 BuildEmitInObjectProperties(boilerplate_object, object, site_context);
8457 } 8467 }
8458 return object; 8468 return object;
8459 } 8469 }
8460 8470
8461 8471
8462 void HOptimizedGraphBuilder::BuildEmitObjectHeader( 8472 void HOptimizedGraphBuilder::BuildEmitObjectHeader(
8463 Handle<JSObject> boilerplate_object, 8473 Handle<JSObject> boilerplate_object,
8464 HInstruction* object) { 8474 HInstruction* object) {
8465 ASSERT(boilerplate_object->properties()->length() == 0); 8475 ASSERT(boilerplate_object->properties()->length() == 0);
8466 8476
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
8498 Handle<Object>(boilerplate_object->elements(), isolate()); 8508 Handle<Object>(boilerplate_object->elements(), isolate());
8499 object_elements = Add<HConstant>(elements_field); 8509 object_elements = Add<HConstant>(elements_field);
8500 } 8510 }
8501 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), 8511 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(),
8502 object_elements); 8512 object_elements);
8503 } 8513 }
8504 8514
8505 8515
8506 void HOptimizedGraphBuilder::BuildEmitInObjectProperties( 8516 void HOptimizedGraphBuilder::BuildEmitInObjectProperties(
8507 Handle<JSObject> boilerplate_object, 8517 Handle<JSObject> boilerplate_object,
8508 HInstruction* object) { 8518 HInstruction* object,
8519 AllocationSiteContext* site_context) {
8509 Handle<DescriptorArray> descriptors( 8520 Handle<DescriptorArray> descriptors(
8510 boilerplate_object->map()->instance_descriptors()); 8521 boilerplate_object->map()->instance_descriptors());
8511 int limit = boilerplate_object->map()->NumberOfOwnDescriptors(); 8522 int limit = boilerplate_object->map()->NumberOfOwnDescriptors();
8512 8523
8513 int copied_fields = 0; 8524 int copied_fields = 0;
8514 for (int i = 0; i < limit; i++) { 8525 for (int i = 0; i < limit; i++) {
8515 PropertyDetails details = descriptors->GetDetails(i); 8526 PropertyDetails details = descriptors->GetDetails(i);
8516 if (details.type() != FIELD) continue; 8527 if (details.type() != FIELD) continue;
8517 copied_fields++; 8528 copied_fields++;
8518 int index = descriptors->GetFieldIndex(i); 8529 int index = descriptors->GetFieldIndex(i);
8519 int property_offset = boilerplate_object->GetInObjectPropertyOffset(index); 8530 int property_offset = boilerplate_object->GetInObjectPropertyOffset(index);
8520 Handle<Name> name(descriptors->GetKey(i)); 8531 Handle<Name> name(descriptors->GetKey(i));
8521 Handle<Object> value = 8532 Handle<Object> value =
8522 Handle<Object>(boilerplate_object->InObjectPropertyAt(index), 8533 Handle<Object>(boilerplate_object->InObjectPropertyAt(index),
8523 isolate()); 8534 isolate());
8524 8535
8525 // The access for the store depends on the type of the boilerplate. 8536 // The access for the store depends on the type of the boilerplate.
8526 HObjectAccess access = boilerplate_object->IsJSArray() ? 8537 HObjectAccess access = boilerplate_object->IsJSArray() ?
8527 HObjectAccess::ForJSArrayOffset(property_offset) : 8538 HObjectAccess::ForJSArrayOffset(property_offset) :
8528 HObjectAccess::ForJSObjectOffset(property_offset); 8539 HObjectAccess::ForJSObjectOffset(property_offset);
8529 8540
8530 if (value->IsJSObject()) { 8541 if (value->IsJSObject()) {
8542 AllocationSiteUsageScope site_scope(site_context, value);
8531 Handle<JSObject> value_object = Handle<JSObject>::cast(value); 8543 Handle<JSObject> value_object = Handle<JSObject>::cast(value);
8532 HInstruction* result = BuildFastLiteral(value_object); 8544 HInstruction* result =
8545 BuildFastLiteral(value_object, site_context);
8533 Add<HStoreNamedField>(object, access, result); 8546 Add<HStoreNamedField>(object, access, result);
8534 } else { 8547 } else {
8535 Representation representation = details.representation(); 8548 Representation representation = details.representation();
8536 HInstruction* value_instruction = Add<HConstant>(value); 8549 HInstruction* value_instruction = Add<HConstant>(value);
8537 8550
8538 if (representation.IsDouble()) { 8551 if (representation.IsDouble()) {
8539 // Allocate a HeapNumber box and store the value into it. 8552 // Allocate a HeapNumber box and store the value into it.
8540 HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize); 8553 HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize);
8554 // TODO(mvstanton): This heap number alloc does not have a corresponding
8555 // AllocationSite. That is okay because
8556 // 1) it's a child object of another object with a valid allocation site
8557 // 2) we can just use the mode of the parent object for pretenuring
8558 // The todo is replace GetPretenureMode() with
8559 // site_context->top()->GetPretenureMode().
8541 HInstruction* double_box = 8560 HInstruction* double_box =
8542 Add<HAllocate>(heap_number_constant, HType::HeapNumber(), 8561 Add<HAllocate>(heap_number_constant, HType::HeapNumber(),
8543 isolate()->heap()->GetPretenureMode(), HEAP_NUMBER_TYPE); 8562 isolate()->heap()->GetPretenureMode(), HEAP_NUMBER_TYPE);
8544 AddStoreMapConstant(double_box, 8563 AddStoreMapConstant(double_box,
8545 isolate()->factory()->heap_number_map()); 8564 isolate()->factory()->heap_number_map());
8546 Add<HStoreNamedField>(double_box, HObjectAccess::ForHeapNumberValue(), 8565 Add<HStoreNamedField>(double_box, HObjectAccess::ForHeapNumberValue(),
8547 value_instruction); 8566 value_instruction);
8548 value_instruction = double_box; 8567 value_instruction = double_box;
8549 } 8568 }
8550 8569
8551 Add<HStoreNamedField>(object, access, value_instruction); 8570 Add<HStoreNamedField>(object, access, value_instruction);
8552 } 8571 }
8553 } 8572 }
8554 8573
8555 int inobject_properties = boilerplate_object->map()->inobject_properties(); 8574 int inobject_properties = boilerplate_object->map()->inobject_properties();
8556 HInstruction* value_instruction = 8575 HInstruction* value_instruction =
8557 Add<HConstant>(isolate()->factory()->one_pointer_filler_map()); 8576 Add<HConstant>(isolate()->factory()->one_pointer_filler_map());
8558 for (int i = copied_fields; i < inobject_properties; i++) { 8577 for (int i = copied_fields; i < inobject_properties; i++) {
8559 ASSERT(boilerplate_object->IsJSObject()); 8578 ASSERT(boilerplate_object->IsJSObject());
8560 int property_offset = boilerplate_object->GetInObjectPropertyOffset(i); 8579 int property_offset = boilerplate_object->GetInObjectPropertyOffset(i);
8561 HObjectAccess access = HObjectAccess::ForJSObjectOffset(property_offset); 8580 HObjectAccess access = HObjectAccess::ForJSObjectOffset(property_offset);
8562 Add<HStoreNamedField>(object, access, value_instruction); 8581 Add<HStoreNamedField>(object, access, value_instruction);
8563 } 8582 }
8564 } 8583 }
8565 8584
8566 8585
8567 void HOptimizedGraphBuilder::BuildEmitElements( 8586 void HOptimizedGraphBuilder::BuildEmitElements(
8568 Handle<JSObject> boilerplate_object, 8587 Handle<JSObject> boilerplate_object,
8569 Handle<FixedArrayBase> elements, 8588 Handle<FixedArrayBase> elements,
8570 HValue* object_elements) { 8589 HValue* object_elements,
8590 AllocationSiteContext* site_context) {
8571 ElementsKind kind = boilerplate_object->map()->elements_kind(); 8591 ElementsKind kind = boilerplate_object->map()->elements_kind();
8572 int elements_length = elements->length(); 8592 int elements_length = elements->length();
8573 HValue* object_elements_length = Add<HConstant>(elements_length); 8593 HValue* object_elements_length = Add<HConstant>(elements_length);
8574 BuildInitializeElementsHeader(object_elements, kind, object_elements_length); 8594 BuildInitializeElementsHeader(object_elements, kind, object_elements_length);
8575 8595
8576 // Copy elements backing store content. 8596 // Copy elements backing store content.
8577 if (elements->IsFixedDoubleArray()) { 8597 if (elements->IsFixedDoubleArray()) {
8578 BuildEmitFixedDoubleArray(elements, kind, object_elements); 8598 BuildEmitFixedDoubleArray(elements, kind, object_elements);
8579 } else if (elements->IsFixedArray()) { 8599 } else if (elements->IsFixedArray()) {
8580 BuildEmitFixedArray(elements, kind, object_elements); 8600 BuildEmitFixedArray(elements, kind, object_elements,
8601 site_context);
8581 } else { 8602 } else {
8582 UNREACHABLE(); 8603 UNREACHABLE();
8583 } 8604 }
8584 } 8605 }
8585 8606
8586 8607
8587 void HOptimizedGraphBuilder::BuildEmitFixedDoubleArray( 8608 void HOptimizedGraphBuilder::BuildEmitFixedDoubleArray(
8588 Handle<FixedArrayBase> elements, 8609 Handle<FixedArrayBase> elements,
8589 ElementsKind kind, 8610 ElementsKind kind,
8590 HValue* object_elements) { 8611 HValue* object_elements) {
8591 HInstruction* boilerplate_elements = Add<HConstant>(elements); 8612 HInstruction* boilerplate_elements = Add<HConstant>(elements);
8592 int elements_length = elements->length(); 8613 int elements_length = elements->length();
8593 for (int i = 0; i < elements_length; i++) { 8614 for (int i = 0; i < elements_length; i++) {
8594 HValue* key_constant = Add<HConstant>(i); 8615 HValue* key_constant = Add<HConstant>(i);
8595 HInstruction* value_instruction = 8616 HInstruction* value_instruction =
8596 Add<HLoadKeyed>(boilerplate_elements, key_constant, 8617 Add<HLoadKeyed>(boilerplate_elements, key_constant,
8597 static_cast<HValue*>(NULL), kind, 8618 static_cast<HValue*>(NULL), kind,
8598 ALLOW_RETURN_HOLE); 8619 ALLOW_RETURN_HOLE);
8599 HInstruction* store = Add<HStoreKeyed>(object_elements, key_constant, 8620 HInstruction* store = Add<HStoreKeyed>(object_elements, key_constant,
8600 value_instruction, kind); 8621 value_instruction, kind);
8601 store->SetFlag(HValue::kAllowUndefinedAsNaN); 8622 store->SetFlag(HValue::kAllowUndefinedAsNaN);
8602 } 8623 }
8603 } 8624 }
8604 8625
8605 8626
8606 void HOptimizedGraphBuilder::BuildEmitFixedArray( 8627 void HOptimizedGraphBuilder::BuildEmitFixedArray(
8607 Handle<FixedArrayBase> elements, 8628 Handle<FixedArrayBase> elements,
8608 ElementsKind kind, 8629 ElementsKind kind,
8609 HValue* object_elements) { 8630 HValue* object_elements,
8631 AllocationSiteContext* site_context) {
8610 HInstruction* boilerplate_elements = Add<HConstant>(elements); 8632 HInstruction* boilerplate_elements = Add<HConstant>(elements);
8611 int elements_length = elements->length(); 8633 int elements_length = elements->length();
8612 Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); 8634 Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements);
8613 for (int i = 0; i < elements_length; i++) { 8635 for (int i = 0; i < elements_length; i++) {
8614 Handle<Object> value(fast_elements->get(i), isolate()); 8636 Handle<Object> value(fast_elements->get(i), isolate());
8615 HValue* key_constant = Add<HConstant>(i); 8637 HValue* key_constant = Add<HConstant>(i);
8616 if (value->IsJSObject()) { 8638 if (value->IsJSObject()) {
8639 AllocationSiteUsageScope site_scope(site_context, value);
8617 Handle<JSObject> value_object = Handle<JSObject>::cast(value); 8640 Handle<JSObject> value_object = Handle<JSObject>::cast(value);
8618 HInstruction* result = BuildFastLiteral(value_object); 8641 HInstruction* result =
8642 BuildFastLiteral(value_object, site_context);
8619 Add<HStoreKeyed>(object_elements, key_constant, result, kind); 8643 Add<HStoreKeyed>(object_elements, key_constant, result, kind);
8620 } else { 8644 } else {
8621 HInstruction* value_instruction = 8645 HInstruction* value_instruction =
8622 Add<HLoadKeyed>(boilerplate_elements, key_constant, 8646 Add<HLoadKeyed>(boilerplate_elements, key_constant,
8623 static_cast<HValue*>(NULL), kind, 8647 static_cast<HValue*>(NULL), kind,
8624 ALLOW_RETURN_HOLE); 8648 ALLOW_RETURN_HOLE);
8625 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind); 8649 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind);
8626 } 8650 }
8627 } 8651 }
8628 } 8652 }
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after
9880 if (ShouldProduceTraceOutput()) { 9904 if (ShouldProduceTraceOutput()) {
9881 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 9905 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
9882 } 9906 }
9883 9907
9884 #ifdef DEBUG 9908 #ifdef DEBUG
9885 graph_->Verify(false); // No full verify. 9909 graph_->Verify(false); // No full verify.
9886 #endif 9910 #endif
9887 } 9911 }
9888 9912
9889 } } // namespace v8::internal 9913 } } // namespace v8::internal
OLDNEW
« src/allocation-site-scopes.cc ('K') | « src/hydrogen.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698