From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Georg Neis Date: Mon, 7 Jun 2021 10:41:38 +0200 Subject: Squashed multiple commits. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merged: Disable left-trimming when optimizing compile jobs exist Revision: ac0605a1a486b8d074f116cc365de9d2b6d7c9e5 Merged: [heap] Don't assume that optimizing-compile-dispatcher exists Revision: 022b312d55e75935cfa99cca7729ae2d3f795bd0 BUG=chromium:1211215,chromium:1215514 NOTRY=true NOPRESUBMIT=true NOTREECHECKS=true (cherry picked from commit 8704c7c0b2f79cbe745f293b30d68f4505da7416) Change-Id: I3b3a37d64402ea464c8e653517928522a1c5e0da Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2940899 Reviewed-by: Dominik Inführ Commit-Queue: Georg Neis Cr-Original-Commit-Position: refs/branch-heads/9.1@{#67} Cr-Original-Branched-From: 0e4ac64a8cf298b14034a22f9fe7b085d2cb238d-refs/heads/9.1.269@{#1} Cr-Original-Branched-From: f565e72d5ba88daae35a59d0f978643e2343e912-refs/heads/master@{#73847} Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2948656 Reviewed-by: Artem Sumaneev Commit-Queue: Victor-Gabriel Savu Cr-Commit-Position: refs/branch-heads/9.0@{#61} Cr-Branched-From: bd0108b4c88e0d6f2350cb79b5f363fbd02f3eb7-refs/heads/9.0.257@{#1} Cr-Branched-From: 349bcc6a075411f1a7ce2d866c3dfeefc2efa39d-refs/heads/master@{#73001} diff --git a/src/compiler-dispatcher/optimizing-compile-dispatcher.cc b/src/compiler-dispatcher/optimizing-compile-dispatcher.cc index d00b9b524bf2514eef92653f725764d625a43f6f..67d73367ad9373416fc7efa194430465c12106ea 100644 --- a/src/compiler-dispatcher/optimizing-compile-dispatcher.cc +++ b/src/compiler-dispatcher/optimizing-compile-dispatcher.cc @@ -50,7 +50,6 @@ class OptimizingCompileDispatcher::CompileTask : public CancelableTask { worker_thread_runtime_call_stats_( isolate->counters()->worker_thread_runtime_call_stats()), dispatcher_(dispatcher) { - base::MutexGuard lock_guard(&dispatcher_->ref_count_mutex_); ++dispatcher_->ref_count_; } @@ -98,12 +97,7 @@ class OptimizingCompileDispatcher::CompileTask : public CancelableTask { }; OptimizingCompileDispatcher::~OptimizingCompileDispatcher() { -#ifdef DEBUG - { - base::MutexGuard lock_guard(&ref_count_mutex_); - DCHECK_EQ(0, ref_count_); - } -#endif + DCHECK_EQ(0, ref_count_); DCHECK_EQ(0, input_queue_length_); DeleteArray(input_queue_); } @@ -234,6 +228,14 @@ void OptimizingCompileDispatcher::InstallOptimizedFunctions() { } } +bool OptimizingCompileDispatcher::HasJobs() { + DCHECK_EQ(ThreadId::Current(), isolate_->thread_id()); + // Note: This relies on {output_queue_} being mutated by a background thread + // only when {ref_count_} is not zero. Also, {ref_count_} is never incremented + // by a background thread. + return !(ref_count_ == 0 && output_queue_.empty()); +} + void OptimizingCompileDispatcher::QueueForOptimization( OptimizedCompilationJob* job) { DCHECK(IsQueueAvailable()); diff --git a/src/compiler-dispatcher/optimizing-compile-dispatcher.h b/src/compiler-dispatcher/optimizing-compile-dispatcher.h index 36f285d163101a82e2090d075f69f0f8da82f414..7d7a5bebb74ea4b9fb49cb3c82c9bae1821335a0 100644 --- a/src/compiler-dispatcher/optimizing-compile-dispatcher.h +++ b/src/compiler-dispatcher/optimizing-compile-dispatcher.h @@ -53,6 +53,9 @@ class V8_EXPORT_PRIVATE OptimizingCompileDispatcher { static bool Enabled() { return FLAG_concurrent_recompilation; } + // This method must be called on the main thread. + bool HasJobs(); + private: class CompileTask; @@ -90,7 +93,7 @@ class V8_EXPORT_PRIVATE OptimizingCompileDispatcher { int blocked_jobs_; - int ref_count_; + std::atomic ref_count_; base::Mutex ref_count_mutex_; base::ConditionVariable ref_count_zero_; diff --git a/src/heap/heap.cc b/src/heap/heap.cc index eb0231b719e7a0325500d3f2074e1e9782e7c4a4..3f4348b063995eb5c23ddd8af2aa2ac900a88723 100644 --- a/src/heap/heap.cc +++ b/src/heap/heap.cc @@ -22,6 +22,7 @@ #include "src/codegen/compilation-cache.h" #include "src/common/assert-scope.h" #include "src/common/globals.h" +#include "src/compiler-dispatcher/optimizing-compile-dispatcher.h" #include "src/debug/debug.h" #include "src/deoptimizer/deoptimizer.h" #include "src/execution/isolate-utils-inl.h" @@ -3014,6 +3015,12 @@ bool Heap::CanMoveObjectStart(HeapObject object) { if (IsLargeObject(object)) return false; + // Compilation jobs may have references to the object. + if (isolate()->concurrent_recompilation_enabled() && + isolate()->optimizing_compile_dispatcher()->HasJobs()) { + return false; + } + // We can move the object start if the page was already swept. return Page::FromHeapObject(object)->SweepingDone(); } diff --git a/test/mjsunit/compiler/regress-1215514.js b/test/mjsunit/compiler/regress-1215514.js new file mode 100644 index 0000000000000000000000000000000000000000..a597b310498458fd7219c33ff188ca2a6e543f45 --- /dev/null +++ b/test/mjsunit/compiler/regress-1215514.js @@ -0,0 +1,7 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --no-concurrent-recompilation + +new Array(4242).shift();