Commit b52aecac authored by mstarzinger's avatar mstarzinger Committed by Commit bot

[compiler] Make Compiler::EnsureBytecode not switch tiers.

This preserves the original shared code of the underlying function when
bytecode is provided. The method in question should only ensure bytecode
is present, but should avoid switching compilation tiers of the given
function. It might be that the function was fast-tracked to baseline by
inlining without going through the interpreted tier first.

R=rmcilroy@chromium.org
TEST=mjsunit/regress/regress-crbug-635923
BUG=chromium:635923

Review-Url: https://codereview.chromium.org/2278543002
Cr-Commit-Position: refs/heads/master@{#38866}
parent 8547b072
......@@ -1392,8 +1392,15 @@ MaybeHandle<JSArray> Compiler::CompileForLiveEdit(Handle<Script> script) {
bool Compiler::EnsureBytecode(CompilationInfo* info) {
DCHECK(ShouldUseIgnition(info));
if (!info->shared_info()->HasBytecodeArray()) {
DCHECK(!info->shared_info()->is_compiled());
Handle<Code> original_code(info->shared_info()->code());
if (GetUnoptimizedCode(info).is_null()) return false;
DCHECK(info->shared_info()->is_compiled());
if (original_code->kind() == Code::FUNCTION) {
// Generating bytecode will install the {InterpreterEntryTrampoline} as
// shared code on the function. To avoid an implicit tier down we restore
// original baseline code in case it existed beforehand.
info->shared_info()->ReplaceCode(*original_code);
}
}
DCHECK(info->shared_info()->HasBytecodeArray());
return true;
......
// Copyright 2016 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 --ignition --turbo-from-bytecode --turbo-filter=f
function f(x) { return x + 23 }
function g(x) { return f(x) + 42 }
assertEquals(23, f(0));
assertEquals(24, f(1));
assertEquals(67, g(2));
assertEquals(68, g(3));
// Optimize {g} with Crankshaft, causing {f} to be inlined.
%OptimizeFunctionOnNextCall(g);
assertEquals(65, g(0));
// Optimize {f} with Turbofan, after it has been inlined.
%OptimizeFunctionOnNextCall(f);
assertEquals(23, f(0));
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment