private void RenameVariables() { var derived_variables = new Dictionary <IVariable, Stack <DerivedVariable> >(); var indices = new Dictionary <IVariable, uint>(); foreach (var variable in method.Variables) { var derived = new DerivedVariable(variable, 0u); var stack = new Stack <DerivedVariable>(); stack.Push(derived); derived_variables.Add(variable, stack); indices.Add(variable, 1u); } this.RenameParameters(derived_variables); this.RenameVariables(cfg.Entry, derived_variables, indices); }
private void RenameVariables(CFGNode node, IDictionary <IVariable, Stack <DerivedVariable> > derived_variables, Dictionary <IVariable, uint> indices) { foreach (var instruction in node.Instructions) { DerivedVariable result_derived = null; if (instruction is DefinitionInstruction) { var definition = instruction as DefinitionInstruction; //if (definition.HasResult && indices.ContainsKey(definition.Result)) if (definition.HasResult) { var result = definition.Result; var index = indices[result]; result_derived = new DerivedVariable(result, index); definition.Result = result_derived; } } foreach (var variable in instruction.UsedVariables) { // When the instruction is a phi, its arguments (used variables) // are already derived variables, so there is no entry in // derived_variables dictionary for them. if (!derived_variables.ContainsKey(variable)) { continue; } var stack = derived_variables[variable]; var derived = stack.Peek(); instruction.Replace(variable, derived); } if (result_derived != null) { var result = result_derived.Original; var index = result_derived.Index; var result_stack = derived_variables[result]; result_stack.Push(result_derived); indices[result] = index + 1; } } foreach (var succ in node.Successors) { if (!phi_instructions.ContainsKey(succ)) { continue; } var node_phi_instructions = phi_instructions[succ]; foreach (var entry in node_phi_instructions) { var variable = entry.Key; var phi = entry.Value; var stack = derived_variables[variable]; var derived = stack.Peek(); phi.Arguments.Add(derived); } } foreach (var child in node.ImmediateDominated) { this.RenameVariables(child, derived_variables, indices); } foreach (var instruction in node.Instructions) { if (instruction is DefinitionInstruction) { var definition = instruction as DefinitionInstruction; if (definition.HasResult) { var derived = definition.Result as DerivedVariable; var result = derived.Original; var stack = derived_variables[result]; stack.Pop(); } } } }