OLD | NEW |
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 2219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2230 | 2230 |
2231 HConstant* empty_fixed_array = | 2231 HConstant* empty_fixed_array = |
2232 Add<HConstant>(isolate()->factory()->empty_fixed_array()); | 2232 Add<HConstant>(isolate()->factory()->empty_fixed_array()); |
2233 | 2233 |
2234 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); | 2234 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); |
2235 Add<HStoreNamedField>(array, access, empty_fixed_array); | 2235 Add<HStoreNamedField>(array, access, empty_fixed_array); |
2236 Add<HStoreNamedField>(array, HObjectAccess::ForArrayLength(elements_kind), | 2236 Add<HStoreNamedField>(array, HObjectAccess::ForArrayLength(elements_kind), |
2237 length_field); | 2237 length_field); |
2238 | 2238 |
2239 if (mode == TRACK_ALLOCATION_SITE) { | 2239 if (mode == TRACK_ALLOCATION_SITE) { |
2240 BuildCreateAllocationMemento(array, | 2240 BuildCreateAllocationMemento( |
2241 JSArray::kSize, | 2241 array, Add<HConstant>(JSArray::kSize), allocation_site_payload); |
2242 allocation_site_payload); | |
2243 if (FLAG_allocation_site_pretenuring) { | |
2244 // TODO(mvstanton): move this code into BuildCreateAllocationMemento when | |
2245 // constructed arrays also pay attention to pretenuring. | |
2246 HObjectAccess access = | |
2247 HObjectAccess::ForAllocationSiteOffset( | |
2248 AllocationSite::kMementoCreateCountOffset); | |
2249 HValue* create_info = Add<HLoadNamedField>(allocation_site_payload, | |
2250 access); | |
2251 HInstruction* new_create_info = | |
2252 AddUncasted<HAdd>(create_info, graph()->GetConstant1()); | |
2253 new_create_info->ClearFlag(HValue::kCanOverflow); | |
2254 HStoreNamedField* store = Add<HStoreNamedField>(allocation_site_payload, | |
2255 access, new_create_info); | |
2256 // No write barrier needed to store a smi. | |
2257 store->SkipWriteBarrier(); | |
2258 } | |
2259 } | 2242 } |
2260 | 2243 |
2261 int elements_location = JSArray::kSize; | 2244 int elements_location = JSArray::kSize; |
2262 if (mode == TRACK_ALLOCATION_SITE) { | 2245 if (mode == TRACK_ALLOCATION_SITE) { |
2263 elements_location += AllocationMemento::kSize; | 2246 elements_location += AllocationMemento::kSize; |
2264 } | 2247 } |
2265 | 2248 |
2266 HValue* elements = Add<HInnerAllocatedObject>(array, elements_location); | 2249 HInnerAllocatedObject* elements = Add<HInnerAllocatedObject>( |
| 2250 array, Add<HConstant>(elements_location)); |
2267 Add<HStoreNamedField>(array, HObjectAccess::ForElementsPointer(), elements); | 2251 Add<HStoreNamedField>(array, HObjectAccess::ForElementsPointer(), elements); |
2268 return static_cast<HInnerAllocatedObject*>(elements); | 2252 return elements; |
2269 } | 2253 } |
2270 | 2254 |
2271 | 2255 |
2272 HInstruction* HGraphBuilder::AddElementAccess( | 2256 HInstruction* HGraphBuilder::AddElementAccess( |
2273 HValue* elements, | 2257 HValue* elements, |
2274 HValue* checked_key, | 2258 HValue* checked_key, |
2275 HValue* val, | 2259 HValue* val, |
2276 HValue* dependency, | 2260 HValue* dependency, |
2277 ElementsKind elements_kind, | 2261 ElementsKind elements_kind, |
2278 bool is_store, | 2262 bool is_store, |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2488 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { | 2472 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { |
2489 if ((i != JSArray::kElementsOffset) || (length == 0)) { | 2473 if ((i != JSArray::kElementsOffset) || (length == 0)) { |
2490 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); | 2474 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); |
2491 Add<HStoreNamedField>(object, access, | 2475 Add<HStoreNamedField>(object, access, |
2492 Add<HLoadNamedField>(boilerplate, access)); | 2476 Add<HLoadNamedField>(boilerplate, access)); |
2493 } | 2477 } |
2494 } | 2478 } |
2495 | 2479 |
2496 // Create an allocation site info if requested. | 2480 // Create an allocation site info if requested. |
2497 if (mode == TRACK_ALLOCATION_SITE) { | 2481 if (mode == TRACK_ALLOCATION_SITE) { |
2498 BuildCreateAllocationMemento(object, JSArray::kSize, allocation_site); | 2482 BuildCreateAllocationMemento( |
| 2483 object, Add<HConstant>(JSArray::kSize), allocation_site); |
2499 } | 2484 } |
2500 | 2485 |
2501 if (length > 0) { | 2486 if (length > 0) { |
2502 HValue* boilerplate_elements = AddLoadElements(boilerplate); | 2487 HValue* boilerplate_elements = AddLoadElements(boilerplate); |
2503 HValue* object_elements; | 2488 HValue* object_elements; |
2504 if (IsFastDoubleElementsKind(kind)) { | 2489 if (IsFastDoubleElementsKind(kind)) { |
2505 HValue* elems_size = Add<HConstant>(FixedDoubleArray::SizeFor(length)); | 2490 HValue* elems_size = Add<HConstant>(FixedDoubleArray::SizeFor(length)); |
2506 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), | 2491 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), |
2507 NOT_TENURED, FIXED_DOUBLE_ARRAY_TYPE); | 2492 NOT_TENURED, FIXED_DOUBLE_ARRAY_TYPE); |
2508 } else { | 2493 } else { |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2581 BuildCheckMap(value, type->Classes().Current()); | 2566 BuildCheckMap(value, type->Classes().Current()); |
2582 } else { | 2567 } else { |
2583 if_nil.Deopt("Too many undetectable types"); | 2568 if_nil.Deopt("Too many undetectable types"); |
2584 } | 2569 } |
2585 } | 2570 } |
2586 | 2571 |
2587 if_nil.CaptureContinuation(continuation); | 2572 if_nil.CaptureContinuation(continuation); |
2588 } | 2573 } |
2589 | 2574 |
2590 | 2575 |
2591 HValue* HGraphBuilder::BuildCreateAllocationMemento(HValue* previous_object, | 2576 void HGraphBuilder::BuildCreateAllocationMemento( |
2592 int previous_object_size, | 2577 HValue* previous_object, |
2593 HValue* alloc_site) { | 2578 HValue* previous_object_size, |
2594 ASSERT(alloc_site != NULL); | 2579 HValue* allocation_site) { |
2595 HInnerAllocatedObject* alloc_memento = Add<HInnerAllocatedObject>( | 2580 ASSERT(allocation_site != NULL); |
| 2581 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>( |
2596 previous_object, previous_object_size); | 2582 previous_object, previous_object_size); |
2597 Handle<Map> alloc_memento_map = | 2583 AddStoreMapConstant( |
2598 isolate()->factory()->allocation_memento_map(); | 2584 allocation_memento, isolate()->factory()->allocation_memento_map()); |
2599 AddStoreMapConstant(alloc_memento, alloc_memento_map); | 2585 Add<HStoreNamedField>( |
2600 HObjectAccess access = HObjectAccess::ForAllocationMementoSite(); | 2586 allocation_memento, |
2601 Add<HStoreNamedField>(alloc_memento, access, alloc_site); | 2587 HObjectAccess::ForAllocationMementoSite(), |
2602 return alloc_memento; | 2588 allocation_site); |
| 2589 if (FLAG_allocation_site_pretenuring) { |
| 2590 HValue* memento_create_count = Add<HLoadNamedField>( |
| 2591 allocation_site, HObjectAccess::ForAllocationSiteOffset( |
| 2592 AllocationSite::kMementoCreateCountOffset)); |
| 2593 memento_create_count = AddUncasted<HAdd>( |
| 2594 memento_create_count, graph()->GetConstant1()); |
| 2595 HStoreNamedField* store = Add<HStoreNamedField>( |
| 2596 allocation_site, HObjectAccess::ForAllocationSiteOffset( |
| 2597 AllocationSite::kMementoCreateCountOffset), memento_create_count); |
| 2598 // No write barrier needed to store a smi. |
| 2599 store->SkipWriteBarrier(); |
| 2600 } |
2603 } | 2601 } |
2604 | 2602 |
2605 | 2603 |
2606 HInstruction* HGraphBuilder::BuildGetNativeContext() { | 2604 HInstruction* HGraphBuilder::BuildGetNativeContext() { |
2607 // Get the global context, then the native context | 2605 // Get the global context, then the native context |
2608 HInstruction* global_object = Add<HGlobalObject>(); | 2606 HInstruction* global_object = Add<HGlobalObject>(); |
2609 HObjectAccess access = HObjectAccess::ForJSObjectOffset( | 2607 HObjectAccess access = HObjectAccess::ForJSObjectOffset( |
2610 GlobalObject::kNativeContextOffset); | 2608 GlobalObject::kNativeContextOffset); |
2611 return Add<HLoadNamedField>(global_object, access); | 2609 return Add<HLoadNamedField>(global_object, access); |
2612 } | 2610 } |
(...skipping 8195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10808 if (ShouldProduceTraceOutput()) { | 10806 if (ShouldProduceTraceOutput()) { |
10809 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 10807 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
10810 } | 10808 } |
10811 | 10809 |
10812 #ifdef DEBUG | 10810 #ifdef DEBUG |
10813 graph_->Verify(false); // No full verify. | 10811 graph_->Verify(false); // No full verify. |
10814 #endif | 10812 #endif |
10815 } | 10813 } |
10816 | 10814 |
10817 } } // namespace v8::internal | 10815 } } // namespace v8::internal |
OLD | NEW |