Exemple #1
0
        public void ConstantPropagation()
        {
            string     text  = @"
if 1
{
    x = 2;
    y = 3;
}
else
{
    x = 3;
    y = 2;
}
z = x + y;
";
            SyntaxNode root  = ParserWrap.Parse(text);
            Graph      graph = new Graph(
                BasicBlocksGenerator.CreateBasicBlocks(
                    ThreeAddressCodeGenerator.CreateAndVisit(root).Program));

            var constantPropagationIterative = IterativeAlgorithm.Apply(graph, new ConstantsPropagationParameters());
            var constantPropagationMOP       = MeetOverPaths.Apply(graph, new ConstantsPropagationParameters());
            var it = constantPropagationIterative.Out.Select(
                pair => $"{pair.Key}: {string.Join(", ", pair.Value.Select(ex => ex.ToString()))}");

            foreach (var outInfo in it)
            {
                Trace.WriteLine(outInfo);
            }

            var mop = constantPropagationMOP.Select(
                pair => $"{pair.Key}: {string.Join(", ", pair.Value.Select(ex => ex.ToString()))}");

            Trace.WriteLine("====");
            foreach (var outInfo in mop)
            {
                Trace.WriteLine(outInfo);
            }

            Assert.IsFalse(constantPropagationIterative.In.OrderBy(kvp => kvp.Key).
                           Zip(constantPropagationMOP.OrderBy(kvp => kvp.Key), (v1, v2) =>
                               v1.Key == v2.Key && v1.Value.OrderBy(kvp => kvp.Key).SequenceEqual(v2.Value.OrderBy(kvp => kvp.Key))).All(x => x));
        }
Exemple #2
0
        public void AvailableExpression()
        {
            string     programText      = @"
a = 4;
b = 4;
c = a + b;
if 1 
  a = 3;
else
  b = 2;
print(c);
";
            SyntaxNode root             = ParserWrap.Parse(programText);
            var        threeAddressCode = ThreeAddressCodeGenerator.CreateAndVisit(root).Program;
            var        basicBlocks      = BasicBlocksGenerator.CreateBasicBlocks(threeAddressCode);
            Graph      g = new Graph(basicBlocks);

            var availableExprsIterative = IterativeAlgorithm.Apply(g, new AvailableExpressionsCalculator(g));
            var availableExprsMOP       = MeetOverPaths.Apply(g, new AvailableExpressionsCalculator(g));
            var it = availableExprsIterative.Out.Select(
                pair => $"{pair.Key}: {string.Join(", ", pair.Value.Select(ex => ex.ToString()))}");

            foreach (var outInfo in it)
            {
                Trace.WriteLine(outInfo);
            }

            var mop = availableExprsMOP.Select(
                pair => $"{pair.Key}: {string.Join(", ", pair.Value.Select(ex => ex.ToString()))}");

            Trace.WriteLine("====");
            foreach (var outInfo in mop)
            {
                Trace.WriteLine(outInfo);
            }

            Assert.IsTrue(availableExprsIterative.Out.OrderBy(kvp => kvp.Key).
                          Zip(availableExprsMOP.OrderBy(kvp => kvp.Key), (v1, v2) => v1.Key == v2.Key && v1.Value.SetEquals(v2.Value)).All(x => x));
        }
Exemple #3
0
        public void DeadAliveVariables()
        {
            string     text  = @"
a = 2;
b = 3;

1: c = a + b;
2: a = 3; 
b = 4;
3: c = a;
";
            SyntaxNode root  = ParserWrap.Parse(text);
            Graph      graph = new Graph(
                BasicBlocksGenerator.CreateBasicBlocks(
                    ThreeAddressCodeGenerator.CreateAndVisit(root).Program));

            var deadAliveVarsIterative = IterativeAlgorithm.Apply(graph, new DeadAliveIterativeAlgorithmParameters());
            var deadAliveVarsMOP       = MeetOverPaths.Apply(graph, new DeadAliveIterativeAlgorithmParameters());
            var it = deadAliveVarsIterative.In.Select(
                pair => $"{pair.Key}: {string.Join(", ", pair.Value.Select(ex => ex.ToString()))}");

            foreach (var outInfo in it)
            {
                Trace.WriteLine(outInfo);
            }

            var mop = deadAliveVarsMOP.Select(
                pair => $"{pair.Key}: {string.Join(", ", pair.Value.Select(ex => ex.ToString()))}");

            Trace.WriteLine("====");
            foreach (var outInfo in mop)
            {
                Trace.WriteLine(outInfo);
            }

            Assert.IsTrue(deadAliveVarsIterative.In.OrderBy(kvp => kvp.Key).
                          Zip(deadAliveVarsMOP.OrderBy(kvp => kvp.Key), (v1, v2) => v1.Key == v2.Key && v1.Value.SetEquals(v2.Value)).All(x => x));
        }
        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);
        }