| 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(); | 
| } | 
|  |