Index: src/compiler.cc |
diff --git a/src/compiler.cc b/src/compiler.cc |
index 685009ec53a5998024e28aced0014507079efd97..c605f66021babaa7d8624f5a5121b34a7060a59f 100644 |
--- a/src/compiler.cc |
+++ b/src/compiler.cc |
@@ -325,10 +325,6 @@ OptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() { |
DCHECK(info()->IsOptimizing()); |
DCHECK(!info()->IsCompilingForDebugging()); |
- // We should never arrive here if there is no code object on the |
- // shared function object. |
- DCHECK(info()->shared_info()->code()->kind() == Code::FUNCTION); |
- |
// We should never arrive here if optimization has been disabled on the |
// shared function info. |
DCHECK(!info()->shared_info()->optimization_disabled()); |
@@ -396,7 +392,8 @@ OptimizedCompileJob::Status OptimizedCompileJob::CreateGraph() { |
DCHECK(info()->shared_info()->has_deoptimization_support()); |
// Check the whitelist for TurboFan. |
- if (info()->closure()->PassesFilter(FLAG_turbo_filter)) { |
+ if ((FLAG_turbo_asm && info()->shared_info()->asm_function()) || |
+ info()->closure()->PassesFilter(FLAG_turbo_filter)) { |
compiler::Pipeline pipeline(info()); |
pipeline.GenerateCode(); |
if (!info()->code().is_null()) { |
@@ -704,6 +701,117 @@ MUST_USE_RESULT static MaybeHandle<Code> GetUnoptimizedCodeCommon( |
} |
+MUST_USE_RESULT static MaybeHandle<Code> GetCodeFromOptimizedCodeMap( |
+ Handle<JSFunction> function, BailoutId osr_ast_id) { |
+ if (FLAG_cache_optimized_code) { |
+ Handle<SharedFunctionInfo> shared(function->shared()); |
+ // Bound functions are not cached. |
+ if (shared->bound()) return MaybeHandle<Code>(); |
+ DisallowHeapAllocation no_gc; |
+ int index = shared->SearchOptimizedCodeMap( |
+ function->context()->native_context(), osr_ast_id); |
+ if (index > 0) { |
+ if (FLAG_trace_opt) { |
+ PrintF("[found optimized code for "); |
+ function->ShortPrint(); |
+ if (!osr_ast_id.IsNone()) { |
+ PrintF(" at OSR AST id %d", osr_ast_id.ToInt()); |
+ } |
+ PrintF("]\n"); |
+ } |
+ FixedArray* literals = shared->GetLiteralsFromOptimizedCodeMap(index); |
+ if (literals != NULL) function->set_literals(literals); |
+ return Handle<Code>(shared->GetCodeFromOptimizedCodeMap(index)); |
+ } |
+ } |
+ return MaybeHandle<Code>(); |
+} |
+ |
+ |
+static void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { |
+ Handle<Code> code = info->code(); |
+ if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. |
+ |
+ // Context specialization folds-in the context, so no sharing can occur. |
+ if (code->is_turbofanned() && info->is_context_specializing()) return; |
+ |
+ // Cache optimized code. |
+ if (FLAG_cache_optimized_code) { |
+ Handle<JSFunction> function = info->closure(); |
+ Handle<SharedFunctionInfo> shared(function->shared()); |
+ // Do not cache bound functions. |
+ if (shared->bound()) return; |
+ Handle<FixedArray> literals(function->literals()); |
+ Handle<Context> native_context(function->context()->native_context()); |
+ SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, |
+ literals, info->osr_ast_id()); |
+ } |
+} |
+ |
+ |
+static bool CompileOptimizedPrologue(CompilationInfo* info) { |
+ if (!Parser::Parse(info)) return false; |
+ if (!Rewriter::Rewrite(info)) return false; |
+ if (!Scope::Analyze(info)) return false; |
+ DCHECK(info->scope() != NULL); |
+ return true; |
+} |
+ |
+ |
+static bool GetOptimizedCodeNow(CompilationInfo* info) { |
+ if (!CompileOptimizedPrologue(info)) return false; |
+ |
+ TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); |
+ |
+ OptimizedCompileJob job(info); |
+ if (job.CreateGraph() != OptimizedCompileJob::SUCCEEDED) return false; |
+ if (job.OptimizeGraph() != OptimizedCompileJob::SUCCEEDED) return false; |
+ if (job.GenerateCode() != OptimizedCompileJob::SUCCEEDED) return false; |
+ |
+ // Success! |
+ DCHECK(!info->isolate()->has_pending_exception()); |
+ InsertCodeIntoOptimizedCodeMap(info); |
+ RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, |
+ info->shared_info()); |
+ return true; |
+} |
+ |
+ |
+static bool GetOptimizedCodeLater(CompilationInfo* info) { |
+ Isolate* isolate = info->isolate(); |
+ if (!isolate->optimizing_compiler_thread()->IsQueueAvailable()) { |
+ if (FLAG_trace_concurrent_recompilation) { |
+ PrintF(" ** Compilation queue full, will retry optimizing "); |
+ info->closure()->PrintName(); |
+ PrintF(" later.\n"); |
+ } |
+ return false; |
+ } |
+ |
+ CompilationHandleScope handle_scope(info); |
+ if (!CompileOptimizedPrologue(info)) return false; |
+ info->SaveHandles(); // Copy handles to the compilation handle scope. |
+ |
+ TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); |
+ |
+ OptimizedCompileJob* job = new (info->zone()) OptimizedCompileJob(info); |
+ OptimizedCompileJob::Status status = job->CreateGraph(); |
+ if (status != OptimizedCompileJob::SUCCEEDED) return false; |
+ isolate->optimizing_compiler_thread()->QueueForOptimization(job); |
+ |
+ if (FLAG_trace_concurrent_recompilation) { |
+ PrintF(" ** Queued "); |
+ info->closure()->PrintName(); |
+ if (info->is_osr()) { |
+ PrintF(" for concurrent OSR at %d.\n", info->osr_ast_id().ToInt()); |
+ } else { |
+ PrintF(" for concurrent optimization.\n"); |
+ } |
+ } |
+ return true; |
+} |
+ |
+ |
MaybeHandle<Code> Compiler::GetUnoptimizedCode(Handle<JSFunction> function) { |
DCHECK(!function->GetIsolate()->has_pending_exception()); |
DCHECK(!function->is_compiled()); |
@@ -730,29 +838,14 @@ MaybeHandle<Code> Compiler::GetLazyCode(Handle<JSFunction> function) { |
VMState<COMPILER> state(info.isolate()); |
PostponeInterruptsScope postpone(info.isolate()); |
- if (FLAG_trace_opt) { |
- // TODO(titzer): record and report full stats here. |
- PrintF("[optimizing asm "); |
- function->ShortPrint(); |
- PrintF("]\n"); |
- } |
- |
- if (!Parser::Parse(&info)) return MaybeHandle<Code>(); |
- if (!Rewriter::Rewrite(&info)) return MaybeHandle<Code>(); |
- if (!Scope::Analyze(&info)) return MaybeHandle<Code>(); |
- if (FLAG_turbo_deoptimization && !EnsureDeoptimizationSupport(&info)) { |
- return MaybeHandle<Code>(); |
- } |
- |
info.SetOptimizing(BailoutId::None(), |
Handle<Code>(function->shared()->code())); |
info.MarkAsContextSpecializing(); |
info.MarkAsTypingEnabled(); |
info.MarkAsInliningDisabled(); |
- compiler::Pipeline pipeline(&info); |
- pipeline.GenerateCode(); |
- if (!info.code().is_null()) return info.code(); |
+ |
+ if (GetOptimizedCodeNow(&info)) return info.code(); |
} |
if (function->shared()->is_compiled()) { |
@@ -1209,118 +1302,6 @@ Handle<SharedFunctionInfo> Compiler::BuildFunctionInfo( |
} |
-MUST_USE_RESULT static MaybeHandle<Code> GetCodeFromOptimizedCodeMap( |
- Handle<JSFunction> function, |
- BailoutId osr_ast_id) { |
- if (FLAG_cache_optimized_code) { |
- Handle<SharedFunctionInfo> shared(function->shared()); |
- // Bound functions are not cached. |
- if (shared->bound()) return MaybeHandle<Code>(); |
- DisallowHeapAllocation no_gc; |
- int index = shared->SearchOptimizedCodeMap( |
- function->context()->native_context(), osr_ast_id); |
- if (index > 0) { |
- if (FLAG_trace_opt) { |
- PrintF("[found optimized code for "); |
- function->ShortPrint(); |
- if (!osr_ast_id.IsNone()) { |
- PrintF(" at OSR AST id %d", osr_ast_id.ToInt()); |
- } |
- PrintF("]\n"); |
- } |
- FixedArray* literals = shared->GetLiteralsFromOptimizedCodeMap(index); |
- if (literals != NULL) function->set_literals(literals); |
- return Handle<Code>(shared->GetCodeFromOptimizedCodeMap(index)); |
- } |
- } |
- return MaybeHandle<Code>(); |
-} |
- |
- |
-static void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { |
- Handle<Code> code = info->code(); |
- if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. |
- |
- // Context specialization folds-in the context, so no sharing can occur. |
- if (code->is_turbofanned() && info->is_context_specializing()) return; |
- |
- // Cache optimized code. |
- if (FLAG_cache_optimized_code) { |
- Handle<JSFunction> function = info->closure(); |
- Handle<SharedFunctionInfo> shared(function->shared()); |
- // Do not cache bound functions. |
- if (shared->bound()) return; |
- Handle<FixedArray> literals(function->literals()); |
- Handle<Context> native_context(function->context()->native_context()); |
- SharedFunctionInfo::AddToOptimizedCodeMap( |
- shared, native_context, code, literals, info->osr_ast_id()); |
- } |
-} |
- |
- |
-static bool CompileOptimizedPrologue(CompilationInfo* info) { |
- if (!Parser::Parse(info)) return false; |
- if (!Rewriter::Rewrite(info)) return false; |
- if (!Scope::Analyze(info)) return false; |
- DCHECK(info->scope() != NULL); |
- return true; |
-} |
- |
- |
-static bool GetOptimizedCodeNow(CompilationInfo* info) { |
- if (!CompileOptimizedPrologue(info)) return false; |
- |
- TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); |
- |
- OptimizedCompileJob job(info); |
- if (job.CreateGraph() != OptimizedCompileJob::SUCCEEDED) return false; |
- if (job.OptimizeGraph() != OptimizedCompileJob::SUCCEEDED) return false; |
- if (job.GenerateCode() != OptimizedCompileJob::SUCCEEDED) return false; |
- |
- // Success! |
- DCHECK(!info->isolate()->has_pending_exception()); |
- InsertCodeIntoOptimizedCodeMap(info); |
- RecordFunctionCompilation(Logger::LAZY_COMPILE_TAG, info, |
- info->shared_info()); |
- return true; |
-} |
- |
- |
-static bool GetOptimizedCodeLater(CompilationInfo* info) { |
- Isolate* isolate = info->isolate(); |
- if (!isolate->optimizing_compiler_thread()->IsQueueAvailable()) { |
- if (FLAG_trace_concurrent_recompilation) { |
- PrintF(" ** Compilation queue full, will retry optimizing "); |
- info->closure()->PrintName(); |
- PrintF(" later.\n"); |
- } |
- return false; |
- } |
- |
- CompilationHandleScope handle_scope(info); |
- if (!CompileOptimizedPrologue(info)) return false; |
- info->SaveHandles(); // Copy handles to the compilation handle scope. |
- |
- TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); |
- |
- OptimizedCompileJob* job = new(info->zone()) OptimizedCompileJob(info); |
- OptimizedCompileJob::Status status = job->CreateGraph(); |
- if (status != OptimizedCompileJob::SUCCEEDED) return false; |
- isolate->optimizing_compiler_thread()->QueueForOptimization(job); |
- |
- if (FLAG_trace_concurrent_recompilation) { |
- PrintF(" ** Queued "); |
- info->closure()->PrintName(); |
- if (info->is_osr()) { |
- PrintF(" for concurrent OSR at %d.\n", info->osr_ast_id().ToInt()); |
- } else { |
- PrintF(" for concurrent optimization.\n"); |
- } |
- } |
- return true; |
-} |
- |
- |
MaybeHandle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function, |
Handle<Code> current_code, |
ConcurrencyMode mode, |