Index: runtime/vm/flow_graph_builder.cc |
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc |
index 2f706710dd1ead9501b6b496716919f9ed7e43fd..eb1025fe048d9cb6e4b1f637321fa642ef695a51 100644 |
--- a/runtime/vm/flow_graph_builder.cc |
+++ b/runtime/vm/flow_graph_builder.cc |
@@ -2286,7 +2286,10 @@ void FlowGraphBuilder::BuildGraph(bool for_optimized, bool use_ssa) { |
ASSERT(!for_effect.is_open()); |
GrowableArray<intptr_t> parent; |
GrowableArray<BitVector*> assigned_vars; |
- intptr_t variable_count = parsed_function_.function().num_fixed_parameters() + |
+ |
+ const intptr_t fixed_parameter_count = |
+ parsed_function_.function().num_fixed_parameters(); |
+ const intptr_t variable_count = fixed_parameter_count + |
parsed_function_.copied_parameter_count() + |
parsed_function_.stack_local_count(); |
// Perform a depth-first traversal of the graph to build preorder and |
@@ -2296,7 +2299,8 @@ void FlowGraphBuilder::BuildGraph(bool for_optimized, bool use_ssa) { |
&postorder_block_entries_, |
&parent, |
&assigned_vars, |
- variable_count); |
+ variable_count, |
+ fixed_parameter_count); |
// Number blocks in reverse postorder. |
intptr_t block_count = postorder_block_entries_.length(); |
for (intptr_t i = 0; i < block_count; ++i) { |
@@ -2542,7 +2546,9 @@ void FlowGraphBuilder::Rename(intptr_t var_count) { |
// Initialize start environment. |
GrowableArray<Value*> start_env(var_count); |
intptr_t i = 0; |
- for (; i < parsed_function().function().num_fixed_parameters(); ++i) { |
+ const intptr_t fixed_parameter_count = |
+ parsed_function().function().num_fixed_parameters(); |
+ for (; i < fixed_parameter_count; ++i) { |
ParameterInstr* param = new ParameterInstr(i); |
param->set_ssa_temp_index(alloc_ssa_temp_index()); // New SSA temp. |
start_env.Add(new UseVal(param)); |
@@ -2553,13 +2559,14 @@ void FlowGraphBuilder::Rename(intptr_t var_count) { |
for (; i < var_count; i++) { |
start_env.Add(null_value); |
} |
- graph_entry_->set_start_env(new Environment(start_env)); |
+ graph_entry_->set_start_env( |
+ new Environment(start_env, fixed_parameter_count)); |
BlockEntryInstr* normal_entry = graph_entry_->SuccessorAt(0); |
ASSERT(normal_entry != NULL); // Must have entry. |
GrowableArray<Value*> env(var_count); |
env.AddArray(start_env); |
- RenameRecursive(normal_entry, &env, var_count); |
+ RenameRecursive(normal_entry, &env, var_count, fixed_parameter_count); |
} |
@@ -2573,7 +2580,8 @@ static Value* CopyValue(Value* value) { |
void FlowGraphBuilder::RenameRecursive(BlockEntryInstr* block_entry, |
GrowableArray<Value*>* env, |
- intptr_t var_count) { |
+ intptr_t var_count, |
+ intptr_t fixed_parameter_count) { |
// 1. Process phis first. |
if (block_entry->IsJoinEntry()) { |
JoinEntryInstr* join = block_entry->AsJoinEntry(); |
@@ -2595,7 +2603,7 @@ void FlowGraphBuilder::RenameRecursive(BlockEntryInstr* block_entry, |
// TODO(fschneider): Currently each instruction gets a full copy of the |
// environment. This should be optimized: Only instructions that can |
// deoptimize should have uses of the environment values. |
- current->set_env(new Environment(*env)); |
+ current->set_env(new Environment(*env, fixed_parameter_count)); |
// 2a. Handle uses: |
// Update expression stack environment for each use. |
@@ -2610,14 +2618,16 @@ void FlowGraphBuilder::RenameRecursive(BlockEntryInstr* block_entry, |
BindInstr* as_bind = v->AsUse()->definition()->AsBind(); |
if ((as_bind != NULL) && as_bind->computation()->IsLoadLocal()) { |
Computation* comp = as_bind->computation(); |
- intptr_t index = comp->AsLoadLocal()->local().BitIndexIn(var_count); |
+ intptr_t index = |
+ comp->AsLoadLocal()->local().BitIndexIn(fixed_parameter_count); |
current->SetInputAt(i, CopyValue((*env)[index])); |
} |
if ((as_bind != NULL) && as_bind->computation()->IsStoreLocal()) { |
// For each use of a StoreLocal: Replace it with the value from the |
// environment. |
Computation* comp = as_bind->computation(); |
- intptr_t index = comp->AsStoreLocal()->local().BitIndexIn(var_count); |
+ intptr_t index = |
+ comp->AsStoreLocal()->local().BitIndexIn(fixed_parameter_count); |
current->SetInputAt(i, CopyValue((*env)[index])); |
} |
} |
@@ -2632,14 +2642,14 @@ void FlowGraphBuilder::RenameRecursive(BlockEntryInstr* block_entry, |
if ((load != NULL) || (store != NULL)) { |
intptr_t index; |
if (store != NULL) { |
- index = store->local().BitIndexIn(var_count); |
+ index = store->local().BitIndexIn(fixed_parameter_count); |
// Update renaming environment. |
(*env)[index] = store->value(); |
} else { |
// The graph construction ensures we do not have an unused LoadLocal |
// computation. |
ASSERT(bind->is_used()); |
- index = load->local().BitIndexIn(var_count); |
+ index = load->local().BitIndexIn(fixed_parameter_count); |
} |
// Update expression stack and remove from graph. |
if (bind->is_used()) { |
@@ -2662,7 +2672,7 @@ void FlowGraphBuilder::RenameRecursive(BlockEntryInstr* block_entry, |
BlockEntryInstr* block = block_entry->dominated_blocks()[i]; |
GrowableArray<Value*> new_env(env->length()); |
new_env.AddArray(*env); |
- RenameRecursive(block, &new_env, var_count); |
+ RenameRecursive(block, &new_env, var_count, fixed_parameter_count); |
} |
// 4. Process successor block. We have edge-split form, so that only blocks |