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/block_scheduler.h" | 7 #include "vm/block_scheduler.h" |
8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
9 #include "vm/flags.h" | 9 #include "vm/flags.h" |
10 #include "vm/flow_graph.h" | 10 #include "vm/flow_graph.h" |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 #define PRINT_INLINING_TREE(comment, caller, target, instance_call) \ | 75 #define PRINT_INLINING_TREE(comment, caller, target, instance_call) \ |
76 do { \ | 76 do { \ |
77 if (FLAG_print_inlining_tree) { \ | 77 if (FLAG_print_inlining_tree) { \ |
78 inlined_info_.Add(InlinedInfo( \ | 78 inlined_info_.Add(InlinedInfo( \ |
79 caller, target, inlining_depth_, instance_call, comment)); \ | 79 caller, target, inlining_depth_, instance_call, comment)); \ |
80 } \ | 80 } \ |
81 } while (false) \ | 81 } while (false) \ |
82 | 82 |
83 | 83 |
84 // Test if a call is recursive by looking in the deoptimization environment. | 84 // Test if a call is recursive by looking in the deoptimization environment. |
85 static bool IsCallRecursive(const Code& code, Definition* call) { | 85 static bool IsCallRecursive(const Function& function, Definition* call) { |
86 Environment* env = call->env(); | 86 Environment* env = call->env(); |
87 while (env != NULL) { | 87 while (env != NULL) { |
88 if (code.raw() == env->code().raw()) { | 88 if (function.raw() == env->function().raw()) { |
89 return true; | 89 return true; |
90 } | 90 } |
91 env = env->outer(); | 91 env = env->outer(); |
92 } | 92 } |
93 return false; | 93 return false; |
94 } | 94 } |
95 | 95 |
96 | 96 |
97 // Helper to get the default value of a formal parameter. | 97 // Helper to get the default value of a formal parameter. |
98 static ConstantInstr* GetDefaultValue(intptr_t i, | 98 static ConstantInstr* GetDefaultValue(intptr_t i, |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 function.optimized_call_site_count(), | 660 function.optimized_call_site_count(), |
661 constant_arguments)); | 661 constant_arguments)); |
662 PRINT_INLINING_TREE("Early heuristic", | 662 PRINT_INLINING_TREE("Early heuristic", |
663 &call_data->caller, &function, call_data->call); | 663 &call_data->caller, &function, call_data->call); |
664 return false; | 664 return false; |
665 } | 665 } |
666 | 666 |
667 // Abort if this is a recursive occurrence. | 667 // Abort if this is a recursive occurrence. |
668 Definition* call = call_data->call; | 668 Definition* call = call_data->call; |
669 // Added 'volatile' works around a possible GCC 4.9 compiler bug. | 669 // Added 'volatile' works around a possible GCC 4.9 compiler bug. |
670 volatile bool is_recursive_call = IsCallRecursive(unoptimized_code, call); | 670 volatile bool is_recursive_call = IsCallRecursive(function, call); |
671 if (is_recursive_call && | 671 if (is_recursive_call && |
672 inlining_recursion_depth_ >= FLAG_inlining_recursion_depth_threshold) { | 672 inlining_recursion_depth_ >= FLAG_inlining_recursion_depth_threshold) { |
673 TRACE_INLINING(ISL_Print(" Bailout: recursive function\n")); | 673 TRACE_INLINING(ISL_Print(" Bailout: recursive function\n")); |
674 PRINT_INLINING_TREE("Recursive function", | 674 PRINT_INLINING_TREE("Recursive function", |
675 &call_data->caller, &function, call_data->call); | 675 &call_data->caller, &function, call_data->call); |
676 return false; | 676 return false; |
677 } | 677 } |
678 | 678 |
679 // Save and clear deopt id. | 679 // Save and clear deopt id. |
680 const intptr_t prev_deopt_id = isolate()->deopt_id(); | 680 const intptr_t prev_deopt_id = isolate()->deopt_id(); |
(...skipping 1210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1891 intptr_t FlowGraphInliner::NextInlineId(const Function& function, | 1891 intptr_t FlowGraphInliner::NextInlineId(const Function& function, |
1892 intptr_t parent_id) { | 1892 intptr_t parent_id) { |
1893 const intptr_t id = inline_id_to_function_->length(); | 1893 const intptr_t id = inline_id_to_function_->length(); |
1894 inline_id_to_function_->Add(&function); | 1894 inline_id_to_function_->Add(&function); |
1895 caller_inline_id_->Add(parent_id); | 1895 caller_inline_id_->Add(parent_id); |
1896 return id; | 1896 return id; |
1897 } | 1897 } |
1898 | 1898 |
1899 | 1899 |
1900 } // namespace dart | 1900 } // namespace dart |
OLD | NEW |