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

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

Issue 71703002: Introduce a nesting stack to the flow graph builder. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 1 month 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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 static bool IsCallRecursive(const Function& function, Definition* call) { 62 static bool IsCallRecursive(const Function& function, Definition* call) {
63 Environment* env = call->env(); 63 Environment* env = call->env();
64 while (env != NULL) { 64 while (env != NULL) {
65 if (function.raw() == env->function().raw()) return true; 65 if (function.raw() == env->function().raw()) return true;
66 env = env->outer(); 66 env = env->outer();
67 } 67 }
68 return false; 68 return false;
69 } 69 }
70 70
71 71
72 // TODO(zerny): Remove the ChildrenVisitor and SourceLabelResetter once we have
73 // moved the label/join map for control flow out of the AST and into the flow
74 // graph builder.
75
76 // Default visitor to traverse child nodes.
77 class ChildrenVisitor : public AstNodeVisitor {
78 public:
79 ChildrenVisitor() { }
80 #define DEFINE_VISIT(BaseName) \
81 virtual void Visit##BaseName##Node(BaseName##Node* node) { \
82 node->VisitChildren(this); \
83 }
84
85 FOR_EACH_NODE(DEFINE_VISIT);
86 #undef DEFINE_VISIT
87 };
88
89
90 // Visitor to clear each AST node containing source labels.
91 class SourceLabelResetter : public ChildrenVisitor {
92 public:
93 SourceLabelResetter() { }
94 virtual void VisitSequenceNode(SequenceNode* node) {
95 Reset(node, node->label());
96 }
97 virtual void VisitCaseNode(CaseNode* node) {
98 Reset(node, node->label());
99 }
100 virtual void VisitSwitchNode(SwitchNode* node) {
101 Reset(node, node->label());
102 }
103 virtual void VisitWhileNode(WhileNode* node) {
104 Reset(node, node->label());
105 }
106 virtual void VisitDoWhileNode(DoWhileNode* node) {
107 Reset(node, node->label());
108 }
109 virtual void VisitForNode(ForNode* node) {
110 Reset(node, node->label());
111 }
112 virtual void VisitJumpNode(JumpNode* node) {
113 Reset(node, node->label());
114 }
115 void Reset(AstNode* node, SourceLabel* lbl) {
116 node->VisitChildren(this);
117 if (lbl == NULL) return;
118 lbl->join_for_break_ = NULL;
119 lbl->join_for_continue_ = NULL;
120 }
121 };
122
123
124 // Helper to create a parameter stub from an actual argument. 72 // Helper to create a parameter stub from an actual argument.
125 static Definition* CreateParameterStub(intptr_t i, 73 static Definition* CreateParameterStub(intptr_t i,
126 Value* argument, 74 Value* argument,
127 FlowGraph* graph) { 75 FlowGraph* graph) {
128 ConstantInstr* constant = argument->definition()->AsConstant(); 76 ConstantInstr* constant = argument->definition()->AsConstant();
129 if (constant != NULL) { 77 if (constant != NULL) {
130 return new ConstantInstr(constant->value()); 78 return new ConstantInstr(constant->value());
131 } else { 79 } else {
132 return new ParameterInstr(i, graph->graph_entry()); 80 return new ParameterInstr(i, graph->graph_entry());
133 } 81 }
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 return count; 728 return count;
781 } 729 }
782 730
783 // Parse a function reusing the cache if possible. 731 // Parse a function reusing the cache if possible.
784 ParsedFunction* GetParsedFunction(const Function& function, bool* in_cache) { 732 ParsedFunction* GetParsedFunction(const Function& function, bool* in_cache) {
785 // TODO(zerny): Use a hash map for the cache. 733 // TODO(zerny): Use a hash map for the cache.
786 for (intptr_t i = 0; i < function_cache_.length(); ++i) { 734 for (intptr_t i = 0; i < function_cache_.length(); ++i) {
787 ParsedFunction* parsed_function = function_cache_[i]; 735 ParsedFunction* parsed_function = function_cache_[i];
788 if (parsed_function->function().raw() == function.raw()) { 736 if (parsed_function->function().raw() == function.raw()) {
789 *in_cache = true; 737 *in_cache = true;
790 SourceLabelResetter reset;
791 parsed_function->node_sequence()->Visit(&reset);
792 return parsed_function; 738 return parsed_function;
793 } 739 }
794 } 740 }
795 *in_cache = false; 741 *in_cache = false;
796 ParsedFunction* parsed_function = new ParsedFunction(function); 742 ParsedFunction* parsed_function = new ParsedFunction(function);
797 Parser::ParseFunction(parsed_function); 743 Parser::ParseFunction(parsed_function);
798 parsed_function->AllocateVariables(); 744 parsed_function->AllocateVariables();
799 return parsed_function; 745 return parsed_function;
800 } 746 }
801 747
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after
1522 OS::Print("After Inlining of %s\n", flow_graph_-> 1468 OS::Print("After Inlining of %s\n", flow_graph_->
1523 parsed_function().function().ToFullyQualifiedCString()); 1469 parsed_function().function().ToFullyQualifiedCString());
1524 FlowGraphPrinter printer(*flow_graph_); 1470 FlowGraphPrinter printer(*flow_graph_);
1525 printer.PrintBlocks(); 1471 printer.PrintBlocks();
1526 } 1472 }
1527 } 1473 }
1528 } 1474 }
1529 } 1475 }
1530 1476
1531 } // namespace dart 1477 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698