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 "hydrogen.h" | 5 #include "hydrogen.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "v8.h" | 9 #include "v8.h" |
10 #include "allocation-site-scopes.h" | 10 #include "allocation-site-scopes.h" |
(...skipping 2275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2286 } | 2286 } |
2287 | 2287 |
2288 HConstant* elements_size_value = Add<HConstant>(elements_size); | 2288 HConstant* elements_size_value = Add<HConstant>(elements_size); |
2289 HValue* mul = AddUncasted<HMul>(capacity, elements_size_value); | 2289 HValue* mul = AddUncasted<HMul>(capacity, elements_size_value); |
2290 mul->ClearFlag(HValue::kCanOverflow); | 2290 mul->ClearFlag(HValue::kCanOverflow); |
2291 | 2291 |
2292 HConstant* header_size = Add<HConstant>(FixedArray::kHeaderSize); | 2292 HConstant* header_size = Add<HConstant>(FixedArray::kHeaderSize); |
2293 HValue* total_size = AddUncasted<HAdd>(mul, header_size); | 2293 HValue* total_size = AddUncasted<HAdd>(mul, header_size); |
2294 total_size->ClearFlag(HValue::kCanOverflow); | 2294 total_size->ClearFlag(HValue::kCanOverflow); |
2295 | 2295 |
2296 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ? | 2296 return Add<HAllocate>(total_size, HType::NonPrimitive(), NOT_TENURED, |
2297 isolate()->heap()->GetPretenureMode() : NOT_TENURED; | 2297 instance_type); |
2298 | |
2299 return Add<HAllocate>(total_size, HType::NonPrimitive(), | |
2300 pretenure_flag, instance_type); | |
2301 } | 2298 } |
2302 | 2299 |
2303 | 2300 |
2304 void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements, | 2301 void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements, |
2305 ElementsKind kind, | 2302 ElementsKind kind, |
2306 HValue* capacity) { | 2303 HValue* capacity) { |
2307 Factory* factory = isolate()->factory(); | 2304 Factory* factory = isolate()->factory(); |
2308 Handle<Map> map = IsFastDoubleElementsKind(kind) | 2305 Handle<Map> map = IsFastDoubleElementsKind(kind) |
2309 ? factory->fixed_double_array_map() | 2306 ? factory->fixed_double_array_map() |
2310 : factory->fixed_array_map(); | 2307 : factory->fixed_array_map(); |
(...skipping 3164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5475 | 5472 |
5476 HStoreNamedField *instr; | 5473 HStoreNamedField *instr; |
5477 if (field_access.representation().IsDouble()) { | 5474 if (field_access.representation().IsDouble()) { |
5478 HObjectAccess heap_number_access = | 5475 HObjectAccess heap_number_access = |
5479 field_access.WithRepresentation(Representation::Tagged()); | 5476 field_access.WithRepresentation(Representation::Tagged()); |
5480 if (transition_to_field) { | 5477 if (transition_to_field) { |
5481 // The store requires a mutable HeapNumber to be allocated. | 5478 // The store requires a mutable HeapNumber to be allocated. |
5482 NoObservableSideEffectsScope no_side_effects(this); | 5479 NoObservableSideEffectsScope no_side_effects(this); |
5483 HInstruction* heap_number_size = Add<HConstant>(HeapNumber::kSize); | 5480 HInstruction* heap_number_size = Add<HConstant>(HeapNumber::kSize); |
5484 | 5481 |
5485 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ? | 5482 // TODO(hpayer): Allocation site pretenuring support. |
5486 isolate()->heap()->GetPretenureMode() : NOT_TENURED; | |
5487 | |
5488 HInstruction* heap_number = Add<HAllocate>(heap_number_size, | 5483 HInstruction* heap_number = Add<HAllocate>(heap_number_size, |
5489 HType::HeapNumber(), | 5484 HType::HeapNumber(), |
5490 pretenure_flag, | 5485 NOT_TENURED, |
5491 HEAP_NUMBER_TYPE); | 5486 HEAP_NUMBER_TYPE); |
5492 AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map()); | 5487 AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map()); |
5493 Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(), | 5488 Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(), |
5494 value); | 5489 value); |
5495 instr = New<HStoreNamedField>(checked_object->ActualValue(), | 5490 instr = New<HStoreNamedField>(checked_object->ActualValue(), |
5496 heap_number_access, | 5491 heap_number_access, |
5497 heap_number); | 5492 heap_number); |
5498 } else { | 5493 } else { |
5499 // Already holds a HeapNumber; load the box and write its value field. | 5494 // Already holds a HeapNumber; load the box and write its value field. |
5500 HInstruction* heap_number = Add<HLoadNamedField>( | 5495 HInstruction* heap_number = Add<HLoadNamedField>( |
(...skipping 3068 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8569 HAllocationMode allocation_mode; | 8564 HAllocationMode allocation_mode; |
8570 if (FLAG_pretenuring_call_new) { | 8565 if (FLAG_pretenuring_call_new) { |
8571 if (FLAG_allocation_site_pretenuring) { | 8566 if (FLAG_allocation_site_pretenuring) { |
8572 // Try to use pretenuring feedback. | 8567 // Try to use pretenuring feedback. |
8573 Handle<AllocationSite> allocation_site = expr->allocation_site(); | 8568 Handle<AllocationSite> allocation_site = expr->allocation_site(); |
8574 allocation_mode = HAllocationMode(allocation_site); | 8569 allocation_mode = HAllocationMode(allocation_site); |
8575 // Take a dependency on allocation site. | 8570 // Take a dependency on allocation site. |
8576 AllocationSite::AddDependentCompilationInfo(allocation_site, | 8571 AllocationSite::AddDependentCompilationInfo(allocation_site, |
8577 AllocationSite::TENURING, | 8572 AllocationSite::TENURING, |
8578 top_info()); | 8573 top_info()); |
8579 } else { | |
8580 allocation_mode = HAllocationMode( | |
8581 isolate()->heap()->GetPretenureMode()); | |
8582 } | 8574 } |
8583 } | 8575 } |
8584 | 8576 |
8585 HAllocate* receiver = BuildAllocate( | 8577 HAllocate* receiver = BuildAllocate( |
8586 size_in_bytes, HType::JSObject(), JS_OBJECT_TYPE, allocation_mode); | 8578 size_in_bytes, HType::JSObject(), JS_OBJECT_TYPE, allocation_mode); |
8587 receiver->set_known_initial_map(initial_map); | 8579 receiver->set_known_initial_map(initial_map); |
8588 | 8580 |
8589 // Initialize map and fields of the newly allocated object. | 8581 // Initialize map and fields of the newly allocated object. |
8590 { NoObservableSideEffectsScope no_effects(this); | 8582 { NoObservableSideEffectsScope no_effects(this); |
8591 ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE); | 8583 ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE); |
(...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9515 BinaryOperation* expr, | 9507 BinaryOperation* expr, |
9516 HValue* left, | 9508 HValue* left, |
9517 HValue* right, | 9509 HValue* right, |
9518 PushBeforeSimulateBehavior push_sim_result) { | 9510 PushBeforeSimulateBehavior push_sim_result) { |
9519 Type* left_type = expr->left()->bounds().lower; | 9511 Type* left_type = expr->left()->bounds().lower; |
9520 Type* right_type = expr->right()->bounds().lower; | 9512 Type* right_type = expr->right()->bounds().lower; |
9521 Type* result_type = expr->bounds().lower; | 9513 Type* result_type = expr->bounds().lower; |
9522 Maybe<int> fixed_right_arg = expr->fixed_right_arg(); | 9514 Maybe<int> fixed_right_arg = expr->fixed_right_arg(); |
9523 Handle<AllocationSite> allocation_site = expr->allocation_site(); | 9515 Handle<AllocationSite> allocation_site = expr->allocation_site(); |
9524 | 9516 |
9525 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ? | 9517 HAllocationMode allocation_mode; |
9526 isolate()->heap()->GetPretenureMode() : NOT_TENURED; | 9518 if (FLAG_allocation_site_pretenuring && !allocation_site.is_null()) { |
9527 | 9519 allocation_mode = HAllocationMode(allocation_site); |
9528 HAllocationMode allocation_mode = | 9520 } |
9529 FLAG_allocation_site_pretenuring | |
9530 ? (allocation_site.is_null() | |
9531 ? HAllocationMode(NOT_TENURED) | |
9532 : HAllocationMode(allocation_site)) | |
9533 : HAllocationMode(pretenure_flag); | |
9534 | 9521 |
9535 HValue* result = HGraphBuilder::BuildBinaryOperation( | 9522 HValue* result = HGraphBuilder::BuildBinaryOperation( |
9536 expr->op(), left, right, left_type, right_type, result_type, | 9523 expr->op(), left, right, left_type, right_type, result_type, |
9537 fixed_right_arg, allocation_mode); | 9524 fixed_right_arg, allocation_mode); |
9538 // Add a simulate after instructions with observable side effects, and | 9525 // Add a simulate after instructions with observable side effects, and |
9539 // after phis, which are the result of BuildBinaryOperation when we | 9526 // after phis, which are the result of BuildBinaryOperation when we |
9540 // inlined some complex subgraph. | 9527 // inlined some complex subgraph. |
9541 if (result->HasObservableSideEffects() || result->IsPhi()) { | 9528 if (result->HasObservableSideEffects() || result->IsPhi()) { |
9542 if (push_sim_result == PUSH_BEFORE_SIMULATE) { | 9529 if (push_sim_result == PUSH_BEFORE_SIMULATE) { |
9543 Push(result); | 9530 Push(result); |
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10230 AllocationSiteUsageContext* site_context) { | 10217 AllocationSiteUsageContext* site_context) { |
10231 NoObservableSideEffectsScope no_effects(this); | 10218 NoObservableSideEffectsScope no_effects(this); |
10232 InstanceType instance_type = boilerplate_object->map()->instance_type(); | 10219 InstanceType instance_type = boilerplate_object->map()->instance_type(); |
10233 ASSERT(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE); | 10220 ASSERT(instance_type == JS_ARRAY_TYPE || instance_type == JS_OBJECT_TYPE); |
10234 | 10221 |
10235 HType type = instance_type == JS_ARRAY_TYPE | 10222 HType type = instance_type == JS_ARRAY_TYPE |
10236 ? HType::JSArray() : HType::JSObject(); | 10223 ? HType::JSArray() : HType::JSObject(); |
10237 HValue* object_size_constant = Add<HConstant>( | 10224 HValue* object_size_constant = Add<HConstant>( |
10238 boilerplate_object->map()->instance_size()); | 10225 boilerplate_object->map()->instance_size()); |
10239 | 10226 |
10240 PretenureFlag pretenure_flag = isolate()->heap()->GetPretenureMode(); | 10227 PretenureFlag pretenure_flag = NOT_TENURED; |
10241 if (FLAG_allocation_site_pretenuring) { | 10228 if (FLAG_allocation_site_pretenuring) { |
10242 pretenure_flag = site_context->current()->GetPretenureMode(); | 10229 pretenure_flag = site_context->current()->GetPretenureMode(); |
10243 Handle<AllocationSite> site(site_context->current()); | 10230 Handle<AllocationSite> site(site_context->current()); |
10244 AllocationSite::AddDependentCompilationInfo( | 10231 AllocationSite::AddDependentCompilationInfo( |
10245 site, AllocationSite::TENURING, top_info()); | 10232 site, AllocationSite::TENURING, top_info()); |
10246 } | 10233 } |
10247 | 10234 |
10248 HInstruction* object = Add<HAllocate>(object_size_constant, type, | 10235 HInstruction* object = Add<HAllocate>(object_size_constant, type, |
10249 pretenure_flag, instance_type, site_context->current()); | 10236 pretenure_flag, instance_type, site_context->current()); |
10250 | 10237 |
(...skipping 1545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11796 if (ShouldProduceTraceOutput()) { | 11783 if (ShouldProduceTraceOutput()) { |
11797 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 11784 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
11798 } | 11785 } |
11799 | 11786 |
11800 #ifdef DEBUG | 11787 #ifdef DEBUG |
11801 graph_->Verify(false); // No full verify. | 11788 graph_->Verify(false); // No full verify. |
11802 #endif | 11789 #endif |
11803 } | 11790 } |
11804 | 11791 |
11805 } } // namespace v8::internal | 11792 } } // namespace v8::internal |
OLD | NEW |