diff options
Diffstat (limited to 'deps/v8/src/compiler.cc')
-rw-r--r-- | deps/v8/src/compiler.cc | 176 |
1 files changed, 95 insertions, 81 deletions
diff --git a/deps/v8/src/compiler.cc b/deps/v8/src/compiler.cc index f1cdd7c9b0..c2d63fb041 100644 --- a/deps/v8/src/compiler.cc +++ b/deps/v8/src/compiler.cc @@ -8,7 +8,6 @@ #include <memory> #include "src/asmjs/asm-js.h" -#include "src/asmjs/asm-typer.h" #include "src/assembler-inl.h" #include "src/ast/ast-numbering.h" #include "src/ast/prettyprinter.h" @@ -30,6 +29,7 @@ #include "src/isolate-inl.h" #include "src/log-inl.h" #include "src/messages.h" +#include "src/objects/map.h" #include "src/parsing/parsing.h" #include "src/parsing/rewriter.h" #include "src/parsing/scanner-character-streams.h" @@ -233,7 +233,7 @@ void CompilationJob::RegisterWeakObjectsInOptimizedCode(Handle<Code> code) { // TODO(turbofan): Move this to pipeline.cc once Crankshaft dies. Isolate* const isolate = code->GetIsolate(); DCHECK(code->is_optimized_code()); - std::vector<Handle<Map>> maps; + MapHandles maps; std::vector<Handle<HeapObject>> objects; { DisallowHeapAllocation no_gc; @@ -471,6 +471,10 @@ CompilationJob::Status FinalizeUnoptimizedCompilationJob(CompilationJob* job) { void SetSharedFunctionFlagsFromLiteral(FunctionLiteral* literal, Handle<SharedFunctionInfo> shared_info) { + // Don't overwrite values set by the bootstrapper. + if (!shared_info->HasLength()) { + shared_info->set_length(literal->function_length()); + } shared_info->set_ast_node_count(literal->ast_node_count()); shared_info->set_has_duplicate_parameters( literal->has_duplicate_parameters()); @@ -705,15 +709,25 @@ MUST_USE_RESULT MaybeHandle<Code> GetUnoptimizedCode( return info->code(); } -MUST_USE_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeMap( +MUST_USE_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeCache( Handle<JSFunction> function, BailoutId osr_ast_id) { RuntimeCallTimerScope runtimeTimer( function->GetIsolate(), &RuntimeCallStats::CompileGetFromOptimizedCodeMap); Handle<SharedFunctionInfo> shared(function->shared()); DisallowHeapAllocation no_gc; - Code* code = shared->SearchOptimizedCodeMap( - function->context()->native_context(), osr_ast_id); + Code* code = nullptr; + if (osr_ast_id.IsNone()) { + if (function->feedback_vector_cell()->value()->IsFeedbackVector()) { + FeedbackVector* feedback_vector = function->feedback_vector(); + feedback_vector->EvictOptimizedCodeMarkedForDeoptimization( + function->shared(), "GetCodeFromOptimizedCodeCache"); + code = feedback_vector->optimized_code(); + } + } else { + code = function->context()->native_context()->SearchOSROptimizedCodeCache( + function->shared(), osr_ast_id); + } if (code != nullptr) { // Caching of optimized code enabled and optimized code found. DCHECK(!code->marked_for_deoptimization()); @@ -723,7 +737,7 @@ MUST_USE_RESULT MaybeHandle<Code> GetCodeFromOptimizedCodeMap( return MaybeHandle<Code>(); } -void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { +void InsertCodeIntoOptimizedCodeCache(CompilationInfo* info) { Handle<Code> code = info->code(); if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. @@ -737,8 +751,14 @@ void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { Handle<JSFunction> function = info->closure(); Handle<SharedFunctionInfo> shared(function->shared()); Handle<Context> native_context(function->context()->native_context()); - SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, - info->osr_ast_id()); + if (info->osr_ast_id().IsNone()) { + Handle<FeedbackVector> vector = + handle(function->feedback_vector(), function->GetIsolate()); + FeedbackVector::SetOptimizedCode(vector, code); + } else { + Context::AddToOSROptimizedCodeCache(native_context, shared, code, + info->osr_ast_id()); + } } bool GetOptimizedCodeNow(CompilationJob* job) { @@ -773,7 +793,7 @@ bool GetOptimizedCodeNow(CompilationJob* job) { // Success! job->RecordOptimizedCompilationStats(); DCHECK(!isolate->has_pending_exception()); - InsertCodeIntoOptimizedCodeMap(info); + InsertCodeIntoOptimizedCodeCache(info); RecordFunctionCompilation(CodeEventListener::LAZY_COMPILE_TAG, info); return true; } @@ -848,7 +868,7 @@ MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function, DCHECK_IMPLIES(ignition_osr, FLAG_ignition_osr); Handle<Code> cached_code; - if (GetCodeFromOptimizedCodeMap(function, osr_ast_id) + if (GetCodeFromOptimizedCodeCache(function, osr_ast_id) .ToHandle(&cached_code)) { if (FLAG_trace_opt) { PrintF("[found optimized code for "); @@ -1001,10 +1021,7 @@ CompilationJob::Status FinalizeOptimizedCompilationJob(CompilationJob* job) { } else if (job->FinalizeJob() == CompilationJob::SUCCEEDED) { job->RecordOptimizedCompilationStats(); RecordFunctionCompilation(CodeEventListener::LAZY_COMPILE_TAG, info); - if (shared->SearchOptimizedCodeMap(info->context()->native_context(), - info->osr_ast_id()) == nullptr) { - InsertCodeIntoOptimizedCodeMap(info); - } + InsertCodeIntoOptimizedCodeCache(info); if (FLAG_trace_opt) { PrintF("[completed optimizing "); info->closure()->ShortPrint(); @@ -1035,73 +1052,71 @@ MaybeHandle<Code> GetLazyCode(Handle<JSFunction> function) { TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.CompileCode"); AggregatedHistogramTimerScope timer(isolate->counters()->compile_lazy()); - Handle<Code> cached_code; - if (GetCodeFromOptimizedCodeMap(function, BailoutId::None()) - .ToHandle(&cached_code)) { - if (FLAG_trace_opt) { - PrintF("[found optimized code for "); - function->ShortPrint(); - PrintF(" during unoptimized compile]\n"); + if (function->shared()->is_compiled()) { + // Function has already been compiled, get the optimized code if possible, + // otherwise return baseline code. + Handle<Code> cached_code; + if (GetCodeFromOptimizedCodeCache(function, BailoutId::None()) + .ToHandle(&cached_code)) { + if (FLAG_trace_opt) { + PrintF("[found optimized code for "); + function->ShortPrint(); + PrintF(" during unoptimized compile]\n"); + } + DCHECK(function->shared()->is_compiled()); + return cached_code; } - DCHECK(function->shared()->is_compiled()); - return cached_code; - } - if (function->shared()->is_compiled() && - function->shared()->marked_for_tier_up()) { - DCHECK(FLAG_mark_shared_functions_for_tier_up); + if (function->shared()->marked_for_tier_up()) { + DCHECK(FLAG_mark_shared_functions_for_tier_up); - function->shared()->set_marked_for_tier_up(false); + function->shared()->set_marked_for_tier_up(false); - if (FLAG_trace_opt) { - PrintF("[optimizing method "); - function->ShortPrint(); - PrintF(" eagerly (shared function marked for tier up)]\n"); - } + if (FLAG_trace_opt) { + PrintF("[optimizing method "); + function->ShortPrint(); + PrintF(" eagerly (shared function marked for tier up)]\n"); + } - Handle<Code> code; - if (GetOptimizedCodeMaybeLater(function).ToHandle(&code)) { - return code; + Handle<Code> code; + if (GetOptimizedCodeMaybeLater(function).ToHandle(&code)) { + return code; + } } - } - if (function->shared()->is_compiled()) { return Handle<Code>(function->shared()->code()); - } - - if (function->shared()->HasBytecodeArray()) { - Handle<Code> entry = isolate->builtins()->InterpreterEntryTrampoline(); - function->shared()->ReplaceCode(*entry); - return entry; - } + } else { + // Function doesn't have any baseline compiled code, compile now. + DCHECK(!function->shared()->HasBytecodeArray()); - ParseInfo parse_info(handle(function->shared())); - Zone compile_zone(isolate->allocator(), ZONE_NAME); - CompilationInfo info(&compile_zone, &parse_info, isolate, function); - if (FLAG_preparser_scope_analysis) { - Handle<SharedFunctionInfo> shared(function->shared()); - Handle<Script> script(Script::cast(function->shared()->script())); - if (script->HasPreparsedScopeData()) { - parse_info.preparsed_scope_data()->Deserialize( - script->GetPreparsedScopeData()); + ParseInfo parse_info(handle(function->shared())); + Zone compile_zone(isolate->allocator(), ZONE_NAME); + CompilationInfo info(&compile_zone, &parse_info, isolate, function); + if (FLAG_experimental_preparser_scope_analysis) { + Handle<SharedFunctionInfo> shared(function->shared()); + Handle<Script> script(Script::cast(function->shared()->script())); + if (script->HasPreparsedScopeData()) { + parse_info.preparsed_scope_data()->Deserialize( + script->preparsed_scope_data()); + } } - } - Compiler::ConcurrencyMode inner_function_mode = - FLAG_compiler_dispatcher_eager_inner ? Compiler::CONCURRENT - : Compiler::NOT_CONCURRENT; - Handle<Code> result; - ASSIGN_RETURN_ON_EXCEPTION( - isolate, result, GetUnoptimizedCode(&info, inner_function_mode), Code); - - if (FLAG_always_opt && !info.shared_info()->HasAsmWasmData()) { - Handle<Code> opt_code; - if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT) - .ToHandle(&opt_code)) { - result = opt_code; + Compiler::ConcurrencyMode inner_function_mode = + FLAG_compiler_dispatcher_eager_inner ? Compiler::CONCURRENT + : Compiler::NOT_CONCURRENT; + Handle<Code> result; + ASSIGN_RETURN_ON_EXCEPTION( + isolate, result, GetUnoptimizedCode(&info, inner_function_mode), Code); + + if (FLAG_always_opt && !info.shared_info()->HasAsmWasmData()) { + Handle<Code> opt_code; + if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT) + .ToHandle(&opt_code)) { + result = opt_code; + } } - } - return result; + return result; + } } @@ -1177,9 +1192,9 @@ Handle<SharedFunctionInfo> CompileToplevel(CompilationInfo* info) { if (!script.is_null()) { script->set_compilation_state(Script::COMPILATION_STATE_COMPILED); - if (FLAG_preparser_scope_analysis) { - Handle<FixedUint32Array> data( - parse_info->preparsed_scope_data()->Serialize(isolate)); + if (FLAG_experimental_preparser_scope_analysis) { + Handle<PodArray<uint32_t>> data = + parse_info->preparsed_scope_data()->Serialize(isolate); script->set_preparsed_scope_data(*data); } } @@ -1874,18 +1889,17 @@ void Compiler::PostInstantiation(Handle<JSFunction> function, function->MarkForOptimization(); } - Code* code = shared->SearchOptimizedCodeMap( - function->context()->native_context(), BailoutId::None()); - if (code != nullptr) { - // Caching of optimized code enabled and optimized code found. - DCHECK(!code->marked_for_deoptimization()); - DCHECK(function->shared()->is_compiled()); - function->ReplaceCode(code); - } - if (shared->is_compiled()) { // TODO(mvstanton): pass pretenure flag to EnsureLiterals. JSFunction::EnsureLiterals(function); + + Code* code = function->feedback_vector()->optimized_code(); + if (code != nullptr) { + // Caching of optimized code enabled and optimized code found. + DCHECK(!code->marked_for_deoptimization()); + DCHECK(function->shared()->is_compiled()); + function->ReplaceCode(code); + } } } |