OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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-instructions.h" | 5 #include "src/crankshaft/hydrogen-instructions.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/base/safe_math.h" | 8 #include "src/base/safe_math.h" |
9 #include "src/crankshaft/hydrogen-infer-representation.h" | 9 #include "src/crankshaft/hydrogen-infer-representation.h" |
10 #include "src/double.h" | 10 #include "src/double.h" |
(...skipping 3235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3246 } | 3246 } |
3247 | 3247 |
3248 dominator_allocate->UpdateSize(new_dominator_size_value); | 3248 dominator_allocate->UpdateSize(new_dominator_size_value); |
3249 | 3249 |
3250 if (MustAllocateDoubleAligned()) { | 3250 if (MustAllocateDoubleAligned()) { |
3251 if (!dominator_allocate->MustAllocateDoubleAligned()) { | 3251 if (!dominator_allocate->MustAllocateDoubleAligned()) { |
3252 dominator_allocate->MakeDoubleAligned(); | 3252 dominator_allocate->MakeDoubleAligned(); |
3253 } | 3253 } |
3254 } | 3254 } |
3255 | 3255 |
3256 bool keep_heap_iterable = FLAG_log_gc || FLAG_heap_stats; | 3256 if (!dominator_allocate->IsAllocationFoldingDominator()) { |
3257 #ifdef VERIFY_HEAP | 3257 HAllocate* first_alloc = HAllocate::New( |
3258 keep_heap_iterable = keep_heap_iterable || FLAG_verify_heap; | 3258 isolate, zone, dominator_allocate->context(), dominator_size, |
3259 #endif | 3259 dominator_allocate->type(), |
3260 | 3260 IsNewSpaceAllocation() ? NOT_TENURED : TENURED, JS_OBJECT_TYPE); |
3261 if (keep_heap_iterable) { | 3261 first_alloc->MakeAllocationFoldingDominated(); |
3262 dominator_allocate->MakePrefillWithFiller(); | 3262 first_alloc->InsertAfter(dominator_allocate); |
3263 } else { | 3263 dominator_allocate->ReplaceAllUsesWith(first_alloc); |
3264 // TODO(hpayer): This is a short-term hack to make allocation mementos | 3264 dominator_allocate->MakeAllocationFoldingDominator(); |
3265 // work again in new space. | 3265 if (FLAG_trace_allocation_folding) { |
3266 dominator_allocate->ClearNextMapWord(original_object_size); | 3266 PrintF("#%d (%s) inserted for dominator #%d (%s)\n", first_alloc->id(), |
| 3267 first_alloc->Mnemonic(), dominator_allocate->id(), |
| 3268 dominator_allocate->Mnemonic()); |
| 3269 } |
3267 } | 3270 } |
3268 | 3271 |
3269 dominator_allocate->UpdateClearNextMapWord(MustClearNextMapWord()); | 3272 MakeAllocationFoldingDominated(); |
3270 | 3273 |
3271 // After that replace the dominated allocate instruction. | |
3272 HInstruction* inner_offset = HConstant::CreateAndInsertBefore( | |
3273 isolate, zone, context(), dominator_size_constant, Representation::None(), | |
3274 this); | |
3275 | |
3276 HInstruction* dominated_allocate_instr = HInnerAllocatedObject::New( | |
3277 isolate, zone, context(), dominator_allocate, inner_offset, type()); | |
3278 dominated_allocate_instr->InsertBefore(this); | |
3279 DeleteAndReplaceWith(dominated_allocate_instr); | |
3280 if (FLAG_trace_allocation_folding) { | 3274 if (FLAG_trace_allocation_folding) { |
3281 PrintF("#%d (%s) folded into #%d (%s)\n", | 3275 PrintF("#%d (%s) folded into #%d (%s), new dominator size: %d\n", id(), |
3282 id(), Mnemonic(), dominator_allocate->id(), | 3276 Mnemonic(), dominator_allocate->id(), dominator_allocate->Mnemonic(), |
3283 dominator_allocate->Mnemonic()); | 3277 new_dominator_size); |
3284 } | 3278 } |
3285 return true; | 3279 return true; |
3286 } | 3280 } |
3287 | 3281 |
3288 | 3282 |
3289 void HAllocate::UpdateFreeSpaceFiller(int32_t free_space_size) { | |
3290 DCHECK(filler_free_space_size_ != NULL); | |
3291 Zone* zone = block()->zone(); | |
3292 // We must explicitly force Smi representation here because on x64 we | |
3293 // would otherwise automatically choose int32, but the actual store | |
3294 // requires a Smi-tagged value. | |
3295 HConstant* new_free_space_size = HConstant::CreateAndInsertBefore( | |
3296 block()->isolate(), zone, context(), | |
3297 filler_free_space_size_->value()->GetInteger32Constant() + | |
3298 free_space_size, | |
3299 Representation::Smi(), filler_free_space_size_); | |
3300 filler_free_space_size_->UpdateValue(new_free_space_size); | |
3301 } | |
3302 | |
3303 | |
3304 void HAllocate::CreateFreeSpaceFiller(int32_t free_space_size) { | |
3305 DCHECK(filler_free_space_size_ == NULL); | |
3306 Isolate* isolate = block()->isolate(); | |
3307 Zone* zone = block()->zone(); | |
3308 HInstruction* free_space_instr = | |
3309 HInnerAllocatedObject::New(isolate, zone, context(), dominating_allocate_, | |
3310 dominating_allocate_->size(), type()); | |
3311 free_space_instr->InsertBefore(this); | |
3312 HConstant* filler_map = HConstant::CreateAndInsertAfter( | |
3313 zone, Unique<Map>::CreateImmovable(isolate->factory()->free_space_map()), | |
3314 true, free_space_instr); | |
3315 HInstruction* store_map = | |
3316 HStoreNamedField::New(isolate, zone, context(), free_space_instr, | |
3317 HObjectAccess::ForMap(), filler_map); | |
3318 store_map->SetFlag(HValue::kHasNoObservableSideEffects); | |
3319 store_map->InsertAfter(filler_map); | |
3320 | |
3321 // We must explicitly force Smi representation here because on x64 we | |
3322 // would otherwise automatically choose int32, but the actual store | |
3323 // requires a Smi-tagged value. | |
3324 HConstant* filler_size = | |
3325 HConstant::CreateAndInsertAfter(isolate, zone, context(), free_space_size, | |
3326 Representation::Smi(), store_map); | |
3327 // Must force Smi representation for x64 (see comment above). | |
3328 HObjectAccess access = HObjectAccess::ForMapAndOffset( | |
3329 isolate->factory()->free_space_map(), FreeSpace::kSizeOffset, | |
3330 Representation::Smi()); | |
3331 HStoreNamedField* store_size = HStoreNamedField::New( | |
3332 isolate, zone, context(), free_space_instr, access, filler_size); | |
3333 store_size->SetFlag(HValue::kHasNoObservableSideEffects); | |
3334 store_size->InsertAfter(filler_size); | |
3335 filler_free_space_size_ = store_size; | |
3336 } | |
3337 | |
3338 | |
3339 void HAllocate::ClearNextMapWord(int offset) { | |
3340 if (MustClearNextMapWord()) { | |
3341 Zone* zone = block()->zone(); | |
3342 HObjectAccess access = | |
3343 HObjectAccess::ForObservableJSObjectOffset(offset); | |
3344 HStoreNamedField* clear_next_map = | |
3345 HStoreNamedField::New(block()->isolate(), zone, context(), this, access, | |
3346 block()->graph()->GetConstant0()); | |
3347 clear_next_map->ClearAllSideEffects(); | |
3348 clear_next_map->InsertAfter(this); | |
3349 } | |
3350 } | |
3351 | |
3352 | |
3353 std::ostream& HAllocate::PrintDataTo(std::ostream& os) const { // NOLINT | 3283 std::ostream& HAllocate::PrintDataTo(std::ostream& os) const { // NOLINT |
3354 os << NameOf(size()) << " ("; | 3284 os << NameOf(size()) << " ("; |
3355 if (IsNewSpaceAllocation()) os << "N"; | 3285 if (IsNewSpaceAllocation()) os << "N"; |
3356 if (IsOldSpaceAllocation()) os << "P"; | 3286 if (IsOldSpaceAllocation()) os << "P"; |
3357 if (MustAllocateDoubleAligned()) os << "A"; | 3287 if (MustAllocateDoubleAligned()) os << "A"; |
3358 if (MustPrefillWithFiller()) os << "F"; | 3288 if (MustPrefillWithFiller()) os << "F"; |
3359 return os << ")"; | 3289 return os << ")"; |
3360 } | 3290 } |
3361 | 3291 |
3362 | 3292 |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4129 case HObjectAccess::kExternalMemory: | 4059 case HObjectAccess::kExternalMemory: |
4130 os << "[external-memory]"; | 4060 os << "[external-memory]"; |
4131 break; | 4061 break; |
4132 } | 4062 } |
4133 | 4063 |
4134 return os << "@" << access.offset(); | 4064 return os << "@" << access.offset(); |
4135 } | 4065 } |
4136 | 4066 |
4137 } // namespace internal | 4067 } // namespace internal |
4138 } // namespace v8 | 4068 } // namespace v8 |
OLD | NEW |