/// <summary> /// Constructs a new instance /// </summary> /// <param name="instructions">instruction list</param> /// <param name="dflowAnalyzer">dataflow analyzer which serves as analysis back-end</param> public LocalVariableOptimizer(IList <XILSInstr> instructions, DataflowAnalyzer <XILSInstr> dflowAnalyzer) : base(instructions) { DflowAnalyzer = dflowAnalyzer; SetHandler(InstructionCodes.StoreVar, HandleStoreVar); SetHandler(InstructionCodes.LoadVar, HandleLoadVar); }
/// <summary> /// Constructs a new instance /// </summary> /// <param name="instructions">instruction list</param> /// <param name="dflowAnalyzer">dataflow analyzer which serves as analysis back-end</param> public LocalVariableOptimizer(IList<XILSInstr> instructions, DataflowAnalyzer<XILSInstr> dflowAnalyzer) : base(instructions) { DflowAnalyzer = dflowAnalyzer; SetHandler(InstructionCodes.StoreVar, HandleStoreVar); SetHandler(InstructionCodes.LoadVar, HandleLoadVar); }
/// <summary> /// Tries to reduce the number of local variables by replacing them with their right-hand side expressions where possible /// </summary> /// <param name="cfg">XIL-S control-flow graph</param> /// <returns>resulting instruction list</returns> public static List <XILSInstr> OptimizeLocals(ControlFlowGraph <XILSInstr> cfg) { var locals = cfg.Instructions.RenumerateLocalVariables(); int numLocals = locals.Any() ? locals.Max(l => ((Variable)l).LocalIndex) + 1 : 0; var dfa = new DataflowAnalyzer <XILSInstr>(cfg, numLocals) { DoNotOptimizeAcrossBasicBlocks = true }; dfa.Run(); var lva = new LocalVariableOptimizer(cfg.Instructions, dfa); lva.Rewrite(); var newLocals = locals.Where(v => !dfa.IsEliminable(((Variable)v).LocalIndex)).ToList(); return(lva.OutInstructions); }