Chromium Code Reviews| Index: src/compiler.cc |
| diff --git a/src/compiler.cc b/src/compiler.cc |
| index d99f8d181b2e53d3407d0eb75ec005777718e749..742a4c50e19c74e420f8ede70b7eab82ae3a3d14 100644 |
| --- a/src/compiler.cc |
| +++ b/src/compiler.cc |
| @@ -939,6 +939,13 @@ MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { |
| return info.code(); |
| } |
| +bool ShouldOptimizeForAsm(Isolate* isolate, Handle<JSFunction> function) { |
| + // If the debugger is active, do not compile with turbofan unless we can |
| + // deopt from turbofan code. |
| + return FLAG_turbo_asm && function->shared()->asm_function() && |
| + (FLAG_turbo_asm_deoptimization || !isolate->debug()->is_active()); |
| +} |
| + |
| MaybeHandle<Code> GetLazyCode(Handle<JSFunction> function) { |
| Isolate* isolate = function->GetIsolate(); |
| DCHECK(!isolate->has_pending_exception()); |
| @@ -965,23 +972,53 @@ MaybeHandle<Code> GetLazyCode(Handle<JSFunction> function) { |
| return Handle<Code>(function->shared()->code()); |
| } |
| - Zone zone(isolate->allocator()); |
| - ParseInfo parse_info(&zone, function); |
| - CompilationInfo info(&parse_info, function); |
| - Handle<Code> result; |
| - ASSIGN_RETURN_ON_EXCEPTION(isolate, result, GetUnoptimizedCode(&info), Code); |
| - |
| - if (FLAG_always_opt) { |
| + if (FLAG_always_opt || ShouldOptimizeForAsm(isolate, function)) { |
| Handle<Code> opt_code; |
| if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT) |
| .ToHandle(&opt_code)) { |
| - result = opt_code; |
| + DCHECK(function->shared()->is_compiled()); |
| + return opt_code; |
| } |
| } |
| + Zone zone(isolate->allocator()); |
| + ParseInfo parse_info(&zone, function); |
| + CompilationInfo info(&parse_info, function); |
| + Handle<Code> result; |
| + ASSIGN_RETURN_ON_EXCEPTION(isolate, result, GetUnoptimizedCode(&info), Code); |
| + |
| return result; |
| } |
| +bool GetEagerCode(CompilationInfo* info) { |
|
rmcilroy
2016/05/20 10:04:16
I factored this code out of NewSharedFunctionInfoF
|
| + Isolate* isolate = info->isolate(); |
| + DCHECK(!isolate->has_pending_exception()); |
| + DCHECK(info->code().is_null()); |
| + DCHECK_NOT_NULL(info->literal()); |
| + DCHECK_NOT_NULL(info->scope()); |
| + TimerEventScope<TimerEventCompileCode> compile_timer(isolate); |
| + TRACE_EVENT0("v8", "V8.CompileCode"); |
| + |
| + if (!Renumber(info->parse_info()) || !GenerateUnoptimizedCode(info)) { |
| + return false; |
| + } |
| + |
| + // Code generation will ensure that the feedback vector is present and |
| + // appropriately sized. |
| + DCHECK(!info->code().is_null()); |
| + |
| + if (info->literal()->should_eager_compile() && |
| + info->literal()->should_be_used_once_hint()) { |
| + info->code()->MarkToBeExecutedOnce(isolate); |
| + } |
| + |
| + // Update the shared function info with the scope info. |
| + InstallSharedScopeInfo(info, info->shared_info()); |
| + // Install compilation result on the shared function info. |
| + InstallSharedCompilationResult(info, info->shared_info()); |
| + |
| + return true; |
| +} |
| Handle<SharedFunctionInfo> NewSharedFunctionInfoForLiteral( |
| Isolate* isolate, FunctionLiteral* literal, Handle<Script> script) { |
| @@ -1644,23 +1681,9 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfo( |
| !(FLAG_ignition && FLAG_ignition_eager && !isolate->serializer_enabled()); |
| // Generate code |
| - TimerEventScope<TimerEventCompileCode> timer(isolate); |
| - TRACE_EVENT0("v8", "V8.CompileCode"); |
| if (lazy) { |
| info.SetCode(isolate->builtins()->CompileLazy()); |
| - } else if (Renumber(info.parse_info()) && GenerateUnoptimizedCode(&info)) { |
| - // Code generation will ensure that the feedback vector is present and |
| - // appropriately sized. |
| - DCHECK(!info.code().is_null()); |
| - if (literal->should_eager_compile() && |
| - literal->should_be_used_once_hint()) { |
| - info.code()->MarkToBeExecutedOnce(isolate); |
| - } |
| - // Update the shared function info with the scope info. |
| - InstallSharedScopeInfo(&info, result); |
| - // Install compilation result on the shared function info. |
| - InstallSharedCompilationResult(&info, result); |
| - } else { |
| + } else if (!GetEagerCode(&info)) { |
| return Handle<SharedFunctionInfo>::null(); |
| } |
| @@ -1764,9 +1787,11 @@ void Compiler::FinalizeCompilationJob(CompilationJob* raw_job) { |
| void Compiler::PostInstantiation(Handle<JSFunction> function, |
| PretenureFlag pretenure) { |
| + Isolate* isolate = function->GetIsolate(); |
| Handle<SharedFunctionInfo> shared(function->shared()); |
| - if (FLAG_always_opt && shared->allows_lazy_compilation()) { |
| + if ((FLAG_always_opt || ShouldOptimizeForAsm(isolate, function)) && |
| + shared->allows_lazy_compilation()) { |
| function->MarkForOptimization(); |
| } |
| @@ -1782,7 +1807,6 @@ void Compiler::PostInstantiation(Handle<JSFunction> function, |
| if (cached.literals != nullptr) { |
| function->set_literals(cached.literals); |
| } else { |
| - Isolate* isolate = function->GetIsolate(); |
| int number_of_literals = shared->num_literals(); |
| Handle<LiteralsArray> literals = |
| LiteralsArray::New(isolate, handle(shared->feedback_vector()), |