private IReadOnlyList <BasicBlock> GeneratorBasicBlockAfterOptimization(List <Instruction> TAC) { var cfg = new ControlFlowGraph(BasicBlockLeader.DivideLeaderToLeader(TAC)); var inOutData = new AvailableExpressions().Execute(cfg); AvailableExpressionsApplication.Execute(cfg, inOutData); return(cfg.GetCurrentBasicBlocks()); }
internal static (string, string) ApplyIterativeAlgorithm(ControlFlowGraph cfg, List <string> opts) { var strReturn = new StringBuilder(); var strBefore = new StringBuilder(); foreach (var b in cfg.GetCurrentBasicBlocks()) { foreach (var inst in b.GetInstructions()) { strBefore.AppendLine(inst.ToString()); } strBefore.AppendLine("----------"); } foreach (var opt in opts) { switch (opt) { case "Доступные выражения": var inout = new AvailableExpressions().Execute(cfg); AvailableExpressionsApplication.Execute(cfg, inout); break; case "Активные переменные": cfg = LiveVariableAnalysisOptimization.LiveVariableDeleteDeadCode(cfg); break; case "Достигающие определения": var reachDef = new ReachingDefinitionsGlobal(); reachDef.DeleteDeadCode(cfg); break; } } foreach (var b in cfg.GetCurrentBasicBlocks()) { foreach (var inst in b.GetInstructions()) { strReturn.AppendLine(inst.ToString()); } strReturn.AppendLine("----------"); } return(strBefore.ToString(), strReturn.ToString()); }
internal static (string, string) ApplyIterativeAlgorithm(ControlFlowGraph cfg, List <string> opts) { var strReturn = new StringBuilder(); var strBefore = new StringBuilder(); foreach (var b in cfg.GetCurrentBasicBlocks()) { foreach (var inst in b.GetInstructions()) { strBefore.AppendLine(inst.ToString()); } strBefore.AppendLine("----------"); } foreach (var opt in opts) { switch (opt) { case "Доступные выражения": var inout = new AvailableExpressions().Execute(cfg); AvailableExpressionsApplication.Execute(cfg, inout); break; default: return(strBefore.ToString(), "Not realized yet"); } } foreach (var b in cfg.GetCurrentBasicBlocks()) { foreach (var inst in b.GetInstructions()) { strReturn.AppendLine(inst.ToString()); } strReturn.AppendLine("----------"); } return(strBefore.ToString(), strReturn.ToString()); }
public void NoOptimizationAfterAllOptimization() { var graph = BuildTACOptimizeCFG(@"var a, b, x, y, z, p, q, s; x = y + z; y = 1; if (a < b) { z = 2; p = y + z; } z = 1; q = y + z;"); var ae = new AvailableExpressions().Execute(graph); AvailableExpressionsApplication.Execute(graph, ae); var expected = new List <string>() { "#in: noop", "#t1 = y + z", "x = #t1", "y = 1", "#t2 = a < b", "if #t2 goto L1", "goto L2", "L1: z = 2", "#t3 = y + 2", "p = #t3", "L2: z = 1", "#t4 = y + 1", "q = #t4", "#out: noop" }; var actual = GetStringFromBlocks(graph.GetCurrentBasicBlocks()); CollectionAssert.AreEqual(expected, actual); }