| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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/precompiler.h" | 5 #include "vm/precompiler.h" |
| 6 | 6 |
| 7 #include "vm/aot_optimizer.h" |
| 7 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 8 #include "vm/ast_printer.h" | 9 #include "vm/ast_printer.h" |
| 9 #include "vm/branch_optimizer.h" | 10 #include "vm/branch_optimizer.h" |
| 10 #include "vm/cha.h" | 11 #include "vm/cha.h" |
| 11 #include "vm/code_generator.h" | 12 #include "vm/code_generator.h" |
| 12 #include "vm/code_patcher.h" | 13 #include "vm/code_patcher.h" |
| 13 #include "vm/compiler.h" | 14 #include "vm/compiler.h" |
| 14 #include "vm/constant_propagator.h" | 15 #include "vm/constant_propagator.h" |
| 15 #include "vm/dart_entry.h" | 16 #include "vm/dart_entry.h" |
| 16 #include "vm/disassembler.h" | 17 #include "vm/disassembler.h" |
| 17 #include "vm/exceptions.h" | 18 #include "vm/exceptions.h" |
| 18 #include "vm/flags.h" | 19 #include "vm/flags.h" |
| 19 #include "vm/flow_graph.h" | 20 #include "vm/flow_graph.h" |
| 20 #include "vm/flow_graph_allocator.h" | 21 #include "vm/flow_graph_allocator.h" |
| 21 #include "vm/flow_graph_builder.h" | 22 #include "vm/flow_graph_builder.h" |
| 22 #include "vm/flow_graph_compiler.h" | 23 #include "vm/flow_graph_compiler.h" |
| 23 #include "vm/flow_graph_inliner.h" | 24 #include "vm/flow_graph_inliner.h" |
| 24 #include "vm/flow_graph_optimizer.h" | |
| 25 #include "vm/flow_graph_range_analysis.h" | 25 #include "vm/flow_graph_range_analysis.h" |
| 26 #include "vm/flow_graph_type_propagator.h" | 26 #include "vm/flow_graph_type_propagator.h" |
| 27 #include "vm/hash_table.h" | 27 #include "vm/hash_table.h" |
| 28 #include "vm/il_printer.h" | 28 #include "vm/il_printer.h" |
| 29 #include "vm/isolate.h" | 29 #include "vm/isolate.h" |
| 30 #include "vm/log.h" | 30 #include "vm/log.h" |
| 31 #include "vm/longjump.h" | 31 #include "vm/longjump.h" |
| 32 #include "vm/object.h" | 32 #include "vm/object.h" |
| 33 #include "vm/object_store.h" | 33 #include "vm/object_store.h" |
| 34 #include "vm/os.h" | 34 #include "vm/os.h" |
| (...skipping 933 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 return String::Cast(obj).Hash(); | 968 return String::Cast(obj).Hash(); |
| 969 } | 969 } |
| 970 static RawObject* NewKey(const String& str) { | 970 static RawObject* NewKey(const String& str) { |
| 971 return str.raw(); | 971 return str.raw(); |
| 972 } | 972 } |
| 973 }; | 973 }; |
| 974 | 974 |
| 975 typedef UnorderedHashMap<NameFunctionsTraits> Table; | 975 typedef UnorderedHashMap<NameFunctionsTraits> Table; |
| 976 | 976 |
| 977 | 977 |
| 978 class FunctionsTraits { | |
| 979 public: | |
| 980 static bool IsMatch(const Object& a, const Object& b) { | |
| 981 Zone* zone = Thread::Current()->zone(); | |
| 982 String& a_s = String::Handle(zone); | |
| 983 String& b_s = String::Handle(zone); | |
| 984 a_s = a.IsFunction() ? Function::Cast(a).name() : String::Cast(a).raw(); | |
| 985 b_s = b.IsFunction() ? Function::Cast(b).name() : String::Cast(b).raw(); | |
| 986 ASSERT(a_s.IsSymbol() && b_s.IsSymbol()); | |
| 987 return a_s.raw() == b_s.raw(); | |
| 988 } | |
| 989 static uword Hash(const Object& obj) { | |
| 990 if (obj.IsFunction()) { | |
| 991 return String::Handle(Function::Cast(obj).name()).Hash(); | |
| 992 } else { | |
| 993 ASSERT(String::Cast(obj).IsSymbol()); | |
| 994 return String::Cast(obj).Hash(); | |
| 995 } | |
| 996 } | |
| 997 static RawObject* NewKey(const Function& function) { | |
| 998 return function.raw(); | |
| 999 } | |
| 1000 }; | |
| 1001 | |
| 1002 typedef UnorderedHashSet<FunctionsTraits> UniqueFunctionsSet; | |
| 1003 | |
| 1004 | |
| 1005 static void AddNameToFunctionsTable(Zone* zone, | 978 static void AddNameToFunctionsTable(Zone* zone, |
| 1006 Table* table, | 979 Table* table, |
| 1007 const String& fname, | 980 const String& fname, |
| 1008 const Function& function) { | 981 const Function& function) { |
| 1009 Array& farray = Array::Handle(zone); | 982 Array& farray = Array::Handle(zone); |
| 1010 farray ^= table->InsertNewOrGetValue(fname, Array::empty_array()); | 983 farray ^= table->InsertNewOrGetValue(fname, Array::empty_array()); |
| 1011 farray = Array::Grow(farray, farray.Length() + 1); | 984 farray = Array::Grow(farray, farray.Length() + 1); |
| 1012 farray.SetAt(farray.Length() - 1, function); | 985 farray.SetAt(farray.Length() - 1, function); |
| 1013 table->UpdateValue(fname, farray); | 986 table->UpdateValue(fname, farray); |
| 1014 } | 987 } |
| (...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1706 #ifndef PRODUCT | 1679 #ifndef PRODUCT |
| 1707 TimelineDurationScope tds(thread(), | 1680 TimelineDurationScope tds(thread(), |
| 1708 compiler_timeline, | 1681 compiler_timeline, |
| 1709 "OptimizationPasses"); | 1682 "OptimizationPasses"); |
| 1710 #endif // !PRODUCT | 1683 #endif // !PRODUCT |
| 1711 inline_id_to_function.Add(&function); | 1684 inline_id_to_function.Add(&function); |
| 1712 // Top scope function has no caller (-1). | 1685 // Top scope function has no caller (-1). |
| 1713 caller_inline_id.Add(-1); | 1686 caller_inline_id.Add(-1); |
| 1714 CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer); | 1687 CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer); |
| 1715 | 1688 |
| 1716 FlowGraphOptimizer optimizer(flow_graph, | 1689 AotOptimizer optimizer(flow_graph, |
| 1717 use_speculative_inlining, | 1690 use_speculative_inlining, |
| 1718 &inlining_black_list); | 1691 &inlining_black_list); |
| 1719 optimizer.PopulateWithICData(); | 1692 optimizer.PopulateWithICData(); |
| 1720 | 1693 |
| 1721 optimizer.ApplyClassIds(); | 1694 optimizer.ApplyClassIds(); |
| 1722 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 1695 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 1723 | 1696 |
| 1724 FlowGraphTypePropagator::Propagate(flow_graph); | 1697 FlowGraphTypePropagator::Propagate(flow_graph); |
| 1725 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 1698 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| 1726 | 1699 |
| 1727 optimizer.ApplyICData(); | 1700 optimizer.ApplyICData(); |
| 1728 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 1701 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2228 CompilationPipeline::New(thread->zone(), function); | 2201 CompilationPipeline::New(thread->zone(), function); |
| 2229 | 2202 |
| 2230 ASSERT(FLAG_precompilation); | 2203 ASSERT(FLAG_precompilation); |
| 2231 const bool optimized = function.IsOptimizable(); // False for natives. | 2204 const bool optimized = function.IsOptimizable(); // False for natives. |
| 2232 return PrecompileFunctionHelper(pipeline, function, optimized); | 2205 return PrecompileFunctionHelper(pipeline, function, optimized); |
| 2233 } | 2206 } |
| 2234 | 2207 |
| 2235 #endif // DART_PRECOMPILER | 2208 #endif // DART_PRECOMPILER |
| 2236 | 2209 |
| 2237 } // namespace dart | 2210 } // namespace dart |
| OLD | NEW |