Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 48a23f971164e8df882ec6cca8670b1e4ebcf9d8..5cd053d0aaeb2cf7fb9280e7a6bd9f5a1280521c 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -305,7 +305,7 @@ void EnsureFeedbackMetadata(CompilationInfo* info) { |
bool UseTurboFan(Handle<SharedFunctionInfo> shared) { |
bool optimization_disabled = shared->optimization_disabled(); |
- bool dont_crankshaft = shared->dont_crankshaft(); |
+ bool must_use_ignition_turbo = shared->must_use_ignition_turbo(); |
// Check the enabling conditions for Turbofan. |
// 1. "use asm" code. |
@@ -314,7 +314,7 @@ bool UseTurboFan(Handle<SharedFunctionInfo> shared) { |
// 2. Fallback for features unsupported by Crankshaft. |
bool is_unsupported_by_crankshaft_but_turbofanable = |
- dont_crankshaft && strcmp(FLAG_turbo_filter, "~~") == 0 && |
+ must_use_ignition_turbo && strcmp(FLAG_turbo_filter, "~~") == 0 && |
!optimization_disabled; |
// 3. Explicitly enabled by the command-line filter. |
@@ -326,42 +326,44 @@ bool UseTurboFan(Handle<SharedFunctionInfo> shared) { |
bool ShouldUseIgnition(CompilationInfo* info) { |
DCHECK(info->has_shared_info()); |
+ Handle<SharedFunctionInfo> shared = info->shared_info(); |
+ |
+ // Code which can't be supported by the old pipeline should use Ignition. |
+ if (shared->must_use_ignition_turbo()) return true; |
// Resumable functions are not supported by {FullCodeGenerator}, suspended |
// activations stored as {JSGeneratorObject} on the heap always assume the |
// underlying code to be based on the bytecode array. |
- // TODO(mstarzinger): Once we want to deprecate even more support from the |
- // {FullCodeGenerator}, we will compute an appropriate bit in {AstNumbering} |
- // and turn this predicate into a DCHECK instead. |
- if (IsResumableFunction(info->shared_info()->kind())) { |
- return true; |
- } |
+ DCHECK(!IsResumableFunction(shared->kind())); |
// Skip Ignition for asm.js functions. |
- if (info->shared_info()->asm_function()) { |
+ if (shared->asm_function()) return false; |
+ |
+ // Skip Ignition for asm wasm code. |
+ if (FLAG_validate_asm && shared->HasAsmWasmData()) { |
return false; |
} |
// When requesting debug code as a replacement for existing code, we provide |
// the same kind as the existing code (to prevent implicit tier-change). |
- if (info->is_debug() && info->shared_info()->is_compiled()) { |
- return !info->shared_info()->HasBaselineCode(); |
+ if (info->is_debug() && shared->is_compiled()) { |
+ return !shared->HasBaselineCode(); |
} |
// Code destined for TurboFan should be compiled with Ignition first. |
- if (UseTurboFan(info->shared_info())) return true; |
+ if (UseTurboFan(shared)) return true; |
// Only use Ignition for any other function if FLAG_ignition is true. |
if (!FLAG_ignition) return false; |
// Checks whether top level functions should be passed by the filter. |
- if (info->shared_info()->is_toplevel()) { |
+ if (shared->is_toplevel()) { |
Vector<const char> filter = CStrVector(FLAG_ignition_filter); |
return (filter.length() == 0) || (filter.length() == 1 && filter[0] == '*'); |
} |
// Finally respect the filter. |
- return info->shared_info()->PassesFilter(FLAG_ignition_filter); |
+ return shared->PassesFilter(FLAG_ignition_filter); |
} |
CompilationJob* GetUnoptimizedCompilationJob(CompilationInfo* info) { |
@@ -527,8 +529,8 @@ bool Renumber(ParseInfo* parse_info) { |
if (lit->dont_optimize_reason() != kNoReason) { |
shared_info->DisableOptimization(lit->dont_optimize_reason()); |
} |
- if (lit->flags() & AstProperties::kDontCrankshaft) { |
- shared_info->set_dont_crankshaft(true); |
+ if (lit->flags() & AstProperties::kMustUseIgnitionTurbo) { |
+ shared_info->set_must_use_ignition_turbo(true); |
} |
} |
return true; |
@@ -650,6 +652,7 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function, |
} |
// Reset profiler ticks, function is no longer considered hot. |
+ DCHECK(shared->is_compiled()); |
if (shared->HasBaselineCode()) { |
shared->code()->set_profiler_ticks(0); |
} else if (shared->HasBytecodeArray()) { |
@@ -689,10 +692,7 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function, |
// TurboFan can optimize directly from existing bytecode. |
if (use_turbofan && ShouldUseIgnition(info)) { |
if (info->is_osr() && !ignition_osr) return MaybeHandle<Code>(); |
- if (!Compiler::EnsureBytecode(info)) { |
- if (isolate->has_pending_exception()) isolate->clear_pending_exception(); |
- return MaybeHandle<Code>(); |
- } |
+ DCHECK(shared->HasBytecodeArray()); |
info->MarkAsOptimizeFromBytecode(); |
} |
@@ -822,13 +822,11 @@ MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { |
return MaybeHandle<Code>(); |
} |
- // TODO(4280): For now we do not switch generators or async functions to |
- // baseline code because there might be suspended activations stored in |
- // generator objects on the heap. We could eventually go directly to |
- // TurboFan in this case. |
- if (IsResumableFunction(function->shared()->kind())) { |
+ // Don't generate full-codegen code for functions it can't support. |
+ if (function->shared()->must_use_ignition_turbo()) { |
return MaybeHandle<Code>(); |
} |
+ DCHECK(!IsResumableFunction(function->shared()->kind())); |
if (FLAG_trace_opt) { |
OFStream os(stdout); |
@@ -1194,21 +1192,13 @@ MaybeHandle<JSArray> Compiler::CompileForLiveEdit(Handle<Script> script) { |
} |
bool Compiler::EnsureBytecode(CompilationInfo* info) { |
- if (!ShouldUseIgnition(info)) return false; |
- if (!info->shared_info()->HasBytecodeArray()) { |
- Handle<Code> original_code(info->shared_info()->code()); |
+ if (!info->shared_info()->is_compiled()) { |
if (GetUnoptimizedCode(info).is_null()) return false; |
if (info->shared_info()->HasAsmWasmData()) 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; |
+ DCHECK(info->shared_info()->is_compiled()); |
+ DCHECK_EQ(ShouldUseIgnition(info), info->shared_info()->HasBytecodeArray()); |
+ return info->shared_info()->HasBytecodeArray(); |
} |
// TODO(turbofan): In the future, unoptimized code with deopt support could |
@@ -1222,11 +1212,9 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { |
CompilationInfo unoptimized(info->parse_info(), info->closure()); |
unoptimized.EnableDeoptimizationSupport(); |
- // TODO(4280): For now we do not switch generators or async functions to |
- // baseline code because there might be suspended activations stored in |
- // generator objects on the heap. We could eventually go directly to |
- // TurboFan in this case. |
- if (IsResumableFunction(shared->kind())) return false; |
+ // Don't generate full-codegen code for functions it can't support. |
+ if (shared->must_use_ignition_turbo()) return false; |
+ DCHECK(!IsResumableFunction(shared->kind())); |
// When we call PrepareForSerializing below, we will change the shared |
// ParseInfo. Make sure to reset it. |
@@ -1240,6 +1228,14 @@ bool Compiler::EnsureDeoptimizationSupport(CompilationInfo* info) { |
unoptimized.PrepareForSerializing(); |
} |
EnsureFeedbackMetadata(&unoptimized); |
+ |
+ // Ensure we generate and install bytecode first if the function should use |
+ // Ignition to avoid implicit tier-down. |
+ if (!shared->is_compiled() && ShouldUseIgnition(info) && |
+ !GenerateUnoptimizedCode(info)) { |
+ return false; |
+ } |
+ |
if (!FullCodeGenerator::MakeCode(&unoptimized)) return false; |
info->parse_info()->set_will_serialize(old_will_serialize_value); |
@@ -1714,7 +1710,8 @@ void Compiler::PostInstantiation(Handle<JSFunction> function, |
PretenureFlag pretenure) { |
Handle<SharedFunctionInfo> shared(function->shared()); |
- if (FLAG_always_opt && shared->allows_lazy_compilation()) { |
+ if (FLAG_always_opt && shared->allows_lazy_compilation() && |
+ function->shared()->is_compiled()) { |
function->MarkForOptimization(); |
} |