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

Unified 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: Incorporated review comments. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_compiler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_builder.cc
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index e341f285e050654b18667cf898b71441b1b835b6..85ed2104b637f6ce192679c9f7b0fe041f821c8e 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -97,6 +97,15 @@ void InlineExitCollector::AddExit(ReturnInstr* exit) {
}
+void InlineExitCollector::Union(const InlineExitCollector* other) {
+ // It doesn't make sense to combine different calls or calls from
+ // different graphs.
+ ASSERT(caller_graph_ == other->caller_graph_);
+ ASSERT(call_ == other->call_);
+ exits_.AddArray(other->exits_);
+}
+
+
int InlineExitCollector::LowestBlockIdFirst(const Data* a, const Data* b) {
return (a->exit_block->block_id() - b->exit_block->block_id());
}
@@ -133,7 +142,7 @@ Definition* InlineExitCollector::JoinReturns(BlockEntryInstr** exit_block,
caller_graph_->set_max_block_id(join_id);
JoinEntryInstr* join =
new JoinEntryInstr(join_id, CatchClauseNode::kInvalidTryIndex);
- join->InheritDeoptTarget(call_);
+ join->InheritDeoptTargetAfter(call_);
// The dominator set of the join is the intersection of the dominator
// sets of all the predecessors. If we keep the dominator sets ordered
@@ -180,7 +189,8 @@ Definition* InlineExitCollector::JoinReturns(BlockEntryInstr** exit_block,
// We either exhausted the dominators for this block before
// exhausting the current intersection, or else we found a block
// on the path from the root of the tree that is not in common.
- ASSERT(j >= 2);
+ // I.e., there cannot be an empty set of dominators.
+ ASSERT(j > 0);
join_dominators.TruncateTo(j);
break;
}
@@ -189,7 +199,6 @@ Definition* InlineExitCollector::JoinReturns(BlockEntryInstr** exit_block,
}
// The immediate dominator of the join is the last one in the ordered
// intersection.
- join->set_dominator(join_dominators.Last());
join_dominators.Last()->AddDominatedBlock(join);
*exit_block = join;
*last_instruction = join;
@@ -273,7 +282,6 @@ void InlineExitCollector::ReplaceCall(TargetEntryInstr* callee_entry) {
ASSERT(callee_exit->dominated_blocks().is_empty());
for (intptr_t i = 0; i < call_block->dominated_blocks().length(); ++i) {
BlockEntryInstr* block = call_block->dominated_blocks()[i];
- block->set_dominator(callee_exit);
callee_exit->AddDominatedBlock(block);
}
// The call block is now the immediate dominator of blocks whose
@@ -281,7 +289,6 @@ void InlineExitCollector::ReplaceCall(TargetEntryInstr* callee_entry) {
call_block->ClearDominatedBlocks();
for (intptr_t i = 0; i < callee_entry->dominated_blocks().length(); ++i) {
BlockEntryInstr* block = callee_entry->dominated_blocks()[i];
- block->set_dominator(call_block);
call_block->AddDominatedBlock(block);
}
}
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_compiler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698