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

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

Issue 14740005: Initial support for polymorphic inlining. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 7 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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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_builder.h" 5 #include "vm/flow_graph_builder.h"
6 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "vm/ast_printer.h" 8 #include "vm/ast_printer.h"
9 #include "vm/code_descriptors.h" 9 #include "vm/code_descriptors.h"
10 #include "vm/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 } 89 }
90 } 90 }
91 91
92 92
93 void InlineExitCollector::AddExit(ReturnInstr* exit) { 93 void InlineExitCollector::AddExit(ReturnInstr* exit) {
94 Data data = { NULL, exit }; 94 Data data = { NULL, exit };
95 exits_.Add(data); 95 exits_.Add(data);
96 } 96 }
97 97
98 98
99 void InlineExitCollector::Union(const InlineExitCollector* other) {
100 // It doesn't make sense to combine different calls or calls from
101 // different graphs.
102 ASSERT(caller_graph_ == other->caller_graph_);
103 ASSERT(call_ == other->call_);
104 exits_.AddArray(other->exits_);
105 }
106
107
99 int InlineExitCollector::LowestBlockIdFirst(const Data* a, const Data* b) { 108 int InlineExitCollector::LowestBlockIdFirst(const Data* a, const Data* b) {
100 return (a->exit_block->block_id() - b->exit_block->block_id()); 109 return (a->exit_block->block_id() - b->exit_block->block_id());
101 } 110 }
102 111
103 112
104 void InlineExitCollector::SortExits() { 113 void InlineExitCollector::SortExits() {
105 // Assign block entries here because we did not necessarily know them when 114 // Assign block entries here because we did not necessarily know them when
106 // the return exit was added to the array. 115 // the return exit was added to the array.
107 for (int i = 0; i < exits_.length(); ++i) { 116 for (int i = 0; i < exits_.length(); ++i) {
108 exits_[i].exit_block = exits_[i].exit_return->GetBlock(); 117 exits_[i].exit_block = exits_[i].exit_return->GetBlock();
(...skipping 16 matching lines...) Expand all
125 ReturnAt(0)->UnuseAllInputs(); 134 ReturnAt(0)->UnuseAllInputs();
126 *exit_block = ExitBlockAt(0); 135 *exit_block = ExitBlockAt(0);
127 *last_instruction = LastInstructionAt(0); 136 *last_instruction = LastInstructionAt(0);
128 return call_->HasUses() ? ValueAt(0)->definition() : NULL; 137 return call_->HasUses() ? ValueAt(0)->definition() : NULL;
129 } else { 138 } else {
130 // Create a join of the returns. 139 // Create a join of the returns.
131 intptr_t join_id = caller_graph_->max_block_id() + 1; 140 intptr_t join_id = caller_graph_->max_block_id() + 1;
132 caller_graph_->set_max_block_id(join_id); 141 caller_graph_->set_max_block_id(join_id);
133 JoinEntryInstr* join = 142 JoinEntryInstr* join =
134 new JoinEntryInstr(join_id, CatchClauseNode::kInvalidTryIndex); 143 new JoinEntryInstr(join_id, CatchClauseNode::kInvalidTryIndex);
135 join->InheritDeoptTarget(call_); 144 join->InheritDeoptTargetAfter(call_);
136 145
137 // The dominator set of the join is the intersection of the dominator 146 // The dominator set of the join is the intersection of the dominator
138 // sets of all the predecessors. If we keep the dominator sets ordered 147 // sets of all the predecessors. If we keep the dominator sets ordered
139 // by height in the dominator tree, we can also get the immediate 148 // by height in the dominator tree, we can also get the immediate
140 // dominator of the join node from the intersection. 149 // dominator of the join node from the intersection.
141 // 150 //
142 // block_dominators is the dominator set for each block, ordered from 151 // block_dominators is the dominator set for each block, ordered from
143 // the immediate dominator to the root of the dominator tree. This is 152 // the immediate dominator to the root of the dominator tree. This is
144 // the order we collect them in (adding at the end). 153 // the order we collect them in (adding at the end).
145 // 154 //
(...skipping 26 matching lines...) Expand all
172 } 181 }
173 } else { 182 } else {
174 // Intersect the block's dominators with the join's dominators so far. 183 // Intersect the block's dominators with the join's dominators so far.
175 intptr_t last = block_dominators.length() - 1; 184 intptr_t last = block_dominators.length() - 1;
176 for (intptr_t j = 0; j < join_dominators.length(); ++j) { 185 for (intptr_t j = 0; j < join_dominators.length(); ++j) {
177 intptr_t k = last - j; // Corresponding index in block_dominators. 186 intptr_t k = last - j; // Corresponding index in block_dominators.
178 if ((k < 0) || (join_dominators[j] != block_dominators[k])) { 187 if ((k < 0) || (join_dominators[j] != block_dominators[k])) {
179 // We either exhausted the dominators for this block before 188 // We either exhausted the dominators for this block before
180 // exhausting the current intersection, or else we found a block 189 // exhausting the current intersection, or else we found a block
181 // on the path from the root of the tree that is not in common. 190 // on the path from the root of the tree that is not in common.
182 ASSERT(j >= 2); 191 // I.e., there cannot be an empty set of dominators.
192 ASSERT(j > 0);
183 join_dominators.TruncateTo(j); 193 join_dominators.TruncateTo(j);
184 break; 194 break;
185 } 195 }
186 } 196 }
187 } 197 }
188 } 198 }
189 // The immediate dominator of the join is the last one in the ordered 199 // The immediate dominator of the join is the last one in the ordered
190 // intersection. 200 // intersection.
191 join->set_dominator(join_dominators.Last()); 201 join->set_dominator(join_dominators.Last());
192 join_dominators.Last()->AddDominatedBlock(join); 202 join_dominators.Last()->AddDominatedBlock(join);
(...skipping 3180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3373 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1; 3383 intptr_t len = OS::SNPrint(NULL, 0, kFormat, function_name, reason) + 1;
3374 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 3384 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
3375 OS::SNPrint(chars, len, kFormat, function_name, reason); 3385 OS::SNPrint(chars, len, kFormat, function_name, reason);
3376 const Error& error = Error::Handle( 3386 const Error& error = Error::Handle(
3377 LanguageError::New(String::Handle(String::New(chars)))); 3387 LanguageError::New(String::Handle(String::New(chars))));
3378 Isolate::Current()->long_jump_base()->Jump(1, error); 3388 Isolate::Current()->long_jump_base()->Jump(1, error);
3379 } 3389 }
3380 3390
3381 3391
3382 } // namespace dart 3392 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698