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; }
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); } }
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); }