| 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 | 8 |
| 9 #include "src/ast/ast-numbering.h" | 9 #include "src/ast/ast-numbering.h" |
| 10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
| (...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 701 passes_turbo_filter) && | 701 passes_turbo_filter) && |
| 702 passes_osr_test; | 702 passes_osr_test; |
| 703 } | 703 } |
| 704 | 704 |
| 705 bool GetOptimizedCodeNow(CompilationInfo* info) { | 705 bool GetOptimizedCodeNow(CompilationInfo* info) { |
| 706 Isolate* isolate = info->isolate(); | 706 Isolate* isolate = info->isolate(); |
| 707 CanonicalHandleScope canonical(isolate); | 707 CanonicalHandleScope canonical(isolate); |
| 708 TimerEventScope<TimerEventOptimizeCode> optimize_code_timer(isolate); | 708 TimerEventScope<TimerEventOptimizeCode> optimize_code_timer(isolate); |
| 709 TRACE_EVENT0("v8", "V8.OptimizeCode"); | 709 TRACE_EVENT0("v8", "V8.OptimizeCode"); |
| 710 | 710 |
| 711 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; | 711 bool use_turbofan = UseTurboFan(info); |
| 712 OptimizedCompileJob* job = use_turbofan |
| 713 ? compiler::Pipeline::NewCompilationJob(info) |
| 714 : new (info->zone()) HCompilationJob(info); |
| 715 |
| 716 // Parsing is not required when optimizing from existing bytecode. |
| 717 if (!use_turbofan || !info->shared_info()->HasBytecodeArray()) { |
| 718 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; |
| 719 } else { |
| 720 info->MarkAsOptimizeFromBytecode(); |
| 721 } |
| 712 | 722 |
| 713 TimerEventScope<TimerEventRecompileSynchronous> timer(isolate); | 723 TimerEventScope<TimerEventRecompileSynchronous> timer(isolate); |
| 714 TRACE_EVENT0("v8", "V8.RecompileSynchronous"); | 724 TRACE_EVENT0("v8", "V8.RecompileSynchronous"); |
| 715 | 725 |
| 716 OptimizedCompileJob* job = UseTurboFan(info) | |
| 717 ? compiler::Pipeline::NewCompilationJob(info) | |
| 718 : new (info->zone()) HCompilationJob(info); | |
| 719 if (job->CreateGraph() != OptimizedCompileJob::SUCCEEDED || | 726 if (job->CreateGraph() != OptimizedCompileJob::SUCCEEDED || |
| 720 job->OptimizeGraph() != OptimizedCompileJob::SUCCEEDED || | 727 job->OptimizeGraph() != OptimizedCompileJob::SUCCEEDED || |
| 721 job->GenerateCode() != OptimizedCompileJob::SUCCEEDED) { | 728 job->GenerateCode() != OptimizedCompileJob::SUCCEEDED) { |
| 722 if (FLAG_trace_opt) { | 729 if (FLAG_trace_opt) { |
| 723 PrintF("[aborted optimizing "); | 730 PrintF("[aborted optimizing "); |
| 724 info->closure()->ShortPrint(); | 731 info->closure()->ShortPrint(); |
| 725 PrintF(" because: %s]\n", GetBailoutReason(info->bailout_reason())); | 732 PrintF(" because: %s]\n", GetBailoutReason(info->bailout_reason())); |
| 726 } | 733 } |
| 727 return false; | 734 return false; |
| 728 } | 735 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 744 | 751 |
| 745 if (!isolate->optimizing_compile_dispatcher()->IsQueueAvailable()) { | 752 if (!isolate->optimizing_compile_dispatcher()->IsQueueAvailable()) { |
| 746 if (FLAG_trace_concurrent_recompilation) { | 753 if (FLAG_trace_concurrent_recompilation) { |
| 747 PrintF(" ** Compilation queue full, will retry optimizing "); | 754 PrintF(" ** Compilation queue full, will retry optimizing "); |
| 748 info->closure()->ShortPrint(); | 755 info->closure()->ShortPrint(); |
| 749 PrintF(" later.\n"); | 756 PrintF(" later.\n"); |
| 750 } | 757 } |
| 751 return false; | 758 return false; |
| 752 } | 759 } |
| 753 | 760 |
| 761 bool use_turbofan = UseTurboFan(info); |
| 762 OptimizedCompileJob* job = use_turbofan |
| 763 ? compiler::Pipeline::NewCompilationJob(info) |
| 764 : new (info->zone()) HCompilationJob(info); |
| 765 |
| 766 // All handles below this point will be allocated in a deferred handle scope |
| 767 // that is detached and handed off to the background thread when we return. |
| 754 CompilationHandleScope handle_scope(info); | 768 CompilationHandleScope handle_scope(info); |
| 755 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; | 769 |
| 770 // Parsing is not required when optimizing from existing bytecode. |
| 771 if (!use_turbofan || !info->shared_info()->HasBytecodeArray()) { |
| 772 if (!Compiler::ParseAndAnalyze(info->parse_info())) return false; |
| 773 } else { |
| 774 info->MarkAsOptimizeFromBytecode(); |
| 775 } |
| 756 | 776 |
| 757 // Reopen handles in the new CompilationHandleScope. | 777 // Reopen handles in the new CompilationHandleScope. |
| 758 info->ReopenHandlesInNewHandleScope(); | 778 info->ReopenHandlesInNewHandleScope(); |
| 759 info->parse_info()->ReopenHandlesInNewHandleScope(); | 779 info->parse_info()->ReopenHandlesInNewHandleScope(); |
| 760 | 780 |
| 761 TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); | 781 TimerEventScope<TimerEventRecompileSynchronous> timer(info->isolate()); |
| 762 TRACE_EVENT0("v8", "V8.RecompileSynchronous"); | 782 TRACE_EVENT0("v8", "V8.RecompileSynchronous"); |
| 763 | 783 |
| 764 OptimizedCompileJob* job = UseTurboFan(info) | 784 if (job->CreateGraph() != OptimizedCompileJob::SUCCEEDED) return false; |
| 765 ? compiler::Pipeline::NewCompilationJob(info) | |
| 766 : new (info->zone()) HCompilationJob(info); | |
| 767 OptimizedCompileJob::Status status = job->CreateGraph(); | |
| 768 if (status != OptimizedCompileJob::SUCCEEDED) return false; | |
| 769 isolate->optimizing_compile_dispatcher()->QueueForOptimization(job); | 785 isolate->optimizing_compile_dispatcher()->QueueForOptimization(job); |
| 770 | 786 |
| 771 if (FLAG_trace_concurrent_recompilation) { | 787 if (FLAG_trace_concurrent_recompilation) { |
| 772 PrintF(" ** Queued "); | 788 PrintF(" ** Queued "); |
| 773 info->closure()->ShortPrint(); | 789 info->closure()->ShortPrint(); |
| 774 if (info->is_osr()) { | 790 if (info->is_osr()) { |
| 775 PrintF(" for concurrent OSR at %d.\n", info->osr_ast_id().ToInt()); | 791 PrintF(" for concurrent OSR at %d.\n", info->osr_ast_id().ToInt()); |
| 776 } else { | 792 } else { |
| 777 PrintF(" for concurrent optimization.\n"); | 793 PrintF(" for concurrent optimization.\n"); |
| 778 } | 794 } |
| (...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1665 MaybeHandle<Code> code; | 1681 MaybeHandle<Code> code; |
| 1666 if (cached.code != nullptr) code = handle(cached.code); | 1682 if (cached.code != nullptr) code = handle(cached.code); |
| 1667 Handle<Context> native_context(function->context()->native_context()); | 1683 Handle<Context> native_context(function->context()->native_context()); |
| 1668 SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, | 1684 SharedFunctionInfo::AddToOptimizedCodeMap(shared, native_context, code, |
| 1669 literals, BailoutId::None()); | 1685 literals, BailoutId::None()); |
| 1670 } | 1686 } |
| 1671 } | 1687 } |
| 1672 | 1688 |
| 1673 } // namespace internal | 1689 } // namespace internal |
| 1674 } // namespace v8 | 1690 } // namespace v8 |
| OLD | NEW |