OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/flow_graph_inliner.h" | 5 #include "vm/flow_graph_inliner.h" |
6 | 6 |
7 #include "vm/aot_optimizer.h" | 7 #include "vm/aot_optimizer.h" |
8 #include "vm/block_scheduler.h" | 8 #include "vm/block_scheduler.h" |
9 #include "vm/branch_optimizer.h" | 9 #include "vm/branch_optimizer.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 param_stubs); | 841 param_stubs); |
842 DEBUG_ASSERT(callee_graph->VerifyUseLists()); | 842 DEBUG_ASSERT(callee_graph->VerifyUseLists()); |
843 } | 843 } |
844 | 844 |
845 { | 845 { |
846 CSTAT_TIMER_SCOPE(thread(), graphinliner_opt_timer); | 846 CSTAT_TIMER_SCOPE(thread(), graphinliner_opt_timer); |
847 // TODO(fschneider): Improve suppression of speculative inlining. | 847 // TODO(fschneider): Improve suppression of speculative inlining. |
848 // Deopt-ids overlap between caller and callee. | 848 // Deopt-ids overlap between caller and callee. |
849 if (FLAG_precompiled_mode) { | 849 if (FLAG_precompiled_mode) { |
850 #ifdef DART_PRECOMPILER | 850 #ifdef DART_PRECOMPILER |
851 AotOptimizer optimizer(callee_graph, | 851 AotOptimizer optimizer(inliner_->precompiler_, |
| 852 callee_graph, |
852 inliner_->use_speculative_inlining_, | 853 inliner_->use_speculative_inlining_, |
853 inliner_->inlining_black_list_); | 854 inliner_->inlining_black_list_); |
854 optimizer.PopulateWithICData(); | 855 optimizer.PopulateWithICData(); |
855 | 856 |
856 optimizer.ApplyClassIds(); | 857 optimizer.ApplyClassIds(); |
857 DEBUG_ASSERT(callee_graph->VerifyUseLists()); | 858 DEBUG_ASSERT(callee_graph->VerifyUseLists()); |
858 | 859 |
859 FlowGraphTypePropagator::Propagate(callee_graph); | 860 FlowGraphTypePropagator::Propagate(callee_graph); |
860 DEBUG_ASSERT(callee_graph->VerifyUseLists()); | 861 DEBUG_ASSERT(callee_graph->VerifyUseLists()); |
861 | 862 |
(...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1892 return FLAG_trace_inlining && FlowGraphPrinter::ShouldPrint(top); | 1893 return FLAG_trace_inlining && FlowGraphPrinter::ShouldPrint(top); |
1893 } | 1894 } |
1894 | 1895 |
1895 | 1896 |
1896 FlowGraphInliner::FlowGraphInliner( | 1897 FlowGraphInliner::FlowGraphInliner( |
1897 FlowGraph* flow_graph, | 1898 FlowGraph* flow_graph, |
1898 GrowableArray<const Function*>* inline_id_to_function, | 1899 GrowableArray<const Function*>* inline_id_to_function, |
1899 GrowableArray<TokenPosition>* inline_id_to_token_pos, | 1900 GrowableArray<TokenPosition>* inline_id_to_token_pos, |
1900 GrowableArray<intptr_t>* caller_inline_id, | 1901 GrowableArray<intptr_t>* caller_inline_id, |
1901 bool use_speculative_inlining, | 1902 bool use_speculative_inlining, |
1902 GrowableArray<intptr_t>* inlining_black_list) | 1903 GrowableArray<intptr_t>* inlining_black_list, |
| 1904 Precompiler* precompiler) |
1903 : flow_graph_(flow_graph), | 1905 : flow_graph_(flow_graph), |
1904 inline_id_to_function_(inline_id_to_function), | 1906 inline_id_to_function_(inline_id_to_function), |
1905 inline_id_to_token_pos_(inline_id_to_token_pos), | 1907 inline_id_to_token_pos_(inline_id_to_token_pos), |
1906 caller_inline_id_(caller_inline_id), | 1908 caller_inline_id_(caller_inline_id), |
1907 trace_inlining_(ShouldTraceInlining(flow_graph)), | 1909 trace_inlining_(ShouldTraceInlining(flow_graph)), |
1908 use_speculative_inlining_(use_speculative_inlining), | 1910 use_speculative_inlining_(use_speculative_inlining), |
1909 inlining_black_list_(inlining_black_list) { | 1911 inlining_black_list_(inlining_black_list), |
| 1912 precompiler_(precompiler) { |
1910 ASSERT(!use_speculative_inlining || (inlining_black_list != NULL)); | 1913 ASSERT(!use_speculative_inlining || (inlining_black_list != NULL)); |
1911 } | 1914 } |
1912 | 1915 |
1913 | 1916 |
1914 void FlowGraphInliner::CollectGraphInfo(FlowGraph* flow_graph, bool force) { | 1917 void FlowGraphInliner::CollectGraphInfo(FlowGraph* flow_graph, bool force) { |
1915 const Function& function = flow_graph->function(); | 1918 const Function& function = flow_graph->function(); |
1916 if (force || (function.optimized_instruction_count() == 0)) { | 1919 if (force || (function.optimized_instruction_count() == 0)) { |
1917 GraphInfoCollector info; | 1920 GraphInfoCollector info; |
1918 info.Collect(*flow_graph); | 1921 info.Collect(*flow_graph); |
1919 | 1922 |
(...skipping 1883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3803 flow_graph->AppendTo(*entry, *last, | 3806 flow_graph->AppendTo(*entry, *last, |
3804 call->deopt_id() != Thread::kNoDeoptId ? | 3807 call->deopt_id() != Thread::kNoDeoptId ? |
3805 call->env() : NULL, | 3808 call->env() : NULL, |
3806 FlowGraph::kValue); | 3809 FlowGraph::kValue); |
3807 return true; | 3810 return true; |
3808 } | 3811 } |
3809 } | 3812 } |
3810 return false; | 3813 return false; |
3811 } | 3814 } |
3812 | 3815 |
| 3816 case MethodRecognizer::kObjectRuntimeType: { |
| 3817 Type& type = Type::Handle(Z); |
| 3818 if (RawObject::IsStringClassId(receiver_cid)) { |
| 3819 type = Type::StringType(); |
| 3820 } else if (receiver_cid == kDoubleCid) { |
| 3821 type = Type::Double(); |
| 3822 } else if (RawObject::IsIntegerClassId(receiver_cid)) { |
| 3823 type = Type::IntType(); |
| 3824 } else if (receiver_cid != kClosureCid) { |
| 3825 const Class& cls = Class::Handle(Z, |
| 3826 flow_graph->isolate()->class_table()->At(receiver_cid)); |
| 3827 if (!cls.IsGeneric()) { |
| 3828 type = cls.CanonicalType(); |
| 3829 } |
| 3830 } |
| 3831 |
| 3832 if (!type.IsNull()) { |
| 3833 *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(), |
| 3834 call->GetBlock()->try_index()); |
| 3835 (*entry)->InheritDeoptTarget(Z, call); |
| 3836 *last = new(Z) ConstantInstr(type); |
| 3837 flow_graph->AppendTo(*entry, *last, |
| 3838 call->deopt_id() != Thread::kNoDeoptId ? |
| 3839 call->env() : NULL, |
| 3840 FlowGraph::kValue); |
| 3841 return true; |
| 3842 } |
| 3843 return false; |
| 3844 } |
| 3845 |
3813 case MethodRecognizer::kOneByteStringSetAt: { | 3846 case MethodRecognizer::kOneByteStringSetAt: { |
3814 // This is an internal method, no need to check argument types nor | 3847 // This is an internal method, no need to check argument types nor |
3815 // range. | 3848 // range. |
3816 *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(), | 3849 *entry = new(Z) TargetEntryInstr(flow_graph->allocate_block_id(), |
3817 call->GetBlock()->try_index()); | 3850 call->GetBlock()->try_index()); |
3818 (*entry)->InheritDeoptTarget(Z, call); | 3851 (*entry)->InheritDeoptTarget(Z, call); |
3819 Definition* str = call->ArgumentAt(0); | 3852 Definition* str = call->ArgumentAt(0); |
3820 Definition* index = call->ArgumentAt(1); | 3853 Definition* index = call->ArgumentAt(1); |
3821 Definition* value = call->ArgumentAt(2); | 3854 Definition* value = call->ArgumentAt(2); |
3822 *last = new(Z) StoreIndexedInstr( | 3855 *last = new(Z) StoreIndexedInstr( |
(...skipping 13 matching lines...) Expand all Loading... |
3836 return true; | 3869 return true; |
3837 } | 3870 } |
3838 | 3871 |
3839 default: | 3872 default: |
3840 return false; | 3873 return false; |
3841 } | 3874 } |
3842 } | 3875 } |
3843 | 3876 |
3844 | 3877 |
3845 } // namespace dart | 3878 } // namespace dart |
OLD | NEW |