97c89ebbe2
We used to have two special cases for named accesses on the global proxy, one based on seeing the global proxy constant in the graph and on based on seeing the global proxy map either in the feedback or in the graph. A change I made a while ago accidentally disabled the second one. This CL restores that. Moreover, given how things are set up now (this might have been different before), the first optimization is subsumed by the second one, so this CL also removes the first one. Finally, this CL records an accumulator hint in the case of a load, which improves precision of the serializer for concurrent inlining. Tbr: tebbi@chromium.org Bug: v8:7790 Change-Id: I255afc6c79e5c5c900b3ccfcd8459d836d21e42b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1801954 Commit-Queue: Georg Neis <neis@chromium.org> Reviewed-by: Michael Stanton <mvstanton@chromium.org> Cr-Commit-Position: refs/heads/master@{#63806}
27 lines
893 B
JavaScript
27 lines
893 B
JavaScript
// Copyright 2019 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
|
|
|
|
// This test ensures that we manage to serialize the global.gaga function for
|
|
// compilation and therefore are able to inline it. Since the call feedback in
|
|
// bar is megamorphic, this relies on recording the correct accumulator hint for
|
|
// the named load of obj.gaga while serializing bar (in turn while serializing
|
|
// foo).
|
|
|
|
const global = this;
|
|
global.gaga = function gaga() { return true; };
|
|
|
|
function bar(obj) { return obj.gaga(); };
|
|
function foo() { return %TurbofanStaticAssert(bar(global)); }
|
|
|
|
%PrepareFunctionForOptimization(foo);
|
|
%PrepareFunctionForOptimization(bar);
|
|
%PrepareFunctionForOptimization(global.gaga);
|
|
|
|
bar({gaga() {}});
|
|
foo();
|
|
%OptimizeFunctionOnNextCall(foo);
|
|
foo();
|