c0a63243e9
Add a --maglev-inlining flag, and add some half-baked support for inlining functions when there is call feedback. When the flag is enabled and there is call feedback, we create a nested MaglevGraphBuilder for the current graph, and pause building the graph of the outer function. We manually set up its prologue to set up its frame with the arguments pass into the call, build the body with the nested graph builder. This inner builder knows that it is building an inlined function, and all Return bytecodes will instead emit a Jump to a single merge block at the end of the function, where execution of the outer function can resume. These inner function basic blocks are wired into the outer graph with new JumpToInline and JumpFromInline control nodes. The idea is that subsequent passes will know what the inline function is, and will use these to manage the function stack (particularly for codegen and especially deopts). Bug: v8:7700 Change-Id: I4e9b153f8cf4d06c56e7be6365e7a18b86a773c0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3585958 Commit-Queue: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Jakob Linke <jgruber@chromium.org> Cr-Commit-Position: refs/heads/main@{#80077}
24 lines
648 B
JavaScript
24 lines
648 B
JavaScript
// Copyright 2022 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 --maglev --maglev-inlining --no-stress-opt
|
|
|
|
function inner(o) {
|
|
"use strict"
|
|
return 10 + o.x + 100;
|
|
}
|
|
|
|
function foo(o) {
|
|
return 1000 + inner(o) + 10000;
|
|
}
|
|
|
|
%PrepareFunctionForOptimization(inner);
|
|
%PrepareFunctionForOptimization(foo);
|
|
assertEquals(11111, foo({x:1}));
|
|
assertEquals(11111, foo({x:1}));
|
|
|
|
%OptimizeMaglevOnNextCall(foo);
|
|
// The inlined inner function will deopt -- this deopt should succeed.
|
|
assertEquals(11111, foo({y:2,x:1}));
|