Exemplo n.º 1
0
 public static bool MakeByRefCallsSimple(SsaForm ssaForm)
 {
     SimplifyByRefCalls instance = new SimplifyByRefCalls(ssaForm);
     foreach (SsaBlock block in ssaForm.Blocks) {
         for (int i = 0; i < block.Instructions.Count; i++) {
             SsaInstruction inst = block.Instructions[i];
             if (inst.Instruction != null) {
                 switch (inst.Instruction.OpCode.Code) {
                     case Code.Call:
                     case Code.Callvirt:
                         instance.MakeByRefCallSimple(block, ref i, (IMethodSignature)inst.Instruction.Operand);
                         break;
                     case Code.Initobj:
                         instance.MakeInitObjCallSimple(block, ref i);
                         break;
                     case Code.Ldfld:
                         instance.MakeLoadFieldCallSimple(block, ref i);
                         break;
                 }
             }
         }
     }
     instance.RemoveRedundantInstructions();
     if (instance.couldSimplifySomething)
         ssaForm.ComputeVariableUsage();
     return instance.couldSimplifySomething;
 }
Exemplo n.º 2
0
        public static void Transform(ControlFlowGraph cfg, SsaForm ssa, bool optimize = true)
        {
            TransformToSsa transform = new TransformToSsa(cfg, ssa);

            transform.ConvertVariablesToSsa();
            SsaOptimization.RemoveDeadAssignments(ssa);             // required so that 'MakeByRefCallsSimple' can detect more cases
            if (SimplifyByRefCalls.MakeByRefCallsSimple(ssa))
            {
                transform.ConvertVariablesToSsa();
            }
            if (optimize)
            {
                SsaOptimization.Optimize(ssa);
            }
        }
Exemplo n.º 3
0
        public static bool MakeByRefCallsSimple(SsaForm ssaForm)
        {
            SimplifyByRefCalls instance = new SimplifyByRefCalls(ssaForm);

            foreach (SsaBlock block in ssaForm.Blocks)
            {
                for (int i = 0; i < block.Instructions.Count; i++)
                {
                    SsaInstruction inst = block.Instructions[i];
                    if (inst.Instruction != null)
                    {
                        switch (inst.Instruction.OpCode.Code)
                        {
                        case Code.Call:
                        case Code.Callvirt:
                            instance.MakeByRefCallSimple(block, ref i, (IMethodSignature)inst.Instruction.Operand);
                            break;

                        case Code.Initobj:
                            instance.MakeInitObjCallSimple(block, ref i);
                            break;

                        case Code.Ldfld:
                            instance.MakeLoadFieldCallSimple(block, ref i);
                            break;
                        }
                    }
                }
            }
            instance.RemoveRedundantInstructions();
            if (instance.couldSimplifySomething)
            {
                ssaForm.ComputeVariableUsage();
            }
            return(instance.couldSimplifySomething);
        }