8b87e36e43
Some tests want to invalidate part of the VM state after an optimization has consumed the old state but before the code is installed. The existing mechanism for this is --block-concurrent-recompilation and %UnblockConcurrentRecompilation(). The former suspends optimization right after PrepareJob, before the background ExecuteJob phase. The intrinsic can then be used to unblock it again. This was good enough so far because the main "consume" work used to happen on the main thread. With concurrent inlining this is no longer true and we need something else. This CL introduces three intrinsics: %DisableOptimizationFinalization turns off automatic finalization of background optimizations. %FinalizeOptimization() can then be called at an appropriate time to manually finalize (and thus install) the code and reenable automatic finalization. In case one wants to perform some action on the main thread after the concurrent optimization has finished but before it is finalized, one can do so with the help of %WaitForBackgroundOptimization() (see tests). In a followup CL I'm removing the old mechanism since it now seems redundant. Bug: v8:12041, v8:7790 Change-Id: Ib7195789105922eb7e4bff86dc5bc11e96a4f97b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3071400 Commit-Queue: Georg Neis <neis@chromium.org> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Cr-Commit-Position: refs/heads/master@{#76190}
28 lines
683 B
JavaScript
28 lines
683 B
JavaScript
// Copyright 2018 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: --allow-natives-syntax --noalways-opt
|
|
|
|
global = 1;
|
|
|
|
function boom(value) {
|
|
return global;
|
|
}
|
|
|
|
%PrepareFunctionForOptimization(boom);
|
|
assertEquals(1, boom());
|
|
assertEquals(1, boom());
|
|
%DisableOptimizationFinalization();
|
|
%OptimizeFunctionOnNextCall(boom, "concurrent");
|
|
assertEquals(1, boom());
|
|
|
|
%WaitForBackgroundOptimization();
|
|
delete this.global;
|
|
%FinalizeOptimization();
|
|
|
|
// boom should be deoptimized because the global property cell has changed.
|
|
assertUnoptimized(boom, "sync");
|
|
|
|
assertThrows(boom);
|