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/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
(...skipping 3250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3261 store->SetFlag(HValue::kAllowUndefinedAsNaN); | 3261 store->SetFlag(HValue::kAllowUndefinedAsNaN); |
3262 } | 3262 } |
3263 | 3263 |
3264 builder.EndBody(); | 3264 builder.EndBody(); |
3265 } | 3265 } |
3266 | 3266 |
3267 Counters* counters = isolate()->counters(); | 3267 Counters* counters = isolate()->counters(); |
3268 AddIncrementCounter(counters->inlined_copied_elements()); | 3268 AddIncrementCounter(counters->inlined_copied_elements()); |
3269 } | 3269 } |
3270 | 3270 |
3271 | |
3272 HValue* HGraphBuilder::BuildCloneShallowArrayCow(HValue* boilerplate, | |
3273 HValue* allocation_site, | |
3274 AllocationSiteMode mode, | |
3275 ElementsKind kind) { | |
3276 HAllocate* array = AllocateJSArrayObject(mode); | |
3277 | |
3278 HValue* map = AddLoadMap(boilerplate); | |
3279 HValue* elements = AddLoadElements(boilerplate); | |
3280 HValue* length = AddLoadArrayLength(boilerplate, kind); | |
3281 | |
3282 BuildJSArrayHeader(array, | |
3283 map, | |
3284 elements, | |
3285 mode, | |
3286 FAST_ELEMENTS, | |
3287 allocation_site, | |
3288 length); | |
3289 return array; | |
3290 } | |
3291 | |
3292 | |
3293 HValue* HGraphBuilder::BuildCloneShallowArrayEmpty(HValue* boilerplate, | |
3294 HValue* allocation_site, | |
3295 AllocationSiteMode mode) { | |
3296 HAllocate* array = AllocateJSArrayObject(mode); | |
3297 | |
3298 HValue* map = AddLoadMap(boilerplate); | |
3299 | |
3300 BuildJSArrayHeader(array, | |
3301 map, | |
3302 NULL, // set elements to empty fixed array | |
3303 mode, | |
3304 FAST_ELEMENTS, | |
3305 allocation_site, | |
3306 graph()->GetConstant0()); | |
3307 return array; | |
3308 } | |
3309 | |
3310 | |
3311 HValue* HGraphBuilder::BuildCloneShallowArrayNonEmpty(HValue* boilerplate, | |
3312 HValue* allocation_site, | |
3313 AllocationSiteMode mode, | |
3314 ElementsKind kind) { | |
3315 HValue* boilerplate_elements = AddLoadElements(boilerplate); | |
3316 HValue* capacity = AddLoadFixedArrayLength(boilerplate_elements); | |
3317 | |
3318 // Generate size calculation code here in order to make it dominate | |
3319 // the JSArray allocation. | |
3320 HValue* elements_size = BuildCalculateElementsSize(kind, capacity); | |
3321 | |
3322 // Create empty JSArray object for now, store elimination should remove | |
3323 // redundant initialization of elements and length fields and at the same | |
3324 // time the object will be fully prepared for GC if it happens during | |
3325 // elements allocation. | |
3326 HValue* result = BuildCloneShallowArrayEmpty( | |
3327 boilerplate, allocation_site, mode); | |
3328 | |
3329 HAllocate* elements = BuildAllocateElements(kind, elements_size); | |
3330 | |
3331 Add<HStoreNamedField>(result, HObjectAccess::ForElementsPointer(), elements); | |
3332 | |
3333 // The allocation for the cloned array above causes register pressure on | |
3334 // machines with low register counts. Force a reload of the boilerplate | |
3335 // elements here to free up a register for the allocation to avoid unnecessary | |
3336 // spillage. | |
3337 boilerplate_elements = AddLoadElements(boilerplate); | |
3338 boilerplate_elements->SetFlag(HValue::kCantBeReplaced); | |
3339 | |
3340 // Copy the elements array header. | |
3341 for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) { | |
3342 HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i); | |
3343 Add<HStoreNamedField>( | |
3344 elements, access, | |
3345 Add<HLoadNamedField>(boilerplate_elements, nullptr, access)); | |
3346 } | |
3347 | |
3348 // And the result of the length | |
3349 HValue* length = AddLoadArrayLength(boilerplate, kind); | |
3350 Add<HStoreNamedField>(result, HObjectAccess::ForArrayLength(kind), length); | |
3351 | |
3352 BuildCopyElements(boilerplate_elements, kind, elements, | |
3353 kind, length, NULL); | |
3354 return result; | |
3355 } | |
3356 | |
3357 | |
3358 void HGraphBuilder::BuildCreateAllocationMemento( | 3271 void HGraphBuilder::BuildCreateAllocationMemento( |
3359 HValue* previous_object, | 3272 HValue* previous_object, |
3360 HValue* previous_object_size, | 3273 HValue* previous_object_size, |
3361 HValue* allocation_site) { | 3274 HValue* allocation_site) { |
3362 DCHECK(allocation_site != NULL); | 3275 DCHECK(allocation_site != NULL); |
3363 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>( | 3276 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>( |
3364 previous_object, previous_object_size, HType::HeapObject()); | 3277 previous_object, previous_object_size, HType::HeapObject()); |
3365 AddStoreMapConstant( | 3278 AddStoreMapConstant( |
3366 allocation_memento, isolate()->factory()->allocation_memento_map()); | 3279 allocation_memento, isolate()->factory()->allocation_memento_map()); |
3367 Add<HStoreNamedField>( | 3280 Add<HStoreNamedField>( |
(...skipping 10017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13385 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13298 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13386 } | 13299 } |
13387 | 13300 |
13388 #ifdef DEBUG | 13301 #ifdef DEBUG |
13389 graph_->Verify(false); // No full verify. | 13302 graph_->Verify(false); // No full verify. |
13390 #endif | 13303 #endif |
13391 } | 13304 } |
13392 | 13305 |
13393 } // namespace internal | 13306 } // namespace internal |
13394 } // namespace v8 | 13307 } // namespace v8 |
OLD | NEW |