| Index: src/heap/heap.cc | 
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc | 
| index 1c1b58593e72674b5f3158eeb6ab4da51d559a44..d4ec27747338a497f78f476cb9a9c89ebd44c730 100644 | 
| --- a/src/heap/heap.cc | 
| +++ b/src/heap/heap.cc | 
| @@ -80,9 +80,6 @@ Heap::Heap() | 
| max_semi_space_size_(8 * (kPointerSize / 4) * MB), | 
| initial_semispace_size_(MB), | 
| max_old_generation_size_(700ul * (kPointerSize / 4) * MB), | 
| -      initial_old_generation_size_(max_old_generation_size_ / | 
| -                                   kInitalOldGenerationLimitFactor), | 
| -      old_generation_size_configured_(false), | 
| max_executable_size_(256ul * (kPointerSize / 4) * MB), | 
| // Variables set based on semispace_size_ and old_generation_size_ in | 
| // ConfigureHeap. | 
| @@ -111,7 +108,7 @@ Heap::Heap() | 
| #ifdef DEBUG | 
| allocation_timeout_(0), | 
| #endif  // DEBUG | 
| -      old_generation_allocation_limit_(initial_old_generation_size_), | 
| +      old_generation_allocation_limit_(0), | 
| inline_allocation_disabled_(false), | 
| total_regexp_code_generated_(0), | 
| tracer_(nullptr), | 
| @@ -1049,7 +1046,6 @@ bool Heap::CollectGarbage(GarbageCollector collector, | 
| int Heap::NotifyContextDisposed(bool dependant_context) { | 
| if (!dependant_context) { | 
| tracer()->ResetSurvivalEvents(); | 
| -    old_generation_size_configured_ = false; | 
| MemoryReducer::Event event; | 
| event.type = MemoryReducer::kPossibleGarbage; | 
| event.time_ms = MonotonicallyIncreasingTimeInMs(); | 
| @@ -1313,7 +1309,6 @@ bool Heap::PerformGarbageCollection( | 
| UpdateOldGenerationAllocationCounter(); | 
| // Perform mark-sweep with optional compaction. | 
| MarkCompact(); | 
| -        old_generation_size_configured_ = true; | 
| // This should be updated before PostGarbageCollectionProcessing, which | 
| // can cause another GC. Take into account the objects promoted during | 
| // GC. | 
| @@ -1333,7 +1328,6 @@ bool Heap::PerformGarbageCollection( | 
| } | 
|  | 
| UpdateSurvivalStatistics(start_new_space_size); | 
| -  ConfigureInitialOldGenerationSize(); | 
|  | 
| isolate_->counters()->objs_since_last_young()->Set(0); | 
|  | 
| @@ -1361,8 +1355,7 @@ bool Heap::PerformGarbageCollection( | 
| external_memory_at_last_mark_compact_ = external_memory_; | 
| external_memory_limit_ = external_memory_ + kExternalAllocationSoftLimit; | 
| SetOldGenerationAllocationLimit(old_gen_size, gc_speed, mutator_speed); | 
| -  } else if (HasLowYoungGenerationAllocationRate() && | 
| -             old_generation_size_configured_) { | 
| +  } else if (HasLowYoungGenerationAllocationRate()) { | 
| DampenOldGenerationAllocationLimit(old_gen_size, gc_speed, mutator_speed); | 
| } | 
|  | 
| @@ -1992,17 +1985,6 @@ void Heap::UnregisterArrayBuffer(JSArrayBuffer* buffer) { | 
| } | 
|  | 
|  | 
| -void Heap::ConfigureInitialOldGenerationSize() { | 
| -  if (!old_generation_size_configured_ && tracer()->SurvivalEventsRecorded()) { | 
| -    old_generation_allocation_limit_ = | 
| -        Max(MinimumAllocationLimitGrowingStep(), | 
| -            static_cast<size_t>( | 
| -                static_cast<double>(old_generation_allocation_limit_) * | 
| -                (tracer()->AverageSurvivalRatio() / 100))); | 
| -  } | 
| -} | 
| - | 
| - | 
| AllocationResult Heap::AllocatePartialMap(InstanceType instance_type, | 
| int instance_size) { | 
| Object* result = nullptr; | 
| @@ -4257,7 +4239,8 @@ bool Heap::PerformIdleTimeAction(GCIdleTimeAction action, | 
| incremental_marking()->AdvanceIncrementalMarking( | 
| deadline_in_ms, IncrementalMarking::NO_GC_VIA_STACK_GUARD, | 
| IncrementalMarking::FORCE_COMPLETION, StepOrigin::kTask); | 
| -      if (remaining_idle_time_in_ms > 0.0) { | 
| +      if (remaining_idle_time_in_ms > 0.0 && | 
| +          incremental_marking()->IsMarking()) { | 
| TryFinalizeIdleIncrementalMarking( | 
| remaining_idle_time_in_ms, | 
| GarbageCollectionReason::kFinalizeMarkingViaTask); | 
| @@ -5049,14 +5032,6 @@ bool Heap::ConfigureHeap(size_t max_semi_space_size, size_t max_old_space_size, | 
| max_executable_size_ = max_old_generation_size_; | 
| } | 
|  | 
| -  if (FLAG_initial_old_space_size > 0) { | 
| -    initial_old_generation_size_ = FLAG_initial_old_space_size * MB; | 
| -  } else { | 
| -    initial_old_generation_size_ = | 
| -        max_old_generation_size_ / kInitalOldGenerationLimitFactor; | 
| -  } | 
| -  old_generation_allocation_limit_ = initial_old_generation_size_; | 
| - | 
| // We rely on being able to allocate new arrays in paged spaces. | 
| DCHECK(kMaxRegularHeapObjectSize >= | 
| (JSArray::kSize + | 
| @@ -5294,6 +5269,25 @@ void Heap::DampenOldGenerationAllocationLimit(size_t old_gen_size, | 
| } | 
| } | 
|  | 
| +size_t Heap::OldGenerationSpaceAvailable() { | 
| +  if (old_generation_allocation_limit_ == 0) { | 
| +    // Lazy initialization of allocation limit. | 
| +    old_generation_allocation_limit_ = CalculateOldGenerationAllocationLimit( | 
| +        kConservativeHeapGrowingFactor, PromotedSpaceSizeOfObjects()); | 
| +  } | 
| +  if (old_generation_allocation_limit_ <= PromotedTotalSize()) return 0; | 
| +  return old_generation_allocation_limit_ - | 
| +         static_cast<size_t>(PromotedTotalSize()); | 
| +} | 
| + | 
| +bool Heap::ShouldOptimizeForLoadTime() { | 
| +  return isolate()->rail_mode() == PERFORMANCE_LOAD && | 
| +         PromotedTotalSize() < | 
| +             max_old_generation_size_ / kInitalOldGenerationLimitFactor && | 
| +         MonotonicallyIncreasingTimeInMs() < | 
| +             isolate()->LoadStartTimeMs() + kMaxLoadTimeMs; | 
| +} | 
| + | 
| // This predicate is called when an old generation space cannot allocated from | 
| // the free list and is about to add a new page. Returning false will cause a | 
| // major GC. It happens when the old generation allocation limit is reached and | 
| @@ -5305,6 +5299,8 @@ bool Heap::ShouldExpandOldGenerationOnAllocationFailure() { | 
|  | 
| if (ShouldOptimizeForMemoryUsage()) return false; | 
|  | 
| +  if (ShouldOptimizeForLoadTime()) return true; | 
| + | 
| if (incremental_marking()->IsStopped() && | 
| IncrementalMarkingLimitReached() == IncrementalMarkingLimit::kNoLimit) { | 
| // We cannot start incremental marking. | 
| @@ -5335,6 +5331,9 @@ Heap::IncrementalMarkingLimit Heap::IncrementalMarkingLimitReached() { | 
| if (old_generation_space_available > new_space_->Capacity()) { | 
| return IncrementalMarkingLimit::kNoLimit; | 
| } | 
| + | 
| +  if (ShouldOptimizeForLoadTime()) return IncrementalMarkingLimit::kNoLimit; | 
| + | 
| // We are close to the allocation limit. | 
| // Choose between the hard and the soft limits. | 
| if (old_generation_space_available == 0 || ShouldOptimizeForMemoryUsage()) { | 
|  |