public void DefUseBBlocks_CopyPropagationTest()
        {
            TmpNameManager.Instance.Drop();
            var tacVisitor = new ThreeAddressCodeVisitor();

            var expectedResult = "a = 42  \nt1 = a + 10\nx = t1  \nz = 1  \nt2 = t1 + y\nb = t2  \nt3 = a * z\nt4 = t3 / t1\nt5 = 100 + t4\nv = t5  \nt6 = t1 + t2\nt7 = z + t6\nvar1 = t7  \n";
            var source         = "a = 42;\nx = a + 10;\nz = 1;\nb = x + y;\nv = 100 + (a * z) / x;\nvar1 = z + (x + b);\n";

            var scanner = new Scanner();

            scanner.SetSource(source, 0);
            var parser = new Parser(scanner);

            parser.Parse();
            var root = parser.root;

            root.Visit(tacVisitor);
            tacVisitor.Postprocess();

            var defUseConstPropagation = new DefUseCopyPropagation();
            var result = defUseConstPropagation.Optimize(tacVisitor.TACodeContainer);

            while (result)
            {
                result = defUseConstPropagation.Optimize(tacVisitor.TACodeContainer);
            }

            Assert.AreEqual(expectedResult, tacVisitor.TACodeContainer.ToString());
        }
        public void SplitTACode_ThreeBasicBlocks()
        {
            var source = "goto l 7:" +
                         "g = 34;" +
                         "l 7:";

            /*
             * goto l 7;
             * g = 34;
             * l 7:
             */

            var scanner = new Scanner();

            scanner.SetSource(source, 0);
            var parser = new Parser(scanner);

            parser.Parse();

            var parentv = new FillParentVisitor();

            parser.root.Visit(parentv);

            var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();

            parser.root.Visit(threeAddressCodeVisitor);
            threeAddressCodeVisitor.Postprocess();

            var bblocks = new BasicBlocks();

            bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer);
            Assert.AreEqual(3, bblocks.BasicBlockItems.Count);
        }
Пример #3
0
        public void Visit_NestedLoopWithCounter()
        {
            const string source = "a = 1;\n" +
                                  "for (i = 1 to 10)\n" +
                                  " for (j = 1 to 10)\n" +
                                  "  a = a + 1;";
            var scanner = new Scanner();

            scanner.SetSource(source, 0);

            /*
             * a = 1;
             * for (i = 1 to 10)
             *     for (j = 1 to 10)
             *         a = a + 1;
             */

            var expectedResult = Utils.GetNestedLoopWithCounterInTAC();

            var parser = new Parser(scanner);

            parser.Parse();
            var root       = parser.root;
            var tacVisitor = new ThreeAddressCodeVisitor();

            root.Visit(tacVisitor);

            Assert.AreEqual(tacVisitor.TACodeContainer.ToString(), expectedResult.ToString());
        }
        public void Optimize_DivisionInts()
        {
            var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();

            threeAddressCodeVisitor.TACodeContainer.PushNode(
                new TacAssignmentNode()
            {
                LeftPartIdentifier = "t1",
                FirstOperand       = "4",
                Operation          = "/",
                SecondOperand      = "2"
            });

            var isOptimized = new ConvConstOptimization().Optimize(threeAddressCodeVisitor.TACodeContainer);

            var optimizedTac = threeAddressCodeVisitor.TACodeContainer.TACodeLines.First.Value as TacAssignmentNode;
            var res          = new TacAssignmentNode()
            {
                LeftPartIdentifier = "t1",
                FirstOperand       = "2"
            };

            Assert.IsTrue(isOptimized);
            Assert.AreEqual(optimizedTac.ToString(), res.ToString());
        }
        public void SplitTACode_FourBasicBlocks()
        {
            var source = "a = 123;" +
                         "if (a > 444) {" +
                         "g = 34;" +
                         "}";

            /*
             * a = 123;
             * if (a > 44) {
             *   g = 34;
             * }
             */

            var scanner = new Scanner();

            scanner.SetSource(source, 0);
            var parser = new Parser(scanner);

            parser.Parse();

            var parentv = new FillParentVisitor();

            parser.root.Visit(parentv);

            var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();

            parser.root.Visit(threeAddressCodeVisitor);
            threeAddressCodeVisitor.Postprocess();

            var bblocks = new BasicBlocks();

            bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer);
            Assert.AreEqual(4, bblocks.BasicBlockItems.Count);
        }
        public void Optimize_NoParamsWithDefinedType()
        {
            TmpNameManager.Instance.Drop();

            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, null, "a", "x", "+", "y");
            Utils.AddAssignmentNode(tacContainer, null, "b", "x", "+", "y");
            Utils.AddAssignmentNode(tacContainer, null, "a", "17");
            Utils.AddAssignmentNode(tacContainer, null, "b", "18");
            Utils.AddAssignmentNode(tacContainer, null, "c", "x", "+", "y");

            var expectedResult = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(expectedResult, null, "a", "x", "+", "y");
            Utils.AddAssignmentNode(expectedResult, null, "b", "a");
            Utils.AddAssignmentNode(expectedResult, null, "t1", "a");
            Utils.AddAssignmentNode(expectedResult, null, "a", "17");
            Utils.AddAssignmentNode(expectedResult, null, "b", "18");
            Utils.AddAssignmentNode(expectedResult, null, "c", "t1");

            var optimization = new LocalValueNumberingOptimization();
            var isOptimized  = optimization.Optimize(tacContainer);

            Assert.IsTrue(isOptimized);
            Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString());
        }
        public void SplitTACode_OneBasicBlock()
        {
            var source = "c = 9;\na = c == c;\n";

            /*
             * c = 9;
             * a = c == c;
             */

            var scanner = new Scanner();

            scanner.SetSource(source, 0);
            var parser = new Parser(scanner);

            parser.Parse();

            var parentv = new FillParentVisitor();

            parser.root.Visit(parentv);

            var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();

            parser.root.Visit(threeAddressCodeVisitor);
            threeAddressCodeVisitor.Postprocess();

            var bblocks = new BasicBlocks();

            bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer);
            Assert.AreEqual(1, bblocks.BasicBlockItems.Count);
        }
Пример #8
0
        public ControlFlowGraph(ThreeAddressCodeVisitor code)
        {
            var code_blocks = new Block.Block(code);

            this.blocks = code_blocks.GenerateBlocks();
            cfg         = new Graph(this.blocks.Count);
            GenerateCFG();
        }
Пример #9
0
        public List <LinkedList <ThreeCode> > Apply(ThreeAddressCodeVisitor visit)
        {
            Block.Block bl = new Block.Block(visit);
            List <LinkedList <ThreeCode> > res = bl.GenerateBlocks();

            Apply(ref res);

            return(res);
        }
        static void Main(string[] args)
        {
            var    DirectoryPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
            string FileName      = Path.Combine(DirectoryPath, "a.txt");

            try
            {
                string Text = File.ReadAllText(FileName);
                Text = Text.Replace('\t', ' ');

                Scanner scanner = new Scanner();
                scanner.SetSource(Text, 0);

                Parser parser = new Parser(scanner);

                var b      = parser.Parse();
                var r      = parser.root;
                var printv = new PrettyPrintVisitor(true);
                r.Visit(printv);
                Console.WriteLine("Текст программы:");
                Console.WriteLine(printv.Text);
                Console.WriteLine();
                var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();
                r.Visit(threeAddressCodeVisitor);
                threeAddressCodeVisitor.Postprocess();
                var cfg = new ControlFlowGraph(threeAddressCodeVisitor.TACodeContainer);
                Console.WriteLine("CFG: ");
                Console.WriteLine(cfg);
                Console.WriteLine("DominationBorder: ");
                foreach (var vertex in cfg.Vertices)
                {
                    Console.WriteLine();
                    Console.WriteLine("vertex: \n" + vertex);
                    var    borderSet = DominationBorder.Execute(cfg, vertex);
                    string borderStr = "";
                    foreach (var el in borderSet)
                    {
                        borderStr += el + "\n";
                    }
                    if (borderSet.Count() == 0)
                    {
                        borderStr = "Empty";
                    }
                    Console.WriteLine("borderSet: \n\n" + borderStr);
                    Console.WriteLine();
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Файл {0} не найден", FileName);
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e);
            }
        }
Пример #11
0
        public List <LinkedList <ThreeCode> > Apply(ThreeAddressCodeVisitor visit)
        {
            Block.Block bl = new Block.Block(visit);
            List <LinkedList <ThreeCode> > res = bl.GenerateBlocks();

            for (int i = 0; i < res.Count; i++)
            {
                Apply(res[i]);
            }

            return(res);
        }
        static private ThreeAddressCode GetCodeLinesByText(string text)
        {
            Scanner scanner = new Scanner();

            scanner.SetSource(text, 0);
            Parser parser = new Parser(scanner);
            var    b      = parser.Parse();
            var    r      = parser.root;
            var    threeAddressCodeVisitor = new ThreeAddressCodeVisitor();

            r.Visit(threeAddressCodeVisitor);
            return(threeAddressCodeVisitor.TACodeContainer);
        }
Пример #13
0
        static void TacTests(Parser parser) // 14.04
        {
            var pf = new FillParentVisitor();

            parser.root.Visit(pf);
            //var ne = new NumberEqualityVisitor();
            //parser.root.Visit(ne);
            //var ifelse = new AlwaysIfOrElseVisitor();
            //parser.root.Visit(ifelse);
            var tac = new ThreeAddressCodeVisitor();

            parser.root.Visit(tac);

            Console.WriteLine("Tac code: \n");
            Console.WriteLine(tac.TACodeContainer.ToString());
        }
        public void Optimize_IsNotOptimized()
        {
            var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();

            threeAddressCodeVisitor.TACodeContainer.PushNode(
                new TacAssignmentNode()
            {
                LeftPartIdentifier = "t1",
                FirstOperand       = "4",
                Operation          = "!=",
                SecondOperand      = "a"
            });

            var isOptimized = new ConvConstOptimization().Optimize(threeAddressCodeVisitor.TACodeContainer);

            Assert.IsFalse(isOptimized);
        }
        public void Optimize_RightOptimized2()
        {
            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, null, "t1", "4", "*", "i");
            Utils.AddAssignmentNode(tacContainer, null, "a1", "t1");
            Utils.AddAssignmentNode(tacContainer, null, "t2", "b");
            Utils.AddAssignmentNode(tacContainer, null, "i", "1");
            Utils.AddIfGotoNode(tacContainer, null, "L1", "t2");
            Utils.AddGotoNode(tacContainer, null, "L2");
            Utils.AddAssignmentNode(tacContainer, "L1", "t3", "4", "*", "i");
            Utils.AddAssignmentNode(tacContainer, null, "a3", "t3");
            Utils.AddAssignmentNode(tacContainer, "L2", "t4", "4", "*", "i");
            Utils.AddAssignmentNode(tacContainer, null, "a2", "t4");

            var expectedResult = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(expectedResult, null, "t1", "4", "*", "i");
            Utils.AddAssignmentNode(expectedResult, null, "a1", "t1");
            Utils.AddAssignmentNode(expectedResult, null, "i", "1");
            Utils.AddAssignmentNode(expectedResult, null, "t2", "b");
            Utils.AddIfGotoNode(expectedResult, null, "L1", "t2");
            Utils.AddGotoNode(expectedResult, null, "L2");
            Utils.AddAssignmentNode(expectedResult, null, "t5", "4", "*", "1");
            Utils.AddAssignmentNode(expectedResult, "L1", "t3", "t5");
            Utils.AddAssignmentNode(expectedResult, null, "a3", "t3");
            Utils.AddAssignmentNode(expectedResult, null, "t5", "4", "*", "1");
            Utils.AddAssignmentNode(expectedResult, "L2", "t4", "t5");
            Utils.AddAssignmentNode(expectedResult, null, "a2", "t4");

            var cfg = new ControlFlowGraph(tacContainer);

            E_GenKillVisitor availExprVisitor = new E_GenKillVisitor();
            var availExprContainers           = availExprVisitor.GenerateAvailableExpressionForBlocks(cfg.SourceBasicBlocks);

            var availableExpressionsITA = new AvailableExpressionsITA(cfg, availExprContainers);

            var  availableExprOptimization = new AvailableExprOptimization();
            bool isOptimized     = availableExprOptimization.Optimize(availableExpressionsITA);
            var  basicBlockItems = cfg.SourceBasicBlocks.BasicBlockItems;
            var  codeText        = cfg.SourceBasicBlocks.BasicBlockItems
                                   .Select(bl => bl.ToString()).Aggregate((b1, b2) => b1 + b2);

            Assert.IsTrue(isOptimized);
        }
        public void Optimize_ReversedExpressions()
        {
            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, null, "a", "1", "+", "2");
            Utils.AddAssignmentNode(tacContainer, null, "b", "2", "+", "1");

            var expectedResult = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(expectedResult, null, "a", "1", "+", "2");
            Utils.AddAssignmentNode(expectedResult, null, "b", "a");

            var optimization = new LocalValueNumberingOptimization();
            var isOptimized  = optimization.Optimize(tacContainer);

            Assert.IsTrue(isOptimized);
            Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString());
        }
Пример #17
0
        static void TacConstantsAndCopies(Parser parser) // 14.04
        {
            var pf = new FillParentVisitor();

            parser.root.Visit(pf);
            var taco = new ThreeAddressCodeVisitor();

            parser.root.Visit(taco);

            var tacCode = taco.TACodeContainer;

            Console.WriteLine("Tac code before: \n");
            Console.WriteLine(tacCode.ToString());
            var cc = new CopyAndConstantsOptimizer(tacCode);

            Console.WriteLine("Tac code after: \n");
            Console.WriteLine(tacCode.ToString());
        }
        public void Visit_ifTacGeneration()
        {
            TmpNameManager.Instance.Drop();
            var tacVisitor = new ThreeAddressCodeVisitor();
            var tacTest    = new ThreeAddressCode();

            var source = "a = 42;\n" +
                         "x = 13;" +
                         "b = a + (30 * (a - 1));\n" +
                         "if(b > (x + 10)){\n" +
                         "    a = 8;\n" +
                         "}else{\n" +
                         "    a = 9;\n" +
                         "    x = 100;\n" +
                         "}";
            var scanner = new Scanner();

            scanner.SetSource(source, 0);
            var parser = new Parser(scanner);

            parser.Parse();
            var root = parser.root;

            root.Visit(tacVisitor);
            tacVisitor.Postprocess();

            Utils.AddAssignmentNode(tacTest, null, "a", "42");
            Utils.AddAssignmentNode(tacTest, null, "x", "13");
            Utils.AddAssignmentNode(tacTest, null, "t1", "a", "-", "1");
            Utils.AddAssignmentNode(tacTest, null, "t2", "30", "*", "t1");
            Utils.AddAssignmentNode(tacTest, null, "t3", "a", "+", "t2");
            Utils.AddAssignmentNode(tacTest, null, "b", "t3");
            Utils.AddAssignmentNode(tacTest, null, "t4", "x", "+", "10");
            Utils.AddAssignmentNode(tacTest, null, "t5", "b", ">", "t4");
            Utils.AddIfGotoNode(tacTest, null, "L1", "t5");
            Utils.AddAssignmentNode(tacTest, null, "a", "9");
            Utils.AddAssignmentNode(tacTest, null, "x", "100");
            Utils.AddGotoNode(tacTest, null, "L2");
            Utils.AddAssignmentNode(tacTest, "L1", "a", "8");
            Utils.AddEmptyNode(tacTest, "L2");

            Assert.AreEqual(tacVisitor.TACodeContainer.ToString(), tacTest.ToString());
        }
Пример #19
0
        public void Optimize_ChangedSecondOperand()
        {
            var tacVisitor = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(tacVisitor, "L1", "t1", "a", "+", "b");
            Utils.AddAssignmentNode(tacVisitor, null, "b", "2");
            Utils.AddAssignmentNode(tacVisitor, null, "t2", "a", "+", "b");

            var expectedResult = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(expectedResult, "L1", "t1", "a", "+", "b");
            Utils.AddAssignmentNode(expectedResult, null, "b", "2");
            Utils.AddAssignmentNode(expectedResult, null, "t2", "a", "+", "b");

            var optimization = new CommonSubexprOptimization();
            var isOptimized  = optimization.Optimize(tacVisitor.TACodeContainer);

            Assert.IsFalse(isOptimized);
            Assert.AreEqual(tacVisitor.ToString(), expectedResult.ToString());
        }
        /// <summary>
        /// Parses the source code of the program and converts it into a three-address code
        /// </summary>
        protected ThreeAddressCode GetTAC(string source)
        {
            var scanner = new Scanner();

            scanner.SetSource(source, 0);

            var parser = new Parser(scanner);

            if (!parser.Parse())
            {
                throw new Exception("An error occurred while parsing the program.");
            }

            var root       = parser.root;
            var tacVisitor = new ThreeAddressCodeVisitor();

            root.Visit(tacVisitor);

            return(tacVisitor.TACodeContainer);
        }
Пример #21
0
        public void Optimize_MultipleExpressions()
        {
            var tacVisitor = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(tacVisitor, "L1", "t1", "a", "+", "b");
            Utils.AddAssignmentNode(tacVisitor, null, "t2", "c", "+", "d");
            Utils.AddAssignmentNode(tacVisitor, null, "t3", "c", "+", "d");
            Utils.AddAssignmentNode(tacVisitor, null, "t4", "a", "+", "b");

            var expectedResult = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(expectedResult, "L1", "t1", "a", "+", "b");
            Utils.AddAssignmentNode(expectedResult, null, "t2", "c", "+", "d");
            Utils.AddAssignmentNode(expectedResult, null, "t3", "t2");
            Utils.AddAssignmentNode(expectedResult, null, "t4", "t1");

            var optimization = new CommonSubexprOptimization();
            var isOptimized  = optimization.Optimize(tacVisitor.TACodeContainer);

            Assert.IsTrue(isOptimized);
            Assert.AreEqual(tacVisitor.ToString(), expectedResult.ToString());
        }
Пример #22
0
        public void Optimize_ChangedOperandThenTwiceRepeatedExpression()
        {
            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, "L1", "t1", "a", "+", "b");
            Utils.AddAssignmentNode(tacContainer, null, "b", "2");
            Utils.AddAssignmentNode(tacContainer, null, "t2", "a", "+", "b");
            Utils.AddAssignmentNode(tacContainer, null, "t3", "a", "+", "b");

            var expectedResult = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(expectedResult, "L1", "t1", "a", "+", "b");
            Utils.AddAssignmentNode(expectedResult, null, "b", "2");
            Utils.AddAssignmentNode(expectedResult, null, "t2", "a", "+", "b");
            Utils.AddAssignmentNode(expectedResult, null, "t3", "t2");

            var optimization = new CommonSubexprOptimization();
            var isOptimized  = optimization.Optimize(tacContainer);

            Assert.IsTrue(isOptimized);
            Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString());
        }
Пример #23
0
        public void Optimize_CombinationOfBlocks()
        {
            /*
             * x = b;
             * x = a; --> Should be deleted despite of it's latest operation in block
             * if (1==1)
             * {
             * x = b;
             * y = x;
             * }
             * x = 1;
             * v = x;
             */
            TmpNameManager.Instance.Drop();
            var tacVisitor = new ThreeAddressCodeVisitor();

            var expectedResult = "t1 = 1 == 1\nif t1 goto L1\n";
            var source         = "x = b;\nx = a;\nif (1==1){\nx = b;\n y = x;\n}\n x = 1;\n v = x;\n";

            var scanner = new Scanner();

            scanner.SetSource(source, 0);
            var parser = new Parser(scanner);

            parser.Parse();
            var root = parser.root;

            root.Visit(tacVisitor);
            tacVisitor.Postprocess();

            var cfg = new ControlFlowGraph(tacVisitor.TACodeContainer);
            var defUseContainers   = DefUseForBlocksGenerator.Execute(cfg.SourceBasicBlocks);
            var activeVariablesITA = new ActiveVariablesITA(cfg, defUseContainers);
            DeadCodeOptimizationWithITA optimization = new DeadCodeOptimizationWithITA();
            var isOptimized = optimization.Optimize(activeVariablesITA);

            Assert.AreEqual(expectedResult, activeVariablesITA.controlFlowGraph.SourceBasicBlocks.BasicBlockItems[0].ToString());
        }
Пример #24
0
        public void Optimize_EmptyNodeTest()
        {
            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, null, "t1", "m", ">", "2");
            Utils.AddIfGotoNode(tacContainer, null, "L1", "t1");
            Utils.AddGotoNode(tacContainer, null, "L2");
            Utils.AddAssignmentNode(tacContainer, "L1", "c", "3");
            Utils.AddAssignmentNode(tacContainer, "L2", null, null);

            var expectedResult = new ThreeAddressCodeVisitor();

            Utils.AddAssignmentNode(expectedResult, null, "t1", "m", ">", "2");
            Utils.AddIfGotoNode(expectedResult, null, "L1", "t1");
            Utils.AddGotoNode(expectedResult, null, "L2");
            Utils.AddAssignmentNode(expectedResult, "L1", "c", "3");
            Utils.AddAssignmentNode(expectedResult, "L2", null, null);

            var optimization = new EmptyNodeOptimization();
            var isOptimized  = optimization.Optimize(tacContainer);

            Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString());
            Assert.IsFalse(isOptimized);
        }
 /// <summary>
 /// Creates and pushes assignment node to the end of the visitor's tac container
 /// </summary>
 public static void AddAssignmentNode(ThreeAddressCodeVisitor tacVisitor, string label,
                                      string id, string firstOp, string op = null, string secondOp = null)
 {
     AddAssignmentNode(tacVisitor.TACodeContainer, label, id, firstOp, op, secondOp);
 }
Пример #26
0
        public static void Main(string[] args)
        {
            string FileName = @"../../../data/DeadOrAliveOptimizationTest.txt";

            if (args.Length > 0)
            {
                FileName = args[0];
            }
            try {
                string Text = File.ReadAllText(FileName);

                Scanner scanner = new Scanner();
                scanner.SetSource(Text, 0);

                Parser parser = new Parser(scanner);

                var b = parser.Parse();
                if (!b)
                {
                    Console.WriteLine("Ошибка");
                }
                else
                {
                    Console.WriteLine("Синтаксическое дерево построено");
                    var r = parser.root;

                    FillParentVisitor generateParrent = new FillParentVisitor();
                    r.Visit(generateParrent);

                    {
                        ThreeAddressCodeVisitor treeCod2e = new ThreeAddressCodeVisitor();
                        r.Visit(treeCod2e);
                        //var blocks = new Block(treeCod2e).GenerateBlocks();

                        AutoThreeCodeOptimiser ap2p = new AutoThreeCodeOptimiser();
                        ap2p.Add(new DeadOrAliveOptimizationAdapter());

                        var blockwss = ap2p.Apply(treeCod2e);
                        Console.WriteLine(ThreeAddressCodeVisitor.ToString(blockwss));
                    }


                    //Console.WriteLine(r.ToString());

                    /*Opt2Visitor opt2 = new Opt2Visitor();
                     *                  r.Visit(opt2);
                     *
                     * PrettyPrintVisitor ppvis = new PrettyPrintVisitor();
                     * r.Visit(ppvis);
                     * Console.WriteLine(ppvis.Text);
                     *
                     * Console.WriteLine("\nAssignCountVisitor");
                     * AssignCountVisitor vis1 = new AssignCountVisitor();
                     * r.Visit(vis1);
                     * Console.WriteLine(vis1.Count);
                     *
                     * Console.WriteLine("\nStatementCountVisitor");
                     * StatementCountVisitor vis2 = new StatementCountVisitor();
                     * r.Visit(vis2);
                     * Console.WriteLine(vis2.Count);
                     *
                     * Console.WriteLine("\nMaxCountExprOpsVisitor");
                     *                  MaxCountExprOpsVisitor vis3 = new MaxCountExprOpsVisitor();
                     *                  r.Visit(vis3);
                     *                  Console.WriteLine(vis3.Max);
                     *
                     *                  Console.WriteLine("\nNestedCyclesVisitor");
                     *                  NestedCyclesVisitor vis4 = new NestedCyclesVisitor();
                     *                  r.Visit(vis4);
                     *                  Console.WriteLine(vis4.HasNestedCycles);
                     *
                     *                  Console.WriteLine("\nCycleNestedToIfVisitor");
                     *                  CycleNestedToIfVisitor vis5 = new CycleNestedToIfVisitor();
                     *                  r.Visit(vis5);
                     *                  Console.WriteLine(vis5.HasCycleNestedToIf);
                     *
                     * Console.WriteLine("\nIfNestedToCycleVisitor");
                     * IfNestedToCycleVisitor vis6 = new IfNestedToCycleVisitor();
                     * r.Visit(vis6);
                     * Console.WriteLine(vis6.HasIfNestedToCycle);
                     *
                     * Console.WriteLine("\nMaxDepthOfNestedCyclesVisitor");
                     * MaxDepthOfNestedCyclesVisitor vis7 = new MaxDepthOfNestedCyclesVisitor();
                     * r.Visit(vis7);
                     * Console.WriteLine(vis7.Max);*/

                    Console.WriteLine("\nGenerate Three address code");

                    ThreeAddressCodeVisitor treeCode = new ThreeAddressCodeVisitor();
                    r.Visit(treeCode);
                    var blocks           = new Block(treeCode).GenerateBlocks();
                    CFG controlFlowGraph = new CFG(blocks);

                    Console.WriteLine("\nГлубина графа:\n" + GraphDepth.GetGraphDepth(controlFlowGraph));
                    Console.WriteLine(treeCode.ToString());

                    // выполнение оптимизации для программы, не разбитой на блоки
                    //DeadOrAliveOptimization.DeleteDeadVariables(treeCode.GetCode());
                    // вычисление множеств Def и Use для всего графа потоков данных

                    /*var DefUse = new DefUseBlocks(controlFlowGraph);
                     *
                     * var InOut = new InOutActiveVariables(DefUse, controlFlowGraph);
                     *
                     * ControlFlowOptimisations.DeadOrAliveOnGraph(InOut, controlFlowGraph);
                     *
                     * var DefUse = new DefUseBlocks(controlFlowGraph);
                     *
                     * GraphToDOTHelper.SaveAsDOT("C:\\Users\\vladr\\Desktop\\graph.dot", controlFlowGraph);
                     * var InOut = new InOutActiveVariables(DefUse, controlFlowGraph);
                     *
                     * //ControlFlowOptimisations.DeadOrAliveOnGraph(InOut, controlFlowGraph);
                     * Console.WriteLine("\nafter DeleteDeadVariables for graph\n");
                     * foreach (var block in controlFlowGraph.blocks)
                     *  foreach (var line in block)
                     *      Console.WriteLine(line);
                     *
                     * Console.Write("");*/
                    //DeadOrAliveOptimization.



                    /* SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator();
                     * gen.Generate(treeCode.GetCode());
                     *
                     *                   gen.PrintCommands();
                     * Console.WriteLine("\nExecute:");
                     * gen.Execute();
                     *
                     * Console.Write("");*/

                    //DeadOrAliveOptimization.

                    /*CFG cfg = SimpleLang.GenericIterativeAlgorithm.Test
                     *  .DeadOrAliveOptimization(controlFlowGraph.blocks);
                     * Console.WriteLine("\nafter DeadOrAliveOptimization\n");
                     * Console.WriteLine(cfg);*/

                    /*var constPropOptimizer = new ConstantPropagationOptimizer();
                     * CFG cfg1 = constPropOptimizer.ApplyOptimization(controlFlowGraph.blocks);
                     * Console.WriteLine("\nafter ConstantPropagationOptimization\n");
                     * Console.WriteLine(cfg1);*/

                    //var reachingDefsTest = new ReachingDefsTest();
                    //reachingDefsTest.IterativeAlgorithm(controlFlowGraph.blocks);
                    //reachingDefsTest.PrintOutput();


                    //SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator();
                    //gen.Generate(treeCode.GetCode());
                    //gen.PrintCommands();
                    //Console.WriteLine("\nExecute:");
                    //gen.Execute();


                    AutoThreeCodeOptimiser app = new AutoThreeCodeOptimiser();
                    app.Add(new DistributionOfConstants());
                    app.Add(new EvalConstExpr());
                    app.Add(new ApplyAlgebraicIdentities());

                    var blockws = app.Apply(treeCode);
                    Console.WriteLine(ThreeAddressCodeVisitor.ToString(blockws));

                    /*CFG cfg = new CFG(blocks);
                     * TransferFunction tf = new TransferFunction(cfg);
                     * Console.WriteLine("\nGen 1");
                     * foreach (var d in tf.Gen(blocks[0]))
                     *      Console.WriteLine(d);
                     * Console.WriteLine("\nGen");
                     * foreach (var d in tf.Gen(blocks[3]))
                     *      Console.WriteLine(d);
                     * Console.WriteLine("\nKill");
                     * foreach (var d in tf.Kill(blocks[3]))
                     *      Console.WriteLine(d);
                     *
                     * Console.WriteLine("\nTransfer function");
                     * var f = tf.BlockTransferFunction(blocks[3]);
                     * foreach (var d in f(tf.Gen(blocks[0])))
                     *      Console.WriteLine(d);
                     *
                     * var code = treeCode.GetCode();
                     * app.Apply(code);*/



                    /*Opt11Visitor opt11vis = new Opt11Visitor();
                     * ppvis.Text = "";
                     * r.Visit(opt11vis);
                     * r.Visit(ppvis);
                     * Console.WriteLine(ppvis.Text);*/


                    /*var avis = new AssignCountVisitor();
                     * parser.root.Visit(avis);
                     * Console.WriteLine("Количество присваиваний = {0}", avis.Count);
                     * Console.WriteLine("-------------------------------");
                     *
                     * var pp = new PrettyPrintVisitor();
                     * parser.root.Visit(pp);
                     * Console.WriteLine(pp.Text);*/
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Файл {0} не найден", FileName);
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e);
            }

            Console.ReadLine();

            // ========
            // My part, don't touch !!!

            // Sorry for this troubles, I deleted bad part

            // CFG controlFlowGraph = new CFG(blocks);
            // Console.WriteLine(treeCode.ToString());
            // // выполнение оптимизации для программы, не разбитой на блоки
            // //DeadOrAliveOptimization.DeleteDeadVariables(treeCode.GetCode());
            // // вычисление множеств Def и Use для всего графа потоков данных
            // var DefUse = new DefUseBlocks(controlFlowGraph);
            //
            // var InOut = new InOutActiveVariables(DefUse, controlFlowGraph);
            //
            // ControlFlowOptimisations.DeadOrAliveOnGraph(InOut, controlFlowGraph);
            // Console.WriteLine("\nafter DeleteDeadVariables for graph\n");
            // foreach (var block in controlFlowGraph.blocks)
            //     foreach (var line in block)
            //         Console.WriteLine(line);
            // Console.Write("");

            // ========
        }
        public void Compute_CheckFirstBlockActiveVariables()
        {
            var source = "c = 123;\nm = 1 + c + y;\nif (m > 2) {\n    c = 3;\n} else {\n    c = 456;\n}\na = 11;";

            /*
             * c = 123;
             * m = 1 + c + y;
             * if (m > 2) {
             *   c = 3;
             * } else {
             *   c = 456;
             * }
             * a = 11;
             */

            var scanner = new Scanner();

            scanner.SetSource(source, 0);
            var parser = new Parser(scanner);

            parser.Parse();

            var parentv = new FillParentVisitor();

            parser.root.Visit(parentv);

            var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();

            parser.root.Visit(threeAddressCodeVisitor);
            threeAddressCodeVisitor.Postprocess();

            var cfg = new ControlFlowGraph(threeAddressCodeVisitor.TACodeContainer);

            var basicBlocks = new BasicBlocks();

            basicBlocks.SplitTACode(cfg.SourceCode);

            var defUseContainers = DefUseForBlocksGenerator.Execute(cfg.SourceBasicBlocks);

            DefUseForBlocksPrinter.Execute(defUseContainers);

            var tfFunction = new TFByComposition(defUseContainers);

            var collectionOperator = new UnionCollectionOperator <TacNode>();

            var mop = new MeetOverPaths(cfg, tfFunction, collectionOperator, new HashSet <TacNode>(), false);

            mop.Compute();

            var expectedIn = new List <string> {
                "y"
            };
            var outputIn = mop.InOut.In[cfg.SourceBasicBlocks.BasicBlockItems[0]]
                           .Select(x => x.ToString()).ToList();

            Assert.IsTrue(expectedIn.SequenceEqual(outputIn));

            var outputOut = mop.InOut.Out[cfg.SourceBasicBlocks.BasicBlockItems[0]]
                            .Select(x => x.ToString()).ToList();

            Assert.AreEqual(0, outputOut.Count);
        }
Пример #28
0
        public static void Main()
        {
            var    DirectoryPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
            string FileName      = Path.Combine(DirectoryPath, "a.txt");

            try
            {
                string Text = File.ReadAllText(FileName);
                Text = Text.Replace('\t', ' ');

                Scanner scanner = new Scanner();
                scanner.SetSource(Text, 0);

                Parser parser = new Parser(scanner);

                var b = parser.Parse();
                var r = parser.root;
                // Console.WriteLine(r);
                Console.WriteLine("Исходный текст программы");
                var printv = new PrettyPrintVisitor(true);
                r.Visit(printv);
                Console.WriteLine(printv.Text);
                Console.WriteLine("-------------------------------");

                if (!b)
                {
                    Console.WriteLine("Ошибка");
                }
                else
                {
                    Console.WriteLine("Синтаксическое дерево построено");

                    // TODO: add loop through all tree optimizations

                    var avis = new AssignCountVisitor();
                    parser.root.Visit(avis);
                    Console.WriteLine("Количество присваиваний = {0}", avis.Count);
                    Console.WriteLine("-------------------------------");

                    var operv = new OperatorCountVisitor();
                    parser.root.Visit(operv);
                    Console.WriteLine(operv.Result);

                    var maxcv = new MaxOpExprVisitor();
                    parser.root.Visit(maxcv);
                    Console.WriteLine(maxcv.Result);

                    var inncycv = new IsInnerCycleVisitor();
                    parser.root.Visit(inncycv);
                    Console.WriteLine(inncycv.Result);

                    var innifv = new IsInnerIfCycleVisitor();
                    parser.root.Visit(innifv);
                    Console.WriteLine(innifv.Result);

                    var maxdeepv = new MaxDeepCycleVistor();
                    parser.root.Visit(maxdeepv);
                    Console.WriteLine(maxdeepv.Result);

                    var parentv = new FillParentVisitor();
                    parser.root.Visit(parentv);

                    var sameminusv = new SameMinusOptVisitor();
                    parser.root.Visit(sameminusv);

                    var zeroMulVisitor = new ZeroMulOptVisitor();
                    parser.root.Visit(zeroMulVisitor);

                    var compareFalseVisitor = new CompareToItselfFalseOptVisitor();
                    parser.root.Visit(compareFalseVisitor);

                    Console.WriteLine("-------------------------------");

                    var ifNodeWithBoolExpr = new IfNodeWithBoolExprVisitor();
                    parser.root.Visit(ifNodeWithBoolExpr);

                    //var plusZeroExpr = new PlusZeroExprVisitor();
                    //parser.root.Visit(plusZeroExpr);

                    //var alwaysElse = new AlwaysElseVisitor();
                    //parser.root.Visit(alwaysElse);

                    //var checkTruth = new CheckTruthVisitor();
                    //parser.root.Visit(checkTruth);

                    //Console.WriteLine("Оптимизированная программа");
                    //printv = new PrettyPrintVisitor(true);
                    //r.Visit(printv);
                    //Console.WriteLine(printv.Text);
                    //Console.WriteLine("-------------------------------");

                    Console.WriteLine("Оптимизированная программа");
                    printv = new PrettyPrintVisitor(true);
                    r.Visit(printv);
                    Console.WriteLine(printv.Text);
                    Console.WriteLine("-------------------------------");

                    var threeAddressCodeVisitor = new ThreeAddressCodeVisitor();
                    r.Visit(threeAddressCodeVisitor);

                    var cfg = new ControlFlowGraph(threeAddressCodeVisitor.TACodeContainer);
                    Console.WriteLine(cfg);
                    cfg.SaveToFile(@"cfg.txt");

                    Console.WriteLine(threeAddressCodeVisitor.TACodeContainer);
                    var availExprOpt = new AvailableExprOptimization();
                    availExprOpt.Optimize(cfg);
                    Console.WriteLine("======= After algebraic identity =======");
                    Console.WriteLine(cfg);

                    Console.WriteLine("======= DV =======");
                    Console.WriteLine(threeAddressCodeVisitor);
                    var detector = new DefUseDetector();
                    detector.DetectAndFillDefUse(threeAddressCodeVisitor.TACodeContainer);
                    //Console.WriteLine("======= Detector 1 =======");
                    //Console.WriteLine(detector);
                    //Console.WriteLine("======= Detector 2 =======");
                    //Console.WriteLine(detector.ToString2());
                    var constPropagationOptimizer = new DefUseConstPropagation(detector);
                    var result = constPropagationOptimizer.Optimize(threeAddressCodeVisitor.TACodeContainer);

                    Console.WriteLine("======= After const propagation =======");
                    Console.WriteLine(threeAddressCodeVisitor);

                    result = constPropagationOptimizer.Optimize(threeAddressCodeVisitor.TACodeContainer);
                    Console.WriteLine("======= After const propagation =======");
                    Console.WriteLine(threeAddressCodeVisitor);

                    var copyPropagationOptimizer = new DefUseCopyPropagation(detector);
                    result = copyPropagationOptimizer.Optimize(threeAddressCodeVisitor.TACodeContainer);

                    Console.WriteLine("======= After copy propagation =======");
                    Console.WriteLine(threeAddressCodeVisitor);

                    //var bblocks = new BasicBlocks();
                    //bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer);
                    //Console.WriteLine("Разбиение на базовые блоки завершилось");
                    var emptyopt = new EmptyNodeOptimization();
                    emptyopt.Optimize(threeAddressCodeVisitor.TACodeContainer);
                    Console.WriteLine("Empty node optimization");
                    Console.WriteLine(threeAddressCodeVisitor.TACodeContainer);

                    var gotoOpt = new GotoOptimization();
                    gotoOpt.Optimize(threeAddressCodeVisitor.TACodeContainer);
                    Console.WriteLine("Goto optimization");
                    Console.WriteLine(threeAddressCodeVisitor.TACodeContainer);

                    //var elimintaion = new EliminateTranToTranOpt();
                    //elimintaion.Optimize(threeAddressCodeVisitor.TACodeContainer);
                    //Console.WriteLine("Удаление переходов к переходам завершилось");

                    var unreachableCode = new UnreachableCodeOpt();
                    var res             = unreachableCode.Optimize(threeAddressCodeVisitor.TACodeContainer);
                    Console.WriteLine("Оптимизация для недостижимых блоков");

                    var algOpt = new AlgebraicIdentityOptimization();
                    algOpt.Optimize(threeAddressCodeVisitor.TACodeContainer);
                    Console.WriteLine("algebraic identity optimization");
                    Console.WriteLine(threeAddressCodeVisitor.TACodeContainer);

                    var bblocks = new BasicBlocks();
                    bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer);
                    Console.WriteLine("Разбиение на базовые блоки завершилось");
                    Console.WriteLine();

                    GenKillVisitor genKillVisitor    = new GenKillVisitor();
                    var            genKillContainers = genKillVisitor.GenerateReachingDefinitionForBlocks(cfg.SourceBasicBlocks);
                    InOutContainer inOutContainers   = new InOutContainer(cfg.SourceBasicBlocks, genKillContainers);
                    Console.WriteLine("=== InOut для базовых блоков ===");
                    Console.WriteLine(inOutContainers.ToString());

                    var defUseContainers = DefUseForBlocksGenerator.Execute(cfg.SourceBasicBlocks);
                    DefUseForBlocksPrinter.Execute(defUseContainers);

                    var reachingDefenitionsITA = new ReachingDefinitionsITA(cfg, genKillContainers);
                    Console.WriteLine("=== InOut после итерационного алгоритма для достигающих определения ===");
                    Console.WriteLine(reachingDefenitionsITA);

                    var activeVariablesITA = new ActiveVariablesITA(cfg, defUseContainers);
                    Console.WriteLine("=== InOut после итерационного алгоритма для активных переменных ===");
                    Console.WriteLine(activeVariablesITA);
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("Файл {0} не найден", FileName);
            }
            catch (Exception e)
            {
                Console.WriteLine("{0}", e);
            }

            Console.ReadLine();
        }
 /// <summary>
 /// Creates and pushes empty node to the end of the visitor's tac container
 /// </summary>
 public static void AddEmptyNode(ThreeAddressCodeVisitor tacVisitor, string label = null)
 {
     AddEmptyNode(tacVisitor.TACodeContainer, label);
 }
 /// <summary>
 /// Creates and pushes if-goto node to the end of the visitor's tac container
 /// </summary>
 public static void AddIfGotoNode(ThreeAddressCodeVisitor tacVisitor,
                                  string label, string targetLabel, string condition)
 {
     AddIfGotoNode(tacVisitor.TACodeContainer, label, targetLabel, condition);
 }