Exemplo n.º 1
0
        public void OneRootLoopsTest()
        {
            var TAC = GenTAC(@"
var a, b;

54: a = 5;
b = 6;
goto 54;
goto 54;

");

            var cfg      = new ControlFlowGraph(BasicBlockLeader.DivideLeaderToLeader(TAC));
            var actual   = NaturalLoop.GetAllNaturalLoops(cfg);
            var expected = new List <List <BasicBlock> >()
            {
                new List <BasicBlock>()
                {
                    new BasicBlock(new List <Instruction>()
                    {
                        TAC[0], TAC[1], TAC[2]
                    })
                },
            };

            AssertSet(expected, actual);
        }
Exemplo n.º 2
0
        public void OneRootLoopsTest()
        {
            var TAC = GenTAC(@"
var a, b;

54: a = 5;
b = 6;
goto 54;
goto 54;

");

            var cfg      = GenCFG(TAC);
            var actual   = NaturalLoop.GetAllNaturalLoops(cfg);
            var expected = new List <List <BasicBlock> >()
            {
                new List <BasicBlock>()
                {
                    new BasicBlock(new List <Instruction>()
                    {
                        TAC[0], TAC[1], TAC[2]
                    })
                },
            };

            AssertSet(expected, actual);
        }
Exemplo n.º 3
0
        public void IntersectingLoops()
        {
            var TAC = GenTAC(@"
var a, b;

54: a = 5;
55: a = 6;
b = 6;
goto 54;
goto 55;
");
            var cfg = GenCFG(TAC);

            var actual   = NaturalLoop.GetAllNaturalLoops(cfg);
            var expected = new List <List <BasicBlock> >()
            {
                new List <BasicBlock>()
                {
                    new BasicBlock(new List <Instruction>()
                    {
                        TAC[0]
                    }),
                    new BasicBlock(new List <Instruction>()
                    {
                        TAC[1], TAC[2], TAC[3]
                    }),
                }
            };

            AssertSet(expected, actual);
        }
Exemplo n.º 4
0
        public NaturalLoop GetLoopFromBlocksCode(params string[] blocksCode)
        {
            var result = new NaturalLoop(null, null);

            foreach (var code in blocksCode)
            {
                var block    = GenerateTAC(code);
                var TACBlock = new TACBaseBlocks(block.Instructions);
                TACBlock.GenBaseBlocks();
                result.AddBlock(TACBlock.blocks[0]);
            }
            return(result);
        }
Exemplo n.º 5
0
        public CFGregions(ControlFlowGraph cfg)
        {
            cycles = NaturalLoop.GetAllNaturalLoops(cfg).OrderBy(x => x.Count).Where(x => x.Count > 0).Select(x => new List <BasicBlock>(x)).ToList();
            blocks = cfg.GetCurrentBasicBlocks().ToHashSet();
            var i = 0;

            foreach (var elem in blocks)
            {
                var index = cfg.VertexOf(elem);
                if (i++ != index)
                {
                    throw new Exception();
                }

                children.Add(elem, cfg.GetChildrenBasicBlocks(index).Select(x => x.block).ToList());
            }
            FindRegions();
        }
Exemplo n.º 6
0
        public void IrreducibilityGraphTest2()
        {
            var program = @"
var a, b, c, d, x, u, e,g, y,zz,i;
for i = 1, 10
{
a = b;
1: c = d;
goto 2;
}
2: x = u;
goto 1;
";

            var cfg      = GenCFG(program);
            var actual   = NaturalLoop.GetAllNaturalLoops(cfg);
            var expected = new List <List <BasicBlock> >();

            AssertSet(expected, actual);
        }
Exemplo n.º 7
0
        public void IrreducibilityGraphTest2()
        {
            var TAC = GenTAC(@"
var a, b, c, d, x, u, e,g, y,zz,i;
for i = 1, 10
{
a = b;
1: c = d;
goto 2;
}
2: x = u;
goto 1;
");

            var cfg      = new ControlFlowGraph(BasicBlockLeader.DivideLeaderToLeader(TAC));
            var actual   = NaturalLoop.GetAllNaturalLoops(cfg);
            var expected = new List <List <BasicBlock> >();

            AssertSet(expected, actual);
        }
Exemplo n.º 8
0
        public static void Main()
        {
            var FileName = @"../../../a.txt";

            try
            {
                var Text = File.ReadAllText(FileName);

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

                var parser = new Parser(scanner);

                var b = parser.Parse();
                if (!b)
                {
                    Console.WriteLine("Error");
                }
                else
                {
                    Console.WriteLine("Syntax tree built");

                    var fillParents = new FillParentsVisitor();
                    parser.root.Visit(fillParents);

                    var pp = new PrettyPrintVisitor();
                    parser.root.Visit(pp);
                    Console.WriteLine(pp.Text);

                    ASTOptimizer.Optimize(parser);
                    Console.WriteLine("\n\nAfter AST optimizations");
                    pp = new PrettyPrintVisitor();
                    parser.root.Visit(pp);
                    Console.WriteLine(pp.Text);

                    Console.WriteLine("\n\nThree address code");
                    var threeAddrCodeVisitor = new ThreeAddrGenVisitor();
                    parser.root.Visit(threeAddrCodeVisitor);
                    var threeAddressCode = threeAddrCodeVisitor.Instructions;
                    foreach (var instruction in threeAddressCode)
                    {
                        Console.WriteLine(instruction);
                    }

                    Console.WriteLine("\n\nOptimized three address code");
                    var optResult = ThreeAddressCodeOptimizer.OptimizeAll(threeAddressCode);
                    foreach (var x in optResult)
                    {
                        Console.WriteLine(x);
                    }

                    Console.WriteLine("\n\nDivided three address code");
                    var divResult = BasicBlockLeader.DivideLeaderToLeader(optResult);


                    foreach (var x in divResult)
                    {
                        foreach (var y in x.GetInstructions())
                        {
                            Console.WriteLine(y);
                        }
                        Console.WriteLine("--------------");
                    }

                    var cfg = new ControlFlowGraph(divResult);

                    Console.WriteLine("\n\n Edge Classification");
                    Console.WriteLine("----------");

                    foreach (var pair in cfg.ClassifiedEdges)
                    {
                        Console.WriteLine(pair);
                    }

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


                    foreach (var block in cfg.GetCurrentBasicBlocks())
                    {
                        Console.WriteLine($"{cfg.VertexOf(block)}  {block.GetInstructions()[0]}");
                        var children    = cfg.GetChildrenBasicBlocks(cfg.VertexOf(block));
                        var childrenStr = string.Join(" | ", children.Select(v => v.block.GetInstructions()[0].ToString()));
                        Console.WriteLine($" children: {childrenStr}");

                        var parents    = cfg.GetParentsBasicBlocks(cfg.VertexOf(block));
                        var parentsStr = string.Join(" | ", parents.Select(v => v.block.GetInstructions()[0].ToString()));
                        Console.WriteLine($" parents: {parentsStr}");
                    }

                    ///
                    /// LiveVariableAnalysisAlgorithm
                    ///
                    Console.WriteLine("------------");
                    Console.WriteLine();
                    var activeVariable    = new LiveVariables();
                    var resActiveVariable = activeVariable.Execute(cfg);

                    foreach (var x in resActiveVariable)
                    {
                        foreach (var y in x.Value.In)
                        {
                            Console.WriteLine("In " + y);
                        }
                        Console.WriteLine();
                        foreach (var y in x.Value.Out)
                        {
                            Console.WriteLine("Out " + y);
                        }
                    }


                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine("NatLoop");
                    var natLoops = NaturalLoop.GetAllNaturalLoops(cfg);
                    foreach (var x in natLoops)
                    {
                        if (x.Count == 0)
                        {
                            continue;
                        }
                        //Console.WriteLine("Loop");
                        for (var i = 0; i < x.Count; i++)
                        {
                            Console.WriteLine("NumberBlock:" + i);
                            foreach (var xfrom in x[i].GetInstructions())
                            {
                                Console.WriteLine(xfrom.ToString());
                            }
                        }
                        Console.WriteLine();
                        Console.WriteLine("-------------");
                    }

                    Console.WriteLine(" \nDone");
                }
            }
            catch (FileNotFoundException)
            {
                Console.WriteLine("File {0} not found", FileName);
            }
            catch (LexException e)
            {
                Console.WriteLine("Lex Error. " + e.Message);
            }
            catch (SyntaxException e)
            {
                Console.WriteLine("Syntax Error. " + e.Message);
            }
            _ = Console.ReadLine();
        }
Exemplo n.º 9
0
        internal static string GetGraphInformation(ControlFlowGraph cfg)
        {
            var str = new StringBuilder();

            str.AppendLine("Доминаторы:");
            var domTree = new DominatorTree().GetDominators(cfg);

            foreach (var pair in domTree)
            {
                foreach (var x in pair.Value)
                {
                    str.AppendLine($"{cfg.VertexOf(x)} dom {cfg.VertexOf(pair.Key)}");
                }
                str.AppendLine("----------------");
            }


            str.AppendLine("\r\nКлассификация ребер:");

            foreach (var pair in cfg.ClassifiedEdges)
            {
                str.AppendLine($"{ pair }");
            }

            str.AppendLine("\r\nОбходы графа:");

            str.AppendLine($"Прямой: { string.Join(" -> ", cfg.PreOrderNumeration) }");
            str.AppendLine($"Обратный: { string.Join(" -> ", cfg.PostOrderNumeration) }");

            str.AppendLine($"\r\nГлубинное остовное дерево:");
            foreach (var x in cfg.DepthFirstSpanningTree)
            {
                str.AppendLine($"({x.from} - > {x.to})");
            }

            var backEdges = cfg.GetBackEdges();

            if (backEdges.Count > 0)
            {
                str.AppendLine("\r\nОбратные ребра:");
                foreach (var x in backEdges)
                {
                    str.AppendLine($"({cfg.VertexOf(x.Item1)}, {cfg.VertexOf(x.Item2)})");
                }
            }
            else
            {
                str.AppendLine("\r\nОбратных ребер нет");
            }


            var answ = cfg.IsReducibleGraph() ? "Граф приводим" : "Граф неприводим";

            str.AppendLine($"\r\n{answ}");

            if (cfg.IsReducibleGraph())
            {
                var natLoops = NaturalLoop.GetAllNaturalLoops(cfg);
                if (natLoops.Count > 0)
                {
                    str.AppendLine($"\r\nЕстественные циклы:");
                    foreach (var x in natLoops)
                    {
                        if (x.Count == 0)
                        {
                            continue;
                        }
                        for (var i = 0; i < x.Count; i++)
                        {
                            str.AppendLine($"Номер блока: {i}");
                            foreach (var xfrom in x[i].GetInstructions())
                            {
                                str.AppendLine(xfrom.ToString());
                            }
                        }
                        str.AppendLine();
                        str.AppendLine("-------------");
                    }
                }
                else
                {
                    str.AppendLine($"\r\nЕстественных циклов нет");
                }
            }
            else
            {
                str.AppendLine($"\r\nНевозможно определить естественные циклы, т.к. граф неприводим");
            }

            return(str.ToString());
        }
Exemplo n.º 10
0
 public bool RawLoopsAreEqual(NaturalLoop first, string[] second)
 {
     return(first.EqualsToString(second));
 }