Beispiel #1
0
 /// <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);
 }
Beispiel #3
0
        /// <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);
        }