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

Side by Side Diff: src/crankshaft/hydrogen.cc

Issue 2304573004: Port FastCloneShallowArrayStub to Turbofan (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: break live range of allocation_site so instruction selection uses nice addressing modes Created 4 years, 3 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
OLDNEW
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 3208 matching lines...) Expand 10 before | Expand all | Expand 10 after
3219 store->SetFlag(HValue::kAllowUndefinedAsNaN); 3219 store->SetFlag(HValue::kAllowUndefinedAsNaN);
3220 } 3220 }
3221 3221
3222 builder.EndBody(); 3222 builder.EndBody();
3223 } 3223 }
3224 3224
3225 Counters* counters = isolate()->counters(); 3225 Counters* counters = isolate()->counters();
3226 AddIncrementCounter(counters->inlined_copied_elements()); 3226 AddIncrementCounter(counters->inlined_copied_elements());
3227 } 3227 }
3228 3228
3229
3230 HValue* HGraphBuilder::BuildCloneShallowArrayCow(HValue* boilerplate,
3231 HValue* allocation_site,
3232 AllocationSiteMode mode,
3233 ElementsKind kind) {
3234 HAllocate* array = AllocateJSArrayObject(mode);
3235
3236 HValue* map = AddLoadMap(boilerplate);
3237 HValue* elements = AddLoadElements(boilerplate);
3238 HValue* length = AddLoadArrayLength(boilerplate, kind);
3239
3240 BuildJSArrayHeader(array,
3241 map,
3242 elements,
3243 mode,
3244 FAST_ELEMENTS,
3245 allocation_site,
3246 length);
3247 return array;
3248 }
3249
3250
3251 HValue* HGraphBuilder::BuildCloneShallowArrayEmpty(HValue* boilerplate,
3252 HValue* allocation_site,
3253 AllocationSiteMode mode) {
3254 HAllocate* array = AllocateJSArrayObject(mode);
3255
3256 HValue* map = AddLoadMap(boilerplate);
3257
3258 BuildJSArrayHeader(array,
3259 map,
3260 NULL, // set elements to empty fixed array
3261 mode,
3262 FAST_ELEMENTS,
3263 allocation_site,
3264 graph()->GetConstant0());
3265 return array;
3266 }
3267
3268
3269 HValue* HGraphBuilder::BuildCloneShallowArrayNonEmpty(HValue* boilerplate,
3270 HValue* allocation_site,
3271 AllocationSiteMode mode,
3272 ElementsKind kind) {
3273 HValue* boilerplate_elements = AddLoadElements(boilerplate);
3274 HValue* capacity = AddLoadFixedArrayLength(boilerplate_elements);
3275
3276 // Generate size calculation code here in order to make it dominate
3277 // the JSArray allocation.
3278 HValue* elements_size = BuildCalculateElementsSize(kind, capacity);
3279
3280 // Create empty JSArray object for now, store elimination should remove
3281 // redundant initialization of elements and length fields and at the same
3282 // time the object will be fully prepared for GC if it happens during
3283 // elements allocation.
3284 HValue* result = BuildCloneShallowArrayEmpty(
3285 boilerplate, allocation_site, mode);
3286
3287 HAllocate* elements = BuildAllocateElements(kind, elements_size);
3288
3289 Add<HStoreNamedField>(result, HObjectAccess::ForElementsPointer(), elements);
3290
3291 // The allocation for the cloned array above causes register pressure on
3292 // machines with low register counts. Force a reload of the boilerplate
3293 // elements here to free up a register for the allocation to avoid unnecessary
3294 // spillage.
3295 boilerplate_elements = AddLoadElements(boilerplate);
3296 boilerplate_elements->SetFlag(HValue::kCantBeReplaced);
3297
3298 // Copy the elements array header.
3299 for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) {
3300 HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i);
3301 Add<HStoreNamedField>(
3302 elements, access,
3303 Add<HLoadNamedField>(boilerplate_elements, nullptr, access));
3304 }
3305
3306 // And the result of the length
3307 HValue* length = AddLoadArrayLength(boilerplate, kind);
3308 Add<HStoreNamedField>(result, HObjectAccess::ForArrayLength(kind), length);
3309
3310 BuildCopyElements(boilerplate_elements, kind, elements,
3311 kind, length, NULL);
3312 return result;
3313 }
3314
3315
3316 void HGraphBuilder::BuildCreateAllocationMemento( 3229 void HGraphBuilder::BuildCreateAllocationMemento(
3317 HValue* previous_object, 3230 HValue* previous_object,
3318 HValue* previous_object_size, 3231 HValue* previous_object_size,
3319 HValue* allocation_site) { 3232 HValue* allocation_site) {
3320 DCHECK(allocation_site != NULL); 3233 DCHECK(allocation_site != NULL);
3321 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>( 3234 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>(
3322 previous_object, previous_object_size, HType::HeapObject()); 3235 previous_object, previous_object_size, HType::HeapObject());
3323 AddStoreMapConstant( 3236 AddStoreMapConstant(
3324 allocation_memento, isolate()->factory()->allocation_memento_map()); 3237 allocation_memento, isolate()->factory()->allocation_memento_map());
3325 Add<HStoreNamedField>( 3238 Add<HStoreNamedField>(
(...skipping 10017 matching lines...) Expand 10 before | Expand all | Expand 10 after
13343 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13256 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13344 } 13257 }
13345 13258
13346 #ifdef DEBUG 13259 #ifdef DEBUG
13347 graph_->Verify(false); // No full verify. 13260 graph_->Verify(false); // No full verify.
13348 #endif 13261 #endif
13349 } 13262 }
13350 13263
13351 } // namespace internal 13264 } // namespace internal
13352 } // namespace v8 13265 } // namespace v8
OLDNEW
« src/code-stubs.cc ('K') | « src/crankshaft/hydrogen.h ('k') | src/deoptimize-reason.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698