| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler.h" | 5 #include "src/compiler.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "src/asmjs/asm-js.h" | 10 #include "src/asmjs/asm-js.h" |
| (...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 580 void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { | 580 void InsertCodeIntoOptimizedCodeMap(CompilationInfo* info) { |
| 581 Handle<Code> code = info->code(); | 581 Handle<Code> code = info->code(); |
| 582 if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. | 582 if (code->kind() != Code::OPTIMIZED_FUNCTION) return; // Nothing to do. |
| 583 | 583 |
| 584 // Function context specialization folds-in the function context, | 584 // Function context specialization folds-in the function context, |
| 585 // so no sharing can occur. | 585 // so no sharing can occur. |
| 586 if (info->is_function_context_specializing()) return; | 586 if (info->is_function_context_specializing()) return; |
| 587 // Frame specialization implies function context specialization. | 587 // Frame specialization implies function context specialization. |
| 588 DCHECK(!info->is_frame_specializing()); | 588 DCHECK(!info->is_frame_specializing()); |
| 589 | 589 |
| 590 // TODO(4764): When compiling for OSR from bytecode, BailoutId might derive |
| 591 // from bytecode offset and overlap with actual BailoutId. No caching! |
| 592 if (info->is_osr() && info->is_optimizing_from_bytecode()) return; |
| 593 |
| 590 // Cache optimized context-specific code. | 594 // Cache optimized context-specific code. |
| 591 Handle<JSFunction> function = info->closure(); | 595 Handle<JSFunction> function = info->closure(); |
| 592 Handle<SharedFunctionInfo> shared(function->shared()); | 596 Handle<SharedFunctionInfo> shared(function->shared()); |
| 593 Handle<LiteralsArray> literals(function->literals()); | 597 Handle<LiteralsArray> literals(function->literals()); |
| 594 Handle<Context> native_context(function->context()->native_context()); | 598 Handle<Context> native_context(function->context()->native_context()); |
| 595 SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, | 599 SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, |
| 596 literals, info->osr_ast_id()); | 600 literals, info->osr_ast_id()); |
| 597 | 601 |
| 598 // Do not cache (native) context-independent code compiled for OSR. | 602 // Do not cache (native) context-independent code compiled for OSR. |
| 599 if (code->is_turbofanned() && info->is_osr()) return; | 603 if (code->is_turbofanned() && info->is_osr()) return; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 return true; | 744 return true; |
| 741 } | 745 } |
| 742 | 746 |
| 743 MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function, | 747 MaybeHandle<Code> GetOptimizedCode(Handle<JSFunction> function, |
| 744 Compiler::ConcurrencyMode mode, | 748 Compiler::ConcurrencyMode mode, |
| 745 BailoutId osr_ast_id = BailoutId::None(), | 749 BailoutId osr_ast_id = BailoutId::None(), |
| 746 JavaScriptFrame* osr_frame = nullptr) { | 750 JavaScriptFrame* osr_frame = nullptr) { |
| 747 Isolate* isolate = function->GetIsolate(); | 751 Isolate* isolate = function->GetIsolate(); |
| 748 Handle<SharedFunctionInfo> shared(function->shared(), isolate); | 752 Handle<SharedFunctionInfo> shared(function->shared(), isolate); |
| 749 | 753 |
| 750 // TODO(4764): Remove this guard once OSR graph construction works. | 754 bool ignition_osr = osr_frame && osr_frame->is_interpreted(); |
| 751 if (!osr_ast_id.IsNone() && osr_frame->is_interpreted()) { | 755 DCHECK_IMPLIES(ignition_osr, !osr_ast_id.IsNone()); |
| 752 return MaybeHandle<Code>(); | 756 DCHECK_IMPLIES(ignition_osr, FLAG_ignition_osr); |
| 753 } | 757 |
| 758 // Flag combination --ignition-osr --no-turbo-from-bytecode is unsupported. |
| 759 if (ignition_osr && !FLAG_turbo_from_bytecode) return MaybeHandle<Code>(); |
| 754 | 760 |
| 755 Handle<Code> cached_code; | 761 Handle<Code> cached_code; |
| 756 if (GetCodeFromOptimizedCodeMap(function, osr_ast_id) | 762 // TODO(4764): When compiling for OSR from bytecode, BailoutId might derive |
| 763 // from bytecode offset and overlap with actual BailoutId. No lookup! |
| 764 if (!ignition_osr && |
| 765 GetCodeFromOptimizedCodeMap(function, osr_ast_id) |
| 757 .ToHandle(&cached_code)) { | 766 .ToHandle(&cached_code)) { |
| 758 if (FLAG_trace_opt) { | 767 if (FLAG_trace_opt) { |
| 759 PrintF("[found optimized code for "); | 768 PrintF("[found optimized code for "); |
| 760 function->ShortPrint(); | 769 function->ShortPrint(); |
| 761 if (!osr_ast_id.IsNone()) { | 770 if (!osr_ast_id.IsNone()) { |
| 762 PrintF(" at OSR AST id %d", osr_ast_id.ToInt()); | 771 PrintF(" at OSR AST id %d", osr_ast_id.ToInt()); |
| 763 } | 772 } |
| 764 PrintF("]\n"); | 773 PrintF("]\n"); |
| 765 } | 774 } |
| 766 return cached_code; | 775 return cached_code; |
| 767 } | 776 } |
| 768 | 777 |
| 769 // Reset profiler ticks, function is no longer considered hot. | 778 // Reset profiler ticks, function is no longer considered hot. |
| 770 if (shared->is_compiled()) { | 779 if (shared->is_compiled()) { |
| 771 shared->code()->set_profiler_ticks(0); | 780 shared->code()->set_profiler_ticks(0); |
| 772 } | 781 } |
| 773 | 782 |
| 774 VMState<COMPILER> state(isolate); | 783 VMState<COMPILER> state(isolate); |
| 775 DCHECK(!isolate->has_pending_exception()); | 784 DCHECK(!isolate->has_pending_exception()); |
| 776 PostponeInterruptsScope postpone(isolate); | 785 PostponeInterruptsScope postpone(isolate); |
| 777 bool use_turbofan = UseTurboFan(shared); | 786 bool use_turbofan = UseTurboFan(shared) || ignition_osr; |
| 778 std::unique_ptr<CompilationJob> job( | 787 std::unique_ptr<CompilationJob> job( |
| 779 use_turbofan ? compiler::Pipeline::NewCompilationJob(function) | 788 use_turbofan ? compiler::Pipeline::NewCompilationJob(function) |
| 780 : new HCompilationJob(function)); | 789 : new HCompilationJob(function)); |
| 781 CompilationInfo* info = job->info(); | 790 CompilationInfo* info = job->info(); |
| 782 ParseInfo* parse_info = info->parse_info(); | 791 ParseInfo* parse_info = info->parse_info(); |
| 783 | 792 |
| 784 info->SetOptimizingForOsr(osr_ast_id, osr_frame); | 793 info->SetOptimizingForOsr(osr_ast_id, osr_frame); |
| 785 | 794 |
| 786 // Do not use Crankshaft/TurboFan if we need to be able to set break points. | 795 // Do not use Crankshaft/TurboFan if we need to be able to set break points. |
| 787 if (info->shared_info()->HasDebugInfo()) { | 796 if (info->shared_info()->HasDebugInfo()) { |
| (...skipping 1130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1918 DCHECK(shared->is_compiled()); | 1927 DCHECK(shared->is_compiled()); |
| 1919 function->set_literals(cached.literals); | 1928 function->set_literals(cached.literals); |
| 1920 } else if (shared->is_compiled()) { | 1929 } else if (shared->is_compiled()) { |
| 1921 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. | 1930 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. |
| 1922 JSFunction::EnsureLiterals(function); | 1931 JSFunction::EnsureLiterals(function); |
| 1923 } | 1932 } |
| 1924 } | 1933 } |
| 1925 | 1934 |
| 1926 } // namespace internal | 1935 } // namespace internal |
| 1927 } // namespace v8 | 1936 } // namespace v8 |
| OLD | NEW |