Esempio n. 1
0
File: Demos.cs Progetto: koyre/b8
        public void naturalCycleTest()
        {
            var root   = Parser.ParseString(Samples.SampleProgramText.sample1);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);
            var cfg    = ListBlocksToCFG.Build(blocks);

            cfg.ShowCompact = true;
            Console.WriteLine(cfg);
            var ncg = new NaturalCycleGraph(cfg);
            var res = ncg.findBetween(6, 4);

            res.Sort();
            var expected = new List <int>()
            {
                4, 6
            };

            CollectionAssert.AreEqual(res, expected);

            var res1 = ncg.findBetween(13, 8);

            res1.Sort();
            Console.Write("Cycle btw 13, 8: " + string.Join(", ", res1));
            var expected1 = new List <int>()
            {
                8, 10, 11, 12, 13
            };

            CollectionAssert.AreEqual(res1, expected1);
        }
Esempio n. 2
0
        static void Main(string[] args)
        {
            string inp  = File.ReadAllText("a.txt");
            var    root = Parser.ParseString(inp);

            // Генерация и получение трёхзначного кода
            var linearCode = new LinearCodeVisitor();

            root?.AcceptVisit(linearCode);
            var code = linearCode.code;


            // Get blocks and print it
            var blocks = LinearToBaseBlock.Build(code);

            foreach (var block in blocks)
            {
                Console.WriteLine(block.ToString());
            }

            // Get graph and made DepthSpanningTree
            var    cfg     = new CFGraph(blocks);
            var    dst     = new DepthSpanningTree(cfg);
            string dst_viz = dst.ToString();

            Console.WriteLine(dst_viz);


            Console.ReadLine();
        }
Esempio n. 3
0
        public void RegionSequenceTest()
        {
            var root   = Parser.ParseString(Samples.SampleProgramText.regionSqeuenceSample);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);
            var cfg    = ListBlocksToCFG.Build(blocks);

            var regSeq    = new RegionSequence(cfg);
            var natCycles = cfg.getNaturalCyclesForBackwardEdges();

            Assert.AreEqual(regSeq.Regions.Count, 24);
            Assert.AreEqual(regSeq.Regions.Last().Header, cfg.GetVertices().ToList()[0]);
            Assert.IsTrue(regSeq.Regions.Exists(r => natCycles[0][0] == r.Header));
        }
Esempio n. 4
0
File: Demos.cs Progetto: koyre/b8
        public void SsaConstructionTest()
        {
            var root   = Parser.ParseString(Samples.SampleProgramText.ssaoptimizationSample2);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);
            var cfg    = new CFGraph(blocks);

            Console.WriteLine("###--------- Input CF Graph ---------###");
            Console.WriteLine(cfg.ToString());
            SsaConstruction ssa = new SsaConstruction(cfg);

            Console.WriteLine("###--------- Output SSA Graph ---------###");
            Console.WriteLine(ssa.SsaForm.ToString());
        }
Esempio n. 5
0
File: Demos.cs Progetto: koyre/b8
        public void CFGraphTest()
        {
            var root       = Parser.ParseString(Samples.SampleProgramText.sample2);
            var linearCode = new LinearCodeVisitor();

            root.AcceptVisit(linearCode);

            var code   = linearCode.code;
            var blocks = LinearToBaseBlock.Build(code);

            var cfg = new CFGraph(blocks);

            Console.WriteLine(cfg.ToString());
        }
Esempio n. 6
0
File: Demos.cs Progetto: koyre/b8
        public void ConstantPropagationTest()
        {
            var root   = Parser.ParseString(Samples.SampleProgramText.constantPropagationSample);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);

            ConstantPropagation constProp = new ConstantPropagation();

            Console.WriteLine(blocks[0]);
            var    resBlock = constProp.OptimizeBlock(blocks[0] as BaseBlock);
            string res      = resBlock.ToString();

            Console.WriteLine(res);
        }
Esempio n. 7
0
File: Demos.cs Progetto: koyre/b8
        public void DSTTest()
        {
            var root       = Parser.ParseString(Samples.SampleProgramText.sample2);
            var linearCode = new LinearCodeVisitor();

            root.AcceptVisit(linearCode);

            var code   = linearCode.code;
            var blocks = LinearToBaseBlock.Build(code);
            var cfg    = new CFGraph(blocks);
            var dst    = new DepthSpanningTree(cfg);

            cfg.ShowCompact = true;
            Console.WriteLine(cfg.ToString());
            Console.WriteLine(dst.ToString());
        }
Esempio n. 8
0
        public void AvailableExpressionsTest()
        {
            Console.Write("----------- Available Expressions Analyzer ---------- \n");
            var root   = Parser.ParseString(Samples.SampleProgramText.AvailableExprsSample);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);
            var cfg    = ListBlocksToCFG.Build(blocks);


            var exprsAnalizer = new AvailableExprAnalyzer(cfg);

            exprsAnalizer.analyze();

            Assert.IsTrue(exprsAnalizer.OutBlocks[blocks[0]].Count == 1);
            Assert.IsTrue(exprsAnalizer.InBlocks[blocks[2]].Count == 1);
            Assert.IsTrue(exprsAnalizer.OutBlocks[blocks[2]].Count == 0);
        }
Esempio n. 9
0
File: Demos.cs Progetto: koyre/b8
        public void allRetreatingEdgesAreBackwardsTest()
        {
            var root   = Parser.ParseString(Samples.SampleProgramText.sample1);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);
            var cfg    = ListBlocksToCFG.Build(blocks);

            cfg.ShowCompact = true;
            Console.WriteLine(cfg);
            Console.WriteLine("allRetreatingEdgesAreBackwards: " + cfg.allRetreatingEdgesAreBackwards());
            Assert.AreEqual(cfg.allRetreatingEdgesAreBackwards(), true);

            root            = Parser.ParseString(Samples.SampleProgramText.veryStrangeCode);
            code            = ProgramTreeToLinear.Build(root);
            blocks          = LinearToBaseBlock.Build(code);
            cfg             = ListBlocksToCFG.Build(blocks);
            cfg.ShowCompact = true;
            Console.WriteLine(cfg);
            Console.WriteLine("allRetreatingEdgesAreBackwards: " + cfg.allRetreatingEdgesAreBackwards());
            Assert.AreEqual(cfg.allRetreatingEdgesAreBackwards(), false);
        }
Esempio n. 10
0
File: Demos.cs Progetto: koyre/b8
        public void SsaCopyPropagationTest()
        {
            var root   = Parser.ParseString(Samples.SampleProgramText.ssaoptimizationSample3);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);
            var cfg    = new CFGraph(blocks);

            Console.WriteLine("###--------- Input CF Graph ---------###");
            Console.WriteLine(cfg.ToString());
            SsaConstruction ssa      = new SsaConstruction(cfg);
            CFGraph         ssaGraph = ssa.SsaForm;

            Console.WriteLine("###--------- Constructed SSA Graph ---------###");
            Console.WriteLine(ssaGraph.ToString());

            SsaCopyPropagation ssaCopyPropagation = new SsaCopyPropagation(ssaGraph);

            ssaCopyPropagation.Launch();
            Console.WriteLine("###--------- Output SSA Graph after copy propagation ---------###");
            Console.WriteLine(ssaCopyPropagation.OptimizedSsaGraph);
        }
Esempio n. 11
0
        public void SymbolicAnalysisTest()
        {
            var root   = Parser.ParseString(Samples.SampleProgramText.symbolicAnalysisSample);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);

            SymbolicAnalysis syman = new SymbolicAnalysis();
            var map = syman.createMap(blocks[0] as BaseBlock);

            Console.WriteLine("baseblock1");
            Console.WriteLine("------");
            foreach (var b in code)
            {
                Console.Write(b.ToString() + " ");
                Console.WriteLine(b.Operation.ToString());
            }
            Console.WriteLine("------");

            root   = Parser.ParseString(Samples.SampleProgramText.symbolicAnalysisSample2);
            code   = ProgramTreeToLinear.Build(root);
            blocks = LinearToBaseBlock.Build(code);

            var map2 = syman.createMap(blocks[0] as BaseBlock);

            Console.WriteLine("baseblock2");
            Console.WriteLine("------");
            foreach (var b in code)
            {
                Console.Write(b.ToString() + " ");
                Console.WriteLine(b.Operation.ToString());
            }
            Console.WriteLine("------");


            Console.WriteLine("symbolic map for block1");
            Console.WriteLine("------");
            foreach (var m in map.variableTable)
            {
                if (m.Key != null)
                {
                    Console.Write(m.Key.ToString() + " ");
                }
                if (m.Value.type != null)
                {
                    Console.WriteLine(m.Value.type.ToString());
                }
                Console.Write("Constants: ");
                if (m.Value.value.constants != null)
                {
                    foreach (var v in m.Value.value.constants)
                    {
                        Console.Write(v.ToString() + " ");
                    }
                }
                Console.Write("Variables: ");
                if (m.Value.value.variables != null)
                {
                    foreach (var v in m.Value.value.variables)
                    {
                        Console.Write(v.ToString() + " ");
                    }
                }
                Console.WriteLine();
            }
            Console.WriteLine("------");

            Console.WriteLine("symbolic map for block2");
            Console.WriteLine("------");
            foreach (var m in map2.variableTable)
            {
                if (m.Key != null)
                {
                    Console.Write(m.Key.ToString() + " ");
                }
                if (m.Value.type != null)
                {
                    Console.WriteLine(m.Value.type.ToString());
                }
                Console.Write("Constants: ");
                if (m.Value.value.constants != null)
                {
                    foreach (var v in m.Value.value.constants)
                    {
                        Console.Write(v.ToString() + " ");
                    }
                }
                Console.Write("Variables: ");
                if (m.Value.value.variables != null)
                {
                    foreach (var v in m.Value.value.variables)
                    {
                        Console.Write(v.ToString() + " ");
                    }
                }
                Console.WriteLine();
            }
            Console.WriteLine("------");

            Console.WriteLine("Composition of map1 and map2 on x = 4 + 3*y + z; instruction");
            var compmap = syman.Composition(code[code.Count - 1], map2, map);

            Console.WriteLine("------");
            foreach (var m in compmap.variableTable)
            {
                if (m.Key != null)
                {
                    Console.Write(m.Key.ToString() + " ");
                }
                if (m.Value.type != null)
                {
                    Console.WriteLine(m.Value.type.ToString());
                }
                Console.Write("Constants: ");
                if (m.Value.value.constants != null)
                {
                    foreach (var v in m.Value.value.constants)
                    {
                        Console.Write(v.ToString() + " ");
                    }
                }
                Console.Write("Variables: ");
                if (m.Value.value.variables != null)
                {
                    foreach (var v in m.Value.value.variables)
                    {
                        Console.Write(v.ToString() + " ");
                    }
                }
                Console.WriteLine();
            }
            Console.WriteLine("------");
        }
Esempio n. 12
0
File: Program.cs Progetto: koyre/b8
        static void Main(string[] args)
        {
            var text = File.ReadAllText("a.txt");
            //text = "n = 0;" +
            //        "if n {" +
            //        "custom_label1:" +
            //        "goto custom_label2;" +
            //        "}" +
            //        "else {" +
            //        "custom_label2:" +
            //        "goto custom_label1;" +
            //        "}";
            var root = Parser.ParseString(text);

            if (root == null)
            {
                Console.WriteLine("Error");
                return;
            }

            // Генерация и получение трёхзначного кода
            var linearCode = new LinearCodeVisitor();

            root.AcceptVisit(linearCode);
            var code = linearCode.code;


            // Get blocks and print it
            var blocks = LinearToBaseBlock.Build(code);

            foreach (var block in blocks)
            {
                Console.WriteLine(block.ToString());
            }

            // Get graph and made DepthSpanningTree
            var cfg = new CFGraph(blocks);

            Console.WriteLine(cfg.ToString());


            var exprsAnalizer = new AvailableExprAnalyzer(cfg);

            exprsAnalizer.analyze();

            var    dst     = new DepthSpanningTree(cfg);
            string dst_viz = dst.ToString();

            Console.WriteLine(dst_viz);

            Console.WriteLine("");

            Console.WriteLine(cfg.EdgeTypes.ToString());


            var f  = cfg.allRetreatingEdgesAreBackwards();
            var r  = cfg.getNaturalCyclesForBackwardEdges();
            var rs = new RegionSequence(cfg);

            Console.ReadLine();
        }