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);
        }
Esempio n. 2
0
        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();
                    }
                }
            }
        }