Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/compiler.h" | 5 #include "vm/compiler.h" |
| 6 | 6 |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 | 8 |
| 9 #include "vm/ast_printer.h" | 9 #include "vm/ast_printer.h" |
| 10 #include "vm/block_scheduler.h" | 10 #include "vm/block_scheduler.h" |
| (...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 828 // position of the inlined call until later. A side effect of this | 828 // position of the inlined call until later. A side effect of this |
| 829 // is that the length of |inline_id_to_function| is always larger | 829 // is that the length of |inline_id_to_function| is always larger |
| 830 // than the length of |inline_id_to_token_pos| by one. | 830 // than the length of |inline_id_to_token_pos| by one. |
| 831 // Top scope function has no caller (-1). We do this because we expect | 831 // Top scope function has no caller (-1). We do this because we expect |
| 832 // all token positions to be at an inlined call. | 832 // all token positions to be at an inlined call. |
| 833 caller_inline_id.Add(-1); | 833 caller_inline_id.Add(-1); |
| 834 CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer); | 834 CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer); |
| 835 | 835 |
| 836 JitOptimizer optimizer(flow_graph); | 836 JitOptimizer optimizer(flow_graph); |
| 837 | 837 |
| 838 optimizer.ApplyICData(); | 838 { |
| 839 NOT_IN_PRODUCT(TimelineDurationScope tds(thread(), compiler_timeline, | |
| 840 "ApplyICData")); | |
| 841 optimizer.ApplyICData(); | |
| 842 SafepointOperationScope safepoint_scope(thread()); | |
|
Vyacheslav Egorov (Google)
2017/03/23 10:24:02
Here and below:
I think you need
thread()->Chec
erikcorry
2017/03/27 10:23:28
Done.
| |
| 843 } | |
| 839 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 844 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 840 | 845 |
| 841 // Optimize (a << b) & c patterns, merge operations. | 846 // Optimize (a << b) & c patterns, merge operations. |
| 842 // Run early in order to have more opportunity to optimize left shifts. | 847 // Run early in order to have more opportunity to optimize left shifts. |
| 843 flow_graph->TryOptimizePatterns(); | 848 flow_graph->TryOptimizePatterns(); |
| 844 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 849 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 845 | 850 |
| 846 FlowGraphInliner::SetInliningId(flow_graph, 0); | 851 FlowGraphInliner::SetInliningId(flow_graph, 0); |
| 847 | 852 |
| 848 // Inlining (mutates the flow graph) | 853 // Inlining (mutates the flow graph) |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 859 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 864 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 860 | 865 |
| 861 FlowGraphInliner inliner(flow_graph, &inline_id_to_function, | 866 FlowGraphInliner inliner(flow_graph, &inline_id_to_function, |
| 862 &inline_id_to_token_pos, &caller_inline_id, | 867 &inline_id_to_token_pos, &caller_inline_id, |
| 863 use_speculative_inlining, | 868 use_speculative_inlining, |
| 864 /*inlining_black_list=*/NULL, | 869 /*inlining_black_list=*/NULL, |
| 865 /*precompiler=*/NULL); | 870 /*precompiler=*/NULL); |
| 866 inliner.Inline(); | 871 inliner.Inline(); |
| 867 // Use lists are maintained and validated by the inliner. | 872 // Use lists are maintained and validated by the inliner. |
| 868 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 873 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 874 SafepointOperationScope safepoint_scope(thread()); | |
| 869 } | 875 } |
| 870 | 876 |
| 871 // Propagate types and eliminate more type tests. | 877 // Propagate types and eliminate more type tests. |
| 872 FlowGraphTypePropagator::Propagate(flow_graph); | 878 FlowGraphTypePropagator::Propagate(flow_graph); |
| 873 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 879 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 874 | 880 |
| 875 { | 881 { |
| 876 NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline, | 882 NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline, |
| 877 "ApplyClassIds")); | 883 "ApplyClassIds")); |
| 878 // Use propagated class-ids to optimize further. | 884 // Use propagated class-ids to optimize further. |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 971 // it depends on the numbering of loads from the previous | 977 // it depends on the numbering of loads from the previous |
| 972 // load-elimination. | 978 // load-elimination. |
| 973 if (FLAG_loop_invariant_code_motion) { | 979 if (FLAG_loop_invariant_code_motion) { |
| 974 flow_graph->RenameUsesDominatedByRedefinitions(); | 980 flow_graph->RenameUsesDominatedByRedefinitions(); |
| 975 DEBUG_ASSERT(flow_graph->VerifyRedefinitions()); | 981 DEBUG_ASSERT(flow_graph->VerifyRedefinitions()); |
| 976 LICM licm(flow_graph); | 982 LICM licm(flow_graph); |
| 977 licm.Optimize(); | 983 licm.Optimize(); |
| 978 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 984 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 979 } | 985 } |
| 980 flow_graph->RemoveRedefinitions(); | 986 flow_graph->RemoveRedefinitions(); |
| 987 SafepointOperationScope safepoint_scope(thread()); | |
| 981 } | 988 } |
| 982 | 989 |
| 983 // Optimize (a << b) & c patterns, merge operations. | 990 // Optimize (a << b) & c patterns, merge operations. |
| 984 // Run after CSE in order to have more opportunity to merge | 991 // Run after CSE in order to have more opportunity to merge |
| 985 // instructions that have same inputs. | 992 // instructions that have same inputs. |
| 986 flow_graph->TryOptimizePatterns(); | 993 flow_graph->TryOptimizePatterns(); |
| 987 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 994 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 988 | 995 |
| 989 { | 996 { |
| 990 NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline, | 997 NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1050 // Attempt to sink allocations of temporary non-escaping objects to | 1057 // Attempt to sink allocations of temporary non-escaping objects to |
| 1051 // the deoptimization path. | 1058 // the deoptimization path. |
| 1052 AllocationSinking* sinking = NULL; | 1059 AllocationSinking* sinking = NULL; |
| 1053 if (FLAG_allocation_sinking && | 1060 if (FLAG_allocation_sinking && |
| 1054 (flow_graph->graph_entry()->SuccessorCount() == 1)) { | 1061 (flow_graph->graph_entry()->SuccessorCount() == 1)) { |
| 1055 NOT_IN_PRODUCT(TimelineDurationScope tds2( | 1062 NOT_IN_PRODUCT(TimelineDurationScope tds2( |
| 1056 thread(), compiler_timeline, "AllocationSinking::Optimize")); | 1063 thread(), compiler_timeline, "AllocationSinking::Optimize")); |
| 1057 // TODO(fschneider): Support allocation sinking with try-catch. | 1064 // TODO(fschneider): Support allocation sinking with try-catch. |
| 1058 sinking = new AllocationSinking(flow_graph); | 1065 sinking = new AllocationSinking(flow_graph); |
| 1059 sinking->Optimize(); | 1066 sinking->Optimize(); |
| 1067 SafepointOperationScope safepoint_scope(thread()); | |
| 1060 } | 1068 } |
| 1061 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 1069 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 1062 | 1070 |
| 1063 DeadCodeElimination::EliminateDeadPhis(flow_graph); | 1071 DeadCodeElimination::EliminateDeadPhis(flow_graph); |
| 1064 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 1072 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 1065 | 1073 |
| 1066 FlowGraphTypePropagator::Propagate(flow_graph); | 1074 FlowGraphTypePropagator::Propagate(flow_graph); |
| 1067 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 1075 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 1068 | 1076 |
| 1069 { | 1077 { |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1099 // to be later used by the inliner. | 1107 // to be later used by the inliner. |
| 1100 FlowGraphInliner::CollectGraphInfo(flow_graph, true); | 1108 FlowGraphInliner::CollectGraphInfo(flow_graph, true); |
| 1101 | 1109 |
| 1102 flow_graph->RemoveRedefinitions(); | 1110 flow_graph->RemoveRedefinitions(); |
| 1103 { | 1111 { |
| 1104 NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline, | 1112 NOT_IN_PRODUCT(TimelineDurationScope tds2(thread(), compiler_timeline, |
| 1105 "AllocateRegisters")); | 1113 "AllocateRegisters")); |
| 1106 // Perform register allocation on the SSA graph. | 1114 // Perform register allocation on the SSA graph. |
| 1107 FlowGraphAllocator allocator(*flow_graph); | 1115 FlowGraphAllocator allocator(*flow_graph); |
| 1108 allocator.AllocateRegisters(); | 1116 allocator.AllocateRegisters(); |
| 1117 SafepointOperationScope safepoint_scope(thread()); | |
| 1109 } | 1118 } |
| 1110 | 1119 |
| 1111 if (reorder_blocks) { | 1120 if (reorder_blocks) { |
| 1112 NOT_IN_PRODUCT(TimelineDurationScope tds( | 1121 NOT_IN_PRODUCT(TimelineDurationScope tds( |
| 1113 thread(), compiler_timeline, "BlockScheduler::ReorderBlocks")); | 1122 thread(), compiler_timeline, "BlockScheduler::ReorderBlocks")); |
| 1114 block_scheduler.ReorderBlocks(); | 1123 block_scheduler.ReorderBlocks(); |
| 1115 } | 1124 } |
| 1116 | 1125 |
| 1117 if (print_flow_graph) { | 1126 if (print_flow_graph) { |
| 1118 FlowGraphPrinter::PrintGraph("After Optimizations", flow_graph); | 1127 FlowGraphPrinter::PrintGraph("After Optimizations", flow_graph); |
| (...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2297 | 2306 |
| 2298 | 2307 |
| 2299 bool BackgroundCompiler::IsDisabled() { | 2308 bool BackgroundCompiler::IsDisabled() { |
| 2300 UNREACHABLE(); | 2309 UNREACHABLE(); |
| 2301 return true; | 2310 return true; |
| 2302 } | 2311 } |
| 2303 | 2312 |
| 2304 #endif // DART_PRECOMPILED_RUNTIME | 2313 #endif // DART_PRECOMPILED_RUNTIME |
| 2305 | 2314 |
| 2306 } // namespace dart | 2315 } // namespace dart |
| OLD | NEW |