Index: runtime/vm/flow_graph.cc |
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc |
index 6e721444765039cfb73fc84e061aa1ad13fd23f9..79d9ea9e38b3a8f75d212633836170ea54661297 100644 |
--- a/runtime/vm/flow_graph.cc |
+++ b/runtime/vm/flow_graph.cc |
@@ -552,16 +552,18 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
// Update expression stack. |
ASSERT(env->length() > variable_count()); |
- Definition* reaching_defn = env->Last(); |
+ Definition* input_defn = env->Last(); |
env->RemoveLast(); |
- Definition* input_defn = v->definition(); |
- if (input_defn->IsLoadLocal() || input_defn->IsStoreLocal()) { |
+ BindInstr* as_bind = v->definition()->AsBind(); |
+ if ((as_bind != NULL) && |
+ (as_bind->computation()->IsLoadLocal() || |
+ as_bind->computation()->IsStoreLocal())) { |
// Remove the load/store from the graph. |
- input_defn->RemoveFromGraph(); |
+ as_bind->RemoveFromGraph(); |
// Assert we are not referencing nulls in the initial environment. |
- ASSERT(reaching_defn->ssa_temp_index() != -1); |
- current->SetInputAt(i, new Value(reaching_defn)); |
+ ASSERT(input_defn->ssa_temp_index() != -1); |
+ current->SetInputAt(i, new Value(input_defn)); |
} |
} |
@@ -573,10 +575,10 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
// 2b. Handle LoadLocal and StoreLocal. |
// For each LoadLocal: Remove it from the graph. |
// For each StoreLocal: Remove it from the graph and update the environment. |
- Definition* definition = current->AsDefinition(); |
- if (definition != NULL) { |
- LoadLocalInstr* load = definition->AsLoadLocal(); |
- StoreLocalInstr* store = definition->AsStoreLocal(); |
+ BindInstr* bind = current->AsBind(); |
+ if (bind != NULL) { |
+ LoadLocalComp* load = bind->computation()->AsLoadLocal(); |
+ StoreLocalComp* store = bind->computation()->AsStoreLocal(); |
if ((load != NULL) || (store != NULL)) { |
intptr_t index; |
if (store != NULL) { |
@@ -586,7 +588,7 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
} else { |
// The graph construction ensures we do not have an unused LoadLocal |
// computation. |
- ASSERT(definition->is_used()); |
+ ASSERT(bind->is_used()); |
index = load->local().BitIndexIn(non_copied_parameter_count_); |
PhiInstr* phi = (*env)[index]->AsPhi(); |
@@ -596,7 +598,7 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
} |
} |
// Update expression stack or remove from graph. |
- if (definition->is_used()) { |
+ if (bind->is_used()) { |
env->Add((*env)[index]); |
// We remove load/store instructions when we find their use in 2a. |
} else { |
@@ -604,10 +606,10 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
} |
} else { |
// Not a load or store. |
- if (definition->is_used()) { |
+ if (bind->is_used()) { |
// Assign fresh SSA temporary and update expression stack. |
- definition->set_ssa_temp_index(alloc_ssa_temp_index()); |
- env->Add(definition); |
+ bind->set_ssa_temp_index(alloc_ssa_temp_index()); |
+ env->Add(bind); |
} |
} |
} |
@@ -699,7 +701,9 @@ static void Link(Instruction* prev, Instruction* next) { |
// |
// After inlining the caller graph will correctly have adjusted the pre/post |
// orders, the dominator tree and the use lists. |
-void FlowGraph::InlineCall(StaticCallInstr* call, FlowGraph* callee_graph) { |
+void FlowGraph::InlineCall(BindInstr* caller_instr, |
+ StaticCallComp* caller_comp, |
+ FlowGraph* callee_graph) { |
ASSERT(callee_graph->exits() != NULL); |
ASSERT(callee_graph->graph_entry()->SuccessorCount() == 1); |
ASSERT(callee_graph->max_virtual_register_number() > |
@@ -720,9 +724,9 @@ void FlowGraph::InlineCall(StaticCallInstr* call, FlowGraph* callee_graph) { |
// TODO(zerny): Support one exit graph containing control flow. |
ASSERT(callee_entry == GetBlockEntry(exit)); |
// For just one exit, replace the uses and remove the call from the graph. |
- call->ReplaceUsesWith(exit->value()->definition()); |
- Link(call->previous(), callee_entry->next()); |
- Link(exit->previous(), call->next()); |
+ caller_instr->ReplaceUsesWith(exit->value()->definition()); |
+ Link(caller_instr->previous(), callee_entry->next()); |
+ Link(exit->previous(), caller_instr->next()); |
} else { |
// TODO(zerny): Support multiple exits. |
UNREACHABLE(); |
@@ -732,8 +736,8 @@ void FlowGraph::InlineCall(StaticCallInstr* call, FlowGraph* callee_graph) { |
// TODO(zerny): Update dominator tree. |
// Remove original arguments to the call. |
- for (intptr_t i = 0; i < call->ArgumentCount(); ++i) { |
- PushArgumentInstr* push = call->ArgumentAt(i); |
+ for (intptr_t i = 0; i < caller_comp->ArgumentCount(); ++i) { |
+ PushArgumentInstr* push = caller_comp->ArgumentAt(i); |
push->ReplaceUsesWith(push->value()->definition()); |
push->RemoveFromGraph(); |
} |