| OLD | NEW |
| 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/hydrogen.h" | 5 #include "src/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 11411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11422 NoObservableSideEffectsScope no_effects(this); | 11422 NoObservableSideEffectsScope no_effects(this); |
| 11423 Handle<Map> initial_map(boilerplate_object->map()); | 11423 Handle<Map> initial_map(boilerplate_object->map()); |
| 11424 InstanceType instance_type = initial_map->instance_type(); | 11424 InstanceType instance_type = initial_map->instance_type(); |
| 11425 DCHECK(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE); | 11425 DCHECK(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE); |
| 11426 | 11426 |
| 11427 HType type = instance_type == JS_ARRAY_TYPE | 11427 HType type = instance_type == JS_ARRAY_TYPE |
| 11428 ? HType::JSArray() : HType::JSObject(); | 11428 ? HType::JSArray() : HType::JSObject(); |
| 11429 HValue* object_size_constant = Add<HConstant>(initial_map->instance_size()); | 11429 HValue* object_size_constant = Add<HConstant>(initial_map->instance_size()); |
| 11430 | 11430 |
| 11431 PretenureFlag pretenure_flag = NOT_TENURED; | 11431 PretenureFlag pretenure_flag = NOT_TENURED; |
| 11432 Handle<AllocationSite> current_site(*site_context->current(), isolate()); | 11432 Handle<AllocationSite> top_site(*site_context->top(), isolate()); |
| 11433 if (FLAG_allocation_site_pretenuring) { | 11433 if (FLAG_allocation_site_pretenuring) { |
| 11434 pretenure_flag = current_site->GetPretenureMode(); | 11434 pretenure_flag = top_site->GetPretenureMode(); |
| 11435 top_info()->dependencies()->AssumeTenuringDecision(current_site); | |
| 11436 } | 11435 } |
| 11437 | 11436 |
| 11437 Handle<AllocationSite> current_site(*site_context->current(), isolate()); |
| 11438 if (*top_site == *current_site) { |
| 11439 // We install a dependency for pretenuring only on the outermost literal. |
| 11440 top_info()->dependencies()->AssumeTenuringDecision(top_site); |
| 11441 } |
| 11438 top_info()->dependencies()->AssumeTransitionStable(current_site); | 11442 top_info()->dependencies()->AssumeTransitionStable(current_site); |
| 11439 | 11443 |
| 11440 HInstruction* object = Add<HAllocate>( | 11444 HInstruction* object = Add<HAllocate>( |
| 11441 object_size_constant, type, pretenure_flag, instance_type, current_site); | 11445 object_size_constant, type, pretenure_flag, instance_type, top_site); |
| 11442 | 11446 |
| 11443 // If allocation folding reaches Page::kMaxRegularHeapObjectSize the | 11447 // If allocation folding reaches Page::kMaxRegularHeapObjectSize the |
| 11444 // elements array may not get folded into the object. Hence, we set the | 11448 // elements array may not get folded into the object. Hence, we set the |
| 11445 // elements pointer to empty fixed array and let store elimination remove | 11449 // elements pointer to empty fixed array and let store elimination remove |
| 11446 // this store in the folding case. | 11450 // this store in the folding case. |
| 11447 HConstant* empty_fixed_array = Add<HConstant>( | 11451 HConstant* empty_fixed_array = Add<HConstant>( |
| 11448 isolate()->factory()->empty_fixed_array()); | 11452 isolate()->factory()->empty_fixed_array()); |
| 11449 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), | 11453 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| 11450 empty_fixed_array); | 11454 empty_fixed_array); |
| 11451 | 11455 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 11471 isolate()->factory()->CopyAndTenureFixedCOWArray( | 11475 isolate()->factory()->CopyAndTenureFixedCOWArray( |
| 11472 Handle<FixedArray>::cast(elements))); | 11476 Handle<FixedArray>::cast(elements))); |
| 11473 boilerplate_object->set_elements(*elements); | 11477 boilerplate_object->set_elements(*elements); |
| 11474 } | 11478 } |
| 11475 | 11479 |
| 11476 HInstruction* object_elements = NULL; | 11480 HInstruction* object_elements = NULL; |
| 11477 if (elements_size > 0) { | 11481 if (elements_size > 0) { |
| 11478 HValue* object_elements_size = Add<HConstant>(elements_size); | 11482 HValue* object_elements_size = Add<HConstant>(elements_size); |
| 11479 InstanceType instance_type = boilerplate_object->HasFastDoubleElements() | 11483 InstanceType instance_type = boilerplate_object->HasFastDoubleElements() |
| 11480 ? FIXED_DOUBLE_ARRAY_TYPE : FIXED_ARRAY_TYPE; | 11484 ? FIXED_DOUBLE_ARRAY_TYPE : FIXED_ARRAY_TYPE; |
| 11481 object_elements = | 11485 object_elements = Add<HAllocate>(object_elements_size, HType::HeapObject(), |
| 11482 Add<HAllocate>(object_elements_size, HType::HeapObject(), | 11486 pretenure_flag, instance_type, top_site); |
| 11483 pretenure_flag, instance_type, current_site); | |
| 11484 BuildEmitElements(boilerplate_object, elements, object_elements, | 11487 BuildEmitElements(boilerplate_object, elements, object_elements, |
| 11485 site_context); | 11488 site_context); |
| 11486 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), | 11489 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| 11487 object_elements); | 11490 object_elements); |
| 11488 } else { | 11491 } else { |
| 11489 Handle<Object> elements_field = | 11492 Handle<Object> elements_field = |
| 11490 Handle<Object>(boilerplate_object->elements(), isolate()); | 11493 Handle<Object>(boilerplate_object->elements(), isolate()); |
| 11491 HInstruction* object_elements_cow = Add<HConstant>(elements_field); | 11494 HInstruction* object_elements_cow = Add<HConstant>(elements_field); |
| 11492 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), | 11495 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| 11493 object_elements_cow); | 11496 object_elements_cow); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11574 BuildFastLiteral(value_object, site_context); | 11577 BuildFastLiteral(value_object, site_context); |
| 11575 site_context->ExitScope(current_site, value_object); | 11578 site_context->ExitScope(current_site, value_object); |
| 11576 Add<HStoreNamedField>(object, access, result); | 11579 Add<HStoreNamedField>(object, access, result); |
| 11577 } else { | 11580 } else { |
| 11578 Representation representation = details.representation(); | 11581 Representation representation = details.representation(); |
| 11579 HInstruction* value_instruction; | 11582 HInstruction* value_instruction; |
| 11580 | 11583 |
| 11581 if (representation.IsDouble()) { | 11584 if (representation.IsDouble()) { |
| 11582 // Allocate a HeapNumber box and store the value into it. | 11585 // Allocate a HeapNumber box and store the value into it. |
| 11583 HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize); | 11586 HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize); |
| 11584 // This heap number alloc does not have a corresponding | |
| 11585 // AllocationSite. That is okay because | |
| 11586 // 1) it's a child object of another object with a valid allocation site | |
| 11587 // 2) we can just use the mode of the parent object for pretenuring | |
| 11588 HInstruction* double_box = | 11587 HInstruction* double_box = |
| 11589 Add<HAllocate>(heap_number_constant, HType::HeapObject(), | 11588 Add<HAllocate>(heap_number_constant, HType::HeapObject(), |
| 11590 pretenure_flag, MUTABLE_HEAP_NUMBER_TYPE); | 11589 pretenure_flag, MUTABLE_HEAP_NUMBER_TYPE); |
| 11591 AddStoreMapConstant(double_box, | 11590 AddStoreMapConstant(double_box, |
| 11592 isolate()->factory()->mutable_heap_number_map()); | 11591 isolate()->factory()->mutable_heap_number_map()); |
| 11593 // Unwrap the mutable heap number from the boilerplate. | 11592 // Unwrap the mutable heap number from the boilerplate. |
| 11594 HValue* double_value = | 11593 HValue* double_value = |
| 11595 Add<HConstant>(Handle<HeapNumber>::cast(value)->value()); | 11594 Add<HConstant>(Handle<HeapNumber>::cast(value)->value()); |
| 11596 Add<HStoreNamedField>( | 11595 Add<HStoreNamedField>( |
| 11597 double_box, HObjectAccess::ForHeapNumberValue(), double_value); | 11596 double_box, HObjectAccess::ForHeapNumberValue(), double_value); |
| (...skipping 1723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13321 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13320 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13322 } | 13321 } |
| 13323 | 13322 |
| 13324 #ifdef DEBUG | 13323 #ifdef DEBUG |
| 13325 graph_->Verify(false); // No full verify. | 13324 graph_->Verify(false); // No full verify. |
| 13326 #endif | 13325 #endif |
| 13327 } | 13326 } |
| 13328 | 13327 |
| 13329 } // namespace internal | 13328 } // namespace internal |
| 13330 } // namespace v8 | 13329 } // namespace v8 |
| OLD | NEW |