Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: runtime/vm/flow_graph_inliner.cc

Issue 227723002: VM: Implement closure calls as instance calls. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: minimal inlining tweaks Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 &inlined_info_); 466 &inlined_info_);
467 while (collected_call_sites_->HasCalls()) { 467 while (collected_call_sites_->HasCalls()) {
468 TRACE_INLINING(OS::Print(" Depth %" Pd " ----------\n", 468 TRACE_INLINING(OS::Print(" Depth %" Pd " ----------\n",
469 inlining_depth_)); 469 inlining_depth_));
470 // Swap collected and inlining arrays and clear the new collecting array. 470 // Swap collected and inlining arrays and clear the new collecting array.
471 call_sites_temp = collected_call_sites_; 471 call_sites_temp = collected_call_sites_;
472 collected_call_sites_ = inlining_call_sites_; 472 collected_call_sites_ = inlining_call_sites_;
473 inlining_call_sites_ = call_sites_temp; 473 inlining_call_sites_ = call_sites_temp;
474 collected_call_sites_->Clear(); 474 collected_call_sites_->Clear();
475 // Inline call sites at the current depth. 475 // Inline call sites at the current depth.
476 InlineInstanceCalls();
srdjan 2014/04/09 18:28:43 Any reason for changing the order?
Florian Schneider 2014/04/10 08:49:25 The reason is that dispatchers are instance calls,
476 InlineStaticCalls(); 477 InlineStaticCalls();
477 InlineClosureCalls(); 478 InlineClosureCalls();
478 InlineInstanceCalls();
479 // Increment the inlining depth. Checked before recursive inlining. 479 // Increment the inlining depth. Checked before recursive inlining.
480 ++inlining_depth_; 480 ++inlining_depth_;
481 } 481 }
482 collected_call_sites_ = NULL; 482 collected_call_sites_ = NULL;
483 inlining_call_sites_ = NULL; 483 inlining_call_sites_ = NULL;
484 } 484 }
485 485
486 bool inlined() const { return inlined_; } 486 bool inlined() const { return inlined_; }
487 487
488 double GrowthFactor() const { 488 double GrowthFactor() const {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 call_site_count, 705 call_site_count,
706 constants_count)); 706 constants_count));
707 if (FLAG_print_inlining_tree) { 707 if (FLAG_print_inlining_tree) {
708 inlined_info_.Add(InlinedInfo( 708 inlined_info_.Add(InlinedInfo(
709 &call_data->caller, &function, inlining_depth_, call_data->call, 709 &call_data->caller, &function, inlining_depth_, call_data->call,
710 "Heuristic fail")); 710 "Heuristic fail"));
711 } 711 }
712 return false; 712 return false;
713 } 713 }
714 714
715 collected_call_sites_->FindCallSites(callee_graph, 715 if (function.IsInvokeFieldDispatcher() ||
716 inlining_depth_, 716 function.IsNoSuchMethodDispatcher()) {
717 &inlined_info_); 717 // Append call sites to the currently processed list so that dispatcher
718 // methods get inlined regardless of the current depth.
719 inlining_call_sites_->FindCallSites(callee_graph,
720 0,
721 &inlined_info_);
722 } else {
723 collected_call_sites_->FindCallSites(callee_graph,
724 inlining_depth_,
725 &inlined_info_);
726 }
718 727
719 // Add the function to the cache. 728 // Add the function to the cache.
720 if (!in_cache) { 729 if (!in_cache) {
721 function_cache_.Add(parsed_function); 730 function_cache_.Add(parsed_function);
722 } 731 }
723 732
724 // Build succeeded so we restore the bailout jump. 733 // Build succeeded so we restore the bailout jump.
725 inlined_ = true; 734 inlined_ = true;
726 inlined_size_ += size; 735 inlined_size_ += size;
727 isolate->set_deopt_id(prev_deopt_id); 736 isolate->set_deopt_id(prev_deopt_id);
(...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after
1648 OS::Print("After Inlining of %s\n", flow_graph_-> 1657 OS::Print("After Inlining of %s\n", flow_graph_->
1649 parsed_function().function().ToFullyQualifiedCString()); 1658 parsed_function().function().ToFullyQualifiedCString());
1650 FlowGraphPrinter printer(*flow_graph_); 1659 FlowGraphPrinter printer(*flow_graph_);
1651 printer.PrintBlocks(); 1660 printer.PrintBlocks();
1652 } 1661 }
1653 } 1662 }
1654 } 1663 }
1655 } 1664 }
1656 1665
1657 } // namespace dart 1666 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698