1277bb5c55
Until this CL, the JSHeapBroker::GetPropertyAccessInfo (GPAI) process was as follows: 1. GPAI is called on the main thread (MT) during the serialization phase to create and cache PAIs. 2. GPAI is called again from the background thread (BT); only cached PAIs from step 1 are usable. As part of concurrent inlining, the goal is to move GPAI fully to the background thread. This CL takes a major step in that direction by making GPAI itself callable from the BT without resorting solely to PAIs that were previously cached on the MT. There are two main reasons why GPAI previously had to run on the MT: a) Concurrent access to Maps and other heap objects. b) Serialization and creation of ObjectRefs for objects discovered during GPAI. This CL addresses only reason a) and leaves b) for future work. This is done by keeping the two-pass approach, s.t. the initial call of GPAI on the MT discovers and serializes objects. We then clear all cached PAIs. The second call of GPAI on the BT thus runs full logic in a concurrent setting. Once all relevant objects (= maps and prototypes) no longer require MT-serialization, reason b) is also addressed and the first pass can be removed. The new logic is implemented behind the runtime flag --turbo-concurrent-get-property-access-info (default true), intended to be removed in the future. Bug: v8:7790 Change-Id: Idbdbfe091d7316529246a686bb6d71c2a0f06f8b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2817793 Commit-Queue: Jakob Gruber <jgruber@chromium.org> Auto-Submit: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Igor Sheludko <ishell@chromium.org> Reviewed-by: Georg Neis <neis@chromium.org> Cr-Commit-Position: refs/heads/master@{#74120}
76 lines
3.1 KiB
JavaScript
76 lines
3.1 KiB
JavaScript
// Copyright 2013 the V8 project authors. All rights reserved.
|
|
// Redistribution and use in source and binary forms, with or without
|
|
// modification, are permitted provided that the following conditions are
|
|
// met:
|
|
//
|
|
// * Redistributions of source code must retain the above copyright
|
|
// notice, this list of conditions and the following disclaimer.
|
|
// * Redistributions in binary form must reproduce the above
|
|
// copyright notice, this list of conditions and the following
|
|
// disclaimer in the documentation and/or other materials provided
|
|
// with the distribution.
|
|
// * Neither the name of Google Inc. nor the names of its
|
|
// contributors may be used to endorse or promote products derived
|
|
// from this software without specific prior written permission.
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
// Flags: --track-fields --track-double-fields --allow-natives-syntax
|
|
// Flags: --concurrent-recompilation --block-concurrent-recompilation
|
|
// Flags: --no-always-opt --no-turbo-concurrent-get-property-access-info
|
|
|
|
if (!%IsConcurrentRecompilationSupported()) {
|
|
print("Concurrent recompilation is disabled. Skipping this test.");
|
|
quit();
|
|
}
|
|
|
|
function new_object() {
|
|
var o = {};
|
|
o.a = 1;
|
|
o.b = 2;
|
|
return o;
|
|
}
|
|
|
|
function add_field(obj) {
|
|
// Assign twice to make the field non-constant.
|
|
obj.c = 0;
|
|
obj.c = 3;
|
|
}
|
|
%PrepareFunctionForOptimization(add_field);
|
|
var obj1 = new_object();
|
|
var obj2 = new_object();
|
|
add_field(obj1);
|
|
add_field(obj2);
|
|
%OptimizeFunctionOnNextCall(add_field, "concurrent");
|
|
|
|
var o = new_object();
|
|
// Kick off recompilation.
|
|
add_field(o);
|
|
// Invalidate transition map after compile graph has been created.
|
|
o.c = 2.2;
|
|
// In the mean time, concurrent recompiling is still blocked.
|
|
assertUnoptimized(add_field, "no sync");
|
|
// Let concurrent recompilation proceed.
|
|
%UnblockConcurrentRecompilation();
|
|
// Sync with background thread to conclude optimization that bailed out.
|
|
if (!%IsDictPropertyConstTrackingEnabled()) {
|
|
// TODO(v8:11457) Currently, we cannot inline property stores if there is a
|
|
// dictionary mode prototype on the prototype chain. Therefore, if
|
|
// v8_dict_property_const_tracking is enabled, the optimized code only
|
|
// contains a call to the IC handler and doesn't get invalidated when the
|
|
// transition map changes.
|
|
assertUnoptimized(add_field, "sync");
|
|
}
|
|
// Clear type info for stress runs.
|
|
%ClearFunctionFeedback(add_field);
|