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 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
490 | 490 |
491 FlowGraph* caller_graph() const { return caller_graph_; } | 491 FlowGraph* caller_graph() const { return caller_graph_; } |
492 | 492 |
493 Isolate* isolate() const { return caller_graph_->isolate(); } | 493 Isolate* isolate() const { return caller_graph_->isolate(); } |
494 | 494 |
495 // Inlining heuristics based on Cooper et al. 2008. | 495 // Inlining heuristics based on Cooper et al. 2008. |
496 bool ShouldWeInline(const Function& callee, | 496 bool ShouldWeInline(const Function& callee, |
497 intptr_t instr_count, | 497 intptr_t instr_count, |
498 intptr_t call_site_count, | 498 intptr_t call_site_count, |
499 intptr_t const_arg_count) { | 499 intptr_t const_arg_count) { |
| 500 if (FlowGraphInliner::AlwaysInline(callee)) { |
| 501 return true; |
| 502 } |
500 if (inlined_size_ > FLAG_inlining_caller_size_threshold) { | 503 if (inlined_size_ > FLAG_inlining_caller_size_threshold) { |
501 // Prevent methods becoming humongous and thus slow to compile. | 504 // Prevent methods becoming humongous and thus slow to compile. |
502 return false; | 505 return false; |
503 } | 506 } |
504 if (const_arg_count > 0) { | 507 if (const_arg_count > 0) { |
505 if (instr_count > FLAG_inlining_constant_arguments_max_size_threshold) { | 508 if (instr_count > FLAG_inlining_constant_arguments_max_size_threshold) { |
506 return false; | 509 return false; |
507 } | 510 } |
508 } else if (instr_count > FLAG_inlining_callee_size_threshold) { | 511 } else if (instr_count > FLAG_inlining_callee_size_threshold) { |
509 return false; | 512 return false; |
510 } | 513 } |
511 // 'instr_count' can be 0 if it was not computed yet. | 514 // 'instr_count' can be 0 if it was not computed yet. |
512 if ((instr_count != 0) && (instr_count <= FLAG_inlining_size_threshold)) { | 515 if ((instr_count != 0) && (instr_count <= FLAG_inlining_size_threshold)) { |
513 return true; | 516 return true; |
514 } | 517 } |
515 if (call_site_count <= FLAG_inlining_callee_call_sites_threshold) { | 518 if (call_site_count <= FLAG_inlining_callee_call_sites_threshold) { |
516 return true; | 519 return true; |
517 } | 520 } |
518 if ((const_arg_count >= FLAG_inlining_constant_arguments_count) && | 521 if ((const_arg_count >= FLAG_inlining_constant_arguments_count) && |
519 (instr_count <= FLAG_inlining_constant_arguments_min_size_threshold)) { | 522 (instr_count <= FLAG_inlining_constant_arguments_min_size_threshold)) { |
520 return true; | 523 return true; |
521 } | 524 } |
522 if (FlowGraphInliner::AlwaysInline(callee)) { | |
523 return true; | |
524 } | |
525 return false; | 525 return false; |
526 } | 526 } |
527 | 527 |
528 void InlineCalls() { | 528 void InlineCalls() { |
529 // If inlining depth is less then one abort. | 529 // If inlining depth is less then one abort. |
530 if (FLAG_inlining_depth_threshold < 1) return; | 530 if (FLAG_inlining_depth_threshold < 1) return; |
531 if (caller_graph_->parsed_function()->function().deoptimization_counter() >= | 531 if (caller_graph_->parsed_function()->function().deoptimization_counter() >= |
532 FLAG_deoptimization_counter_inlining_threshold) { | 532 FLAG_deoptimization_counter_inlining_threshold) { |
533 return; | 533 return; |
534 } | 534 } |
(...skipping 1280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1815 | 1815 |
1816 | 1816 |
1817 intptr_t FlowGraphInliner::NextInlineId(const Function& function) { | 1817 intptr_t FlowGraphInliner::NextInlineId(const Function& function) { |
1818 const intptr_t id = inline_id_to_function_->length(); | 1818 const intptr_t id = inline_id_to_function_->length(); |
1819 inline_id_to_function_->Add(&function); | 1819 inline_id_to_function_->Add(&function); |
1820 return id; | 1820 return id; |
1821 } | 1821 } |
1822 | 1822 |
1823 | 1823 |
1824 } // namespace dart | 1824 } // namespace dart |
OLD | NEW |