Chromium Code Reviews| 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 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 627 Compiler::ConcurrencyMode mode, | 627 Compiler::ConcurrencyMode mode, |
| 628 BailoutId osr_ast_id = BailoutId::None(), | 628 BailoutId osr_ast_id = BailoutId::None(), |
| 629 JavaScriptFrame* osr_frame = nullptr) { | 629 JavaScriptFrame* osr_frame = nullptr) { |
| 630 Isolate* isolate = function->GetIsolate(); | 630 Isolate* isolate = function->GetIsolate(); |
| 631 Handle<SharedFunctionInfo> shared(function->shared(), isolate); | 631 Handle<SharedFunctionInfo> shared(function->shared(), isolate); |
| 632 | 632 |
| 633 bool ignition_osr = osr_frame && osr_frame->is_interpreted(); | 633 bool ignition_osr = osr_frame && osr_frame->is_interpreted(); |
| 634 DCHECK_IMPLIES(ignition_osr, !osr_ast_id.IsNone()); | 634 DCHECK_IMPLIES(ignition_osr, !osr_ast_id.IsNone()); |
| 635 DCHECK_IMPLIES(ignition_osr, FLAG_ignition_osr); | 635 DCHECK_IMPLIES(ignition_osr, FLAG_ignition_osr); |
| 636 | 636 |
| 637 // Shared function no longer needs to be tiered up | |
| 638 shared->set_was_marked_for_tier_up(false); | |
| 639 | |
| 637 // Flag combination --ignition-osr --no-turbo-from-bytecode is unsupported. | 640 // Flag combination --ignition-osr --no-turbo-from-bytecode is unsupported. |
| 638 if (ignition_osr && !FLAG_turbo_from_bytecode) return MaybeHandle<Code>(); | 641 if (ignition_osr && !FLAG_turbo_from_bytecode) return MaybeHandle<Code>(); |
| 639 | 642 |
| 640 Handle<Code> cached_code; | 643 Handle<Code> cached_code; |
| 641 // TODO(4764): When compiling for OSR from bytecode, BailoutId might derive | 644 // TODO(4764): When compiling for OSR from bytecode, BailoutId might derive |
| 642 // from bytecode offset and overlap with actual BailoutId. No lookup! | 645 // from bytecode offset and overlap with actual BailoutId. No lookup! |
| 643 if (!ignition_osr && | 646 if (!ignition_osr && |
| 644 GetCodeFromOptimizedCodeMap(function, osr_ast_id) | 647 GetCodeFromOptimizedCodeMap(function, osr_ast_id) |
| 645 .ToHandle(&cached_code)) { | 648 .ToHandle(&cached_code)) { |
| 646 if (FLAG_trace_opt) { | 649 if (FLAG_trace_opt) { |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 863 } | 866 } |
| 864 | 867 |
| 865 MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { | 868 MaybeHandle<Code> GetBaselineCode(Handle<JSFunction> function) { |
| 866 Isolate* isolate = function->GetIsolate(); | 869 Isolate* isolate = function->GetIsolate(); |
| 867 VMState<COMPILER> state(isolate); | 870 VMState<COMPILER> state(isolate); |
| 868 PostponeInterruptsScope postpone(isolate); | 871 PostponeInterruptsScope postpone(isolate); |
| 869 Zone zone(isolate->allocator(), ZONE_NAME); | 872 Zone zone(isolate->allocator(), ZONE_NAME); |
| 870 ParseInfo parse_info(&zone, handle(function->shared())); | 873 ParseInfo parse_info(&zone, handle(function->shared())); |
| 871 CompilationInfo info(&parse_info, function); | 874 CompilationInfo info(&parse_info, function); |
| 872 | 875 |
| 876 // Function no longer needs to be tiered up | |
| 877 function->shared()->set_was_marked_for_tier_up(false); | |
| 878 | |
| 873 // Reset profiler ticks, function is no longer considered hot. | 879 // Reset profiler ticks, function is no longer considered hot. |
| 874 if (function->shared()->HasBytecodeArray()) { | 880 if (function->shared()->HasBytecodeArray()) { |
| 875 function->shared()->set_profiler_ticks(0); | 881 function->shared()->set_profiler_ticks(0); |
| 876 } | 882 } |
| 877 | 883 |
| 878 // Nothing left to do if the function already has baseline code. | 884 // Nothing left to do if the function already has baseline code. |
| 879 if (function->shared()->code()->kind() == Code::FUNCTION) { | 885 if (function->shared()->code()->kind() == Code::FUNCTION) { |
| 880 return Handle<Code>(function->shared()->code()); | 886 return Handle<Code>(function->shared()->code()); |
| 881 } | 887 } |
| 882 | 888 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 970 .ToHandle(&cached_code)) { | 976 .ToHandle(&cached_code)) { |
| 971 if (FLAG_trace_opt) { | 977 if (FLAG_trace_opt) { |
| 972 PrintF("[found optimized code for "); | 978 PrintF("[found optimized code for "); |
| 973 function->ShortPrint(); | 979 function->ShortPrint(); |
| 974 PrintF(" during unoptimized compile]\n"); | 980 PrintF(" during unoptimized compile]\n"); |
| 975 } | 981 } |
| 976 DCHECK(function->shared()->is_compiled()); | 982 DCHECK(function->shared()->is_compiled()); |
| 977 return cached_code; | 983 return cached_code; |
| 978 } | 984 } |
| 979 | 985 |
| 980 if (function->shared()->was_marked_for_optimization()) { | 986 if (function->shared()->was_marked_for_tier_up()) { |
| 981 DCHECK(FLAG_optimize_shared_functions); | 987 DCHECK(FLAG_tier_up_shared_functions); |
| 988 DCHECK(function->shared()->is_compiled()); | |
|
Michael Starzinger
2016/10/27 09:29:59
Can you elaborate why this DCHECK was added? I can
Michael Starzinger
2016/10/27 09:32:21
Actually, I think with code flushing this is not g
Leszek Swirski
2016/10/27 09:40:20
It's here because I put the default case as unreac
| |
| 982 | 989 |
| 983 function->shared()->set_was_marked_for_optimization(false); | 990 function->shared()->set_was_marked_for_tier_up(false); |
| 984 | 991 |
| 985 if (FLAG_trace_opt) { | 992 switch (Compiler::NextCompilationTier(*function)) { |
| 986 PrintF("[optimizing function "); | 993 case Compiler::BASELINE: { |
| 987 function->PrintName(); | 994 if (FLAG_trace_opt) { |
| 988 PrintF(" eagerly because shared function was previously marked]\n"); | 995 PrintF("[recompiling function "); |
| 989 } | 996 function->ShortPrint(); |
| 997 PrintF( | |
| 998 " to baseline eagerly (shared function marked for tier up)]\n"); | |
| 999 } | |
| 990 | 1000 |
| 991 Handle<Code> opt_code; | 1001 Handle<Code> code; |
| 992 if (GetOptimizedCode(function, Compiler::NOT_CONCURRENT) | 1002 if (!GetBaselineCode(function).ToHandle(&code)) { |
| 993 .ToHandle(&opt_code)) { | 1003 return code; |
| 994 return opt_code; | 1004 } |
| 1005 break; | |
| 1006 } | |
| 1007 case Compiler::OPTIMIZED: { | |
| 1008 if (FLAG_trace_opt) { | |
| 1009 PrintF("[optimizing method "); | |
| 1010 function->ShortPrint(); | |
| 1011 PrintF(" eagerly (shared function marked for tier up)]\n"); | |
| 1012 } | |
| 1013 | |
| 1014 Handle<Code> code; | |
| 1015 // TODO(leszeks): Look into performing this compilation concurrently. | |
| 1016 if (!GetOptimizedCode(function, Compiler::NOT_CONCURRENT) | |
| 1017 .ToHandle(&code)) { | |
| 1018 return code; | |
| 1019 } | |
| 1020 break; | |
| 1021 } | |
| 1022 default: | |
| 1023 UNREACHABLE(); | |
| 995 } | 1024 } |
| 996 } | 1025 } |
| 997 | 1026 |
| 998 if (function->shared()->is_compiled()) { | 1027 if (function->shared()->is_compiled()) { |
| 999 return Handle<Code>(function->shared()->code()); | 1028 return Handle<Code>(function->shared()->code()); |
| 1000 } | 1029 } |
| 1001 | 1030 |
| 1002 if (function->shared()->HasBytecodeArray()) { | 1031 if (function->shared()->HasBytecodeArray()) { |
| 1003 Handle<Code> entry = isolate->builtins()->InterpreterEntryTrampoline(); | 1032 Handle<Code> entry = isolate->builtins()->InterpreterEntryTrampoline(); |
| 1004 function->shared()->ReplaceCode(*entry); | 1033 function->shared()->ReplaceCode(*entry); |
| (...skipping 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1830 DCHECK(shared->is_compiled()); | 1859 DCHECK(shared->is_compiled()); |
| 1831 function->set_literals(cached.literals); | 1860 function->set_literals(cached.literals); |
| 1832 } else if (shared->is_compiled()) { | 1861 } else if (shared->is_compiled()) { |
| 1833 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. | 1862 // TODO(mvstanton): pass pretenure flag to EnsureLiterals. |
| 1834 JSFunction::EnsureLiterals(function); | 1863 JSFunction::EnsureLiterals(function); |
| 1835 } | 1864 } |
| 1836 } | 1865 } |
| 1837 | 1866 |
| 1838 } // namespace internal | 1867 } // namespace internal |
| 1839 } // namespace v8 | 1868 } // namespace v8 |
| OLD | NEW |