Index: runtime/vm/flow_graph.cc |
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc |
index 8c69bc743a0631118836b20db6276a9ca49ceae6..bac0c4b7af4972c6766d47a05f55f97f5414da27 100644 |
--- a/runtime/vm/flow_graph.cc |
+++ b/runtime/vm/flow_graph.cc |
@@ -1080,8 +1080,8 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
// 2a. Handle uses: |
// Update the expression stack renaming environment for each use by |
// removing the renamed value. |
- // For each use of a LoadLocal, StoreLocal, or Constant: Replace it with |
- // the renamed value. |
+ // For each use of a LoadLocal, StoreLocal, DropTemps or Constant: Replace |
+ // it with the renamed value. |
for (intptr_t i = current->InputCount() - 1; i >= 0; --i) { |
Value* v = current->InputAt(i); |
// Update expression stack. |
@@ -1089,13 +1089,11 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
Definition* reaching_defn = env->RemoveLast(); |
Definition* input_defn = v->definition(); |
- if (input_defn->IsLoadLocal() || |
- input_defn->IsStoreLocal() || |
- input_defn->IsPushTemp() || |
- input_defn->IsDropTemps() || |
- input_defn->IsConstant()) { |
- // Remove the load/store from the graph. |
- input_defn->RemoveFromGraph(); |
+ if (input_defn != reaching_defn) { |
+ ASSERT(input_defn->IsLoadLocal() || |
+ input_defn->IsStoreLocal() || |
+ input_defn->IsDropTemps() || |
+ input_defn->IsConstant()); |
// Assert we are not referencing nulls in the initial environment. |
ASSERT(reaching_defn->ssa_temp_index() != -1); |
v->set_definition(reaching_defn); |
@@ -1109,17 +1107,15 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
env->RemoveLast(); |
} |
- // 2b. Handle LoadLocal, StoreLocal, and Constant. |
+ // 2b. Handle LoadLocal, StoreLocal, DropTemps and Constant. |
Definition* definition = current->AsDefinition(); |
if (definition != NULL) { |
LoadLocalInstr* load = definition->AsLoadLocal(); |
StoreLocalInstr* store = definition->AsStoreLocal(); |
- PushTempInstr* push = definition->AsPushTemp(); |
DropTempsInstr* drop = definition->AsDropTemps(); |
ConstantInstr* constant = definition->AsConstant(); |
if ((load != NULL) || |
(store != NULL) || |
- (push != NULL) || |
(drop != NULL) || |
(constant != NULL)) { |
Definition* result = NULL; |
@@ -1158,12 +1154,6 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
intptr_t index = load->local().BitIndexIn(num_non_copied_params_); |
captured_parameters_->Add(index); |
} |
- |
- } else if (push != NULL) { |
- result = push->value()->definition(); |
- env->Add(result); |
- it.RemoveCurrentFromGraph(); |
- continue; |
} else if (drop != NULL) { |
// Drop temps from the environment. |
for (intptr_t j = 0; j < drop->num_temps(); j++) { |
@@ -1181,13 +1171,10 @@ void FlowGraph::RenameRecursive(BlockEntryInstr* block_entry, |
if (definition->HasTemp()) { |
ASSERT(result != NULL); |
env->Add(result); |
- // We remove load/store/constant instructions when we find their |
- // use in 2a. |
- } else { |
- it.RemoveCurrentFromGraph(); |
} |
+ it.RemoveCurrentFromGraph(); |
} else { |
- // Not a load, store, or constant. |
+ // Not a load, store, drop or constant. |
if (definition->HasTemp()) { |
// Assign fresh SSA temporary and update expression stack. |
AllocateSSAIndexes(definition); |