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

Unified Diff: runtime/vm/flow_graph_builder.cc

Issue 10939036: A simpler scheme for garbage collection of ureachable phi inputs. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix bug when multiple predecessors are unreachable. Created 8 years, 3 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_optimizer.cc » ('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 fc88a150079323653205151581dd2235fc09921b..490ce83bf0efe8a1b57b5a81ea30c26ced271569 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -37,6 +37,7 @@ FlowGraphBuilder::FlowGraphBuilder(const ParsedFunction& parsed_function)
? parsed_function.function().num_fixed_parameters()
: 0),
num_stack_locals_(parsed_function.num_stack_locals()),
+ last_used_block_id_(0), // 0 is used for the graph entry.
context_level_(0),
last_used_try_index_(CatchClauseNode::kInvalidTryIndex),
try_index_(CatchClauseNode::kInvalidTryIndex),
@@ -160,7 +161,8 @@ void EffectGraphVisitor::Join(const TestGraphVisitor& test_fragment,
exit_ = true_exit;
temp_index_ = true_fragment.temp_index();
} else {
- JoinEntryInstr* join = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* join =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
true_exit->Goto(join);
false_exit->Goto(join);
exit_ = join;
@@ -188,7 +190,8 @@ void EffectGraphVisitor::TieLoop(const TestGraphVisitor& test_fragment,
if (body_exit == NULL) {
Append(test_fragment);
} else {
- JoinEntryInstr* join = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* join =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
join->set_next(test_fragment.entry());
Goto(join);
body_exit->Goto(join);
@@ -299,7 +302,8 @@ void TestGraphVisitor::ConnectBranchesTo(
JoinEntryInstr* join) const {
ASSERT(!branches.is_empty());
for (intptr_t i = 0; i < branches.length(); i++) {
- TargetEntryInstr* target = new TargetEntryInstr(owner()->try_index());
+ TargetEntryInstr* target =
+ new TargetEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
*(branches[i]) = target;
target->Goto(join);
}
@@ -321,12 +325,14 @@ BlockEntryInstr* TestGraphVisitor::CreateSuccessorFor(
ASSERT(!branches.is_empty());
if (branches.length() == 1) {
- TargetEntryInstr* target = new TargetEntryInstr(owner()->try_index());
+ TargetEntryInstr* target =
+ new TargetEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
*(branches[0]) = target;
return target;
}
- JoinEntryInstr* join = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* join =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
ConnectBranchesTo(branches, join);
return join;
}
@@ -1097,11 +1103,13 @@ void EffectGraphVisitor::VisitCaseNode(CaseNode* node) {
// allocate JoinNode here and use it as statement start.
statement_start = node->label()->join_for_continue();
if (statement_start == NULL) {
- statement_start = new JoinEntryInstr(owner()->try_index());
+ statement_start =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
node->label()->set_join_for_continue(statement_start);
}
} else {
- statement_start = new JoinEntryInstr(owner()->try_index());
+ statement_start =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
}
node->statements()->Visit(&for_case_statements);
Instruction* statement_exit =
@@ -1147,7 +1155,8 @@ void EffectGraphVisitor::VisitCaseNode(CaseNode* node) {
exit_instruction = statement_exit;
} else {
if (statement_exit != NULL) {
- JoinEntryInstr* join = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* join = new JoinEntryInstr(owner()->AllocateBlockId(),
+ owner()->try_index());
statement_exit->Goto(join);
next_target->Goto(join);
exit_instruction = join;
@@ -1231,13 +1240,17 @@ void EffectGraphVisitor::VisitDoWhileNode(DoWhileNode* node) {
ASSERT(is_open());
// Tie do-while loop (test is after the body).
- JoinEntryInstr* body_entry_join = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* body_entry_join =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
Goto(body_entry_join);
Instruction* body_exit = AppendFragment(body_entry_join, for_body);
JoinEntryInstr* join = node->label()->join_for_continue();
if ((body_exit != NULL) || (join != NULL)) {
- if (join == NULL) join = new JoinEntryInstr(owner()->try_index());
+ if (join == NULL) {
+ join =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
+ }
join->set_next(for_test.entry());
if (body_exit != NULL) {
body_exit->Goto(join);
@@ -1304,7 +1317,8 @@ void EffectGraphVisitor::VisitForNode(ForNode* node) {
// 'loop_increment_end' is NULL only if there is no join for continue and the
// body is not open, i.e., no backward branch exists.
if (loop_increment_end != NULL) {
- JoinEntryInstr* loop_start = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* loop_start =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
Goto(loop_start);
loop_increment_end->Goto(loop_start);
exit_ = loop_start;
@@ -1312,7 +1326,8 @@ void EffectGraphVisitor::VisitForNode(ForNode* node) {
if (node->condition() == NULL) {
// Endless loop, no test.
- JoinEntryInstr* body_entry = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* body_entry =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
AppendFragment(body_entry, for_body);
Goto(body_entry);
if (node->label()->join_for_break() != NULL) {
@@ -1380,13 +1395,13 @@ void EffectGraphVisitor::VisitJumpNode(JumpNode* node) {
if (node->kind() == Token::kBREAK) {
if (node->label()->join_for_break() == NULL) {
node->label()->set_join_for_break(
- new JoinEntryInstr(owner()->try_index()));
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index()));
}
jump_target = node->label()->join_for_break();
} else {
if (node->label()->join_for_continue() == NULL) {
node->label()->set_join_for_continue(
- new JoinEntryInstr(owner()->try_index()));
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index()));
}
jump_target = node->label()->join_for_continue();
}
@@ -2473,12 +2488,14 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
node->try_block()->Visit(&for_try_block);
if (for_try_block.is_open()) {
- JoinEntryInstr* after_try = new JoinEntryInstr(old_try_index);
+ JoinEntryInstr* after_try =
+ new JoinEntryInstr(owner()->AllocateBlockId(), old_try_index);
for_try_block.Goto(after_try);
for_try_block.exit_ = after_try;
}
- JoinEntryInstr* try_entry = new JoinEntryInstr(try_index);
+ JoinEntryInstr* try_entry =
+ new JoinEntryInstr(owner()->AllocateBlockId(), try_index);
Goto(try_entry);
AppendFragment(try_entry, for_try_block);
@@ -2495,8 +2512,9 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
catch_block->set_try_index(try_index);
EffectGraphVisitor for_catch_block(owner(), temp_index());
catch_block->Visit(&for_catch_block);
- TargetEntryInstr* catch_entry = new TargetEntryInstr(old_try_index,
- try_index);
+ TargetEntryInstr* catch_entry =
+ new TargetEntryInstr(owner()->AllocateBlockId(), old_try_index);
+ catch_entry->set_catch_try_index(try_index);
zerny-google 2012/09/20 08:43:53 Why use a setter for catch_try_index? Can it chang
owner()->AddCatchEntry(catch_entry);
ASSERT(!for_catch_block.is_open());
AppendFragment(catch_entry, for_catch_block);
@@ -2566,7 +2584,8 @@ void EffectGraphVisitor::VisitInlinedFinallyNode(InlinedFinallyNode* node) {
}
BuildLoadContext(node->context_var());
- JoinEntryInstr* finally_entry = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* finally_entry =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
EffectGraphVisitor for_finally_block(owner(), temp_index());
node->finally_block()->Visit(&for_finally_block);
@@ -2575,7 +2594,8 @@ void EffectGraphVisitor::VisitInlinedFinallyNode(InlinedFinallyNode* node) {
}
if (for_finally_block.is_open()) {
- JoinEntryInstr* after_finally = new JoinEntryInstr(owner()->try_index());
+ JoinEntryInstr* after_finally =
+ new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index());
for_finally_block.Goto(after_finally);
for_finally_block.exit_ = after_finally;
}
@@ -2597,8 +2617,9 @@ FlowGraph* FlowGraphBuilder::BuildGraph(InliningContext context) {
if (InInliningContext()) exits_ = new ZoneGrowableArray<ReturnInstr*>();
// Compilation can be nested, preserve the computation-id.
const Function& function = parsed_function().function();
- TargetEntryInstr* normal_entry = new TargetEntryInstr(
- CatchClauseNode::kInvalidTryIndex);
+ TargetEntryInstr* normal_entry =
+ new TargetEntryInstr(AllocateBlockId(),
+ CatchClauseNode::kInvalidTryIndex);
graph_entry_ = new GraphEntryInstr(normal_entry);
EffectGraphVisitor for_effect(this, 0);
if (InInliningContext()) {
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_optimizer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698