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());
        }
Esempio n. 2
0
        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());
        }
Esempio n. 3
0
        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);
        }