Index: src/crankshaft/hydrogen-instructions.cc |
diff --git a/src/crankshaft/hydrogen-instructions.cc b/src/crankshaft/hydrogen-instructions.cc |
index 3d48d8fb71862d1e486ac6f0cc68911a8759f8a0..7fa653b368efe2afa2b05d3ab2c45d57223a58a2 100644 |
--- a/src/crankshaft/hydrogen-instructions.cc |
+++ b/src/crankshaft/hydrogen-instructions.cc |
@@ -3253,103 +3253,33 @@ bool HAllocate::HandleSideEffectDominator(GVNFlag side_effect, |
} |
} |
- bool keep_heap_iterable = FLAG_log_gc || FLAG_heap_stats; |
-#ifdef VERIFY_HEAP |
- keep_heap_iterable = keep_heap_iterable || FLAG_verify_heap; |
-#endif |
- |
- if (keep_heap_iterable) { |
- dominator_allocate->MakePrefillWithFiller(); |
- } else { |
- // TODO(hpayer): This is a short-term hack to make allocation mementos |
- // work again in new space. |
- dominator_allocate->ClearNextMapWord(original_object_size); |
+ if (!dominator_allocate->IsAllocationFoldingDominator()) { |
+ HAllocate* first_alloc = HAllocate::New( |
+ isolate, zone, dominator_allocate->context(), dominator_size, |
+ dominator_allocate->type(), |
+ IsNewSpaceAllocation() ? NOT_TENURED : TENURED, JS_OBJECT_TYPE); |
+ first_alloc->MakeAllocationFoldingDominated(); |
+ first_alloc->InsertAfter(dominator_allocate); |
+ dominator_allocate->ReplaceAllUsesWith(first_alloc); |
+ dominator_allocate->MakeAllocationFoldingDominator(); |
+ if (FLAG_trace_allocation_folding) { |
+ PrintF("#%d (%s) inserted for dominator #%d (%s)\n", first_alloc->id(), |
+ first_alloc->Mnemonic(), dominator_allocate->id(), |
+ dominator_allocate->Mnemonic()); |
+ } |
} |
- dominator_allocate->UpdateClearNextMapWord(MustClearNextMapWord()); |
- |
- // After that replace the dominated allocate instruction. |
- HInstruction* inner_offset = HConstant::CreateAndInsertBefore( |
- isolate, zone, context(), dominator_size_constant, Representation::None(), |
- this); |
+ MakeAllocationFoldingDominated(); |
- HInstruction* dominated_allocate_instr = HInnerAllocatedObject::New( |
- isolate, zone, context(), dominator_allocate, inner_offset, type()); |
- dominated_allocate_instr->InsertBefore(this); |
- DeleteAndReplaceWith(dominated_allocate_instr); |
if (FLAG_trace_allocation_folding) { |
- PrintF("#%d (%s) folded into #%d (%s)\n", |
- id(), Mnemonic(), dominator_allocate->id(), |
- dominator_allocate->Mnemonic()); |
+ PrintF("#%d (%s) folded into #%d (%s), new dominator size: %d\n", id(), |
+ Mnemonic(), dominator_allocate->id(), dominator_allocate->Mnemonic(), |
+ new_dominator_size); |
} |
return true; |
} |
-void HAllocate::UpdateFreeSpaceFiller(int32_t free_space_size) { |
- DCHECK(filler_free_space_size_ != NULL); |
- Zone* zone = block()->zone(); |
- // We must explicitly force Smi representation here because on x64 we |
- // would otherwise automatically choose int32, but the actual store |
- // requires a Smi-tagged value. |
- HConstant* new_free_space_size = HConstant::CreateAndInsertBefore( |
- block()->isolate(), zone, context(), |
- filler_free_space_size_->value()->GetInteger32Constant() + |
- free_space_size, |
- Representation::Smi(), filler_free_space_size_); |
- filler_free_space_size_->UpdateValue(new_free_space_size); |
-} |
- |
- |
-void HAllocate::CreateFreeSpaceFiller(int32_t free_space_size) { |
- DCHECK(filler_free_space_size_ == NULL); |
- Isolate* isolate = block()->isolate(); |
- Zone* zone = block()->zone(); |
- HInstruction* free_space_instr = |
- HInnerAllocatedObject::New(isolate, zone, context(), dominating_allocate_, |
- dominating_allocate_->size(), type()); |
- free_space_instr->InsertBefore(this); |
- HConstant* filler_map = HConstant::CreateAndInsertAfter( |
- zone, Unique<Map>::CreateImmovable(isolate->factory()->free_space_map()), |
- true, free_space_instr); |
- HInstruction* store_map = |
- HStoreNamedField::New(isolate, zone, context(), free_space_instr, |
- HObjectAccess::ForMap(), filler_map); |
- store_map->SetFlag(HValue::kHasNoObservableSideEffects); |
- store_map->InsertAfter(filler_map); |
- |
- // We must explicitly force Smi representation here because on x64 we |
- // would otherwise automatically choose int32, but the actual store |
- // requires a Smi-tagged value. |
- HConstant* filler_size = |
- HConstant::CreateAndInsertAfter(isolate, zone, context(), free_space_size, |
- Representation::Smi(), store_map); |
- // Must force Smi representation for x64 (see comment above). |
- HObjectAccess access = HObjectAccess::ForMapAndOffset( |
- isolate->factory()->free_space_map(), FreeSpace::kSizeOffset, |
- Representation::Smi()); |
- HStoreNamedField* store_size = HStoreNamedField::New( |
- isolate, zone, context(), free_space_instr, access, filler_size); |
- store_size->SetFlag(HValue::kHasNoObservableSideEffects); |
- store_size->InsertAfter(filler_size); |
- filler_free_space_size_ = store_size; |
-} |
- |
- |
-void HAllocate::ClearNextMapWord(int offset) { |
- if (MustClearNextMapWord()) { |
- Zone* zone = block()->zone(); |
- HObjectAccess access = |
- HObjectAccess::ForObservableJSObjectOffset(offset); |
- HStoreNamedField* clear_next_map = |
- HStoreNamedField::New(block()->isolate(), zone, context(), this, access, |
- block()->graph()->GetConstant0()); |
- clear_next_map->ClearAllSideEffects(); |
- clear_next_map->InsertAfter(this); |
- } |
-} |
- |
- |
std::ostream& HAllocate::PrintDataTo(std::ostream& os) const { // NOLINT |
os << NameOf(size()) << " ("; |
if (IsNewSpaceAllocation()) os << "N"; |