コード例 #1
0
        public void Rebuild_SingleBasicBlock()
        {
            var tacContainer0 = Utils.GetNestedLoopWithCounterInTAC();
            var tacContainer1 = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer1, null, "a", "1");
            Utils.AddAssignmentNode(tacContainer1, null, "b", "10");
            Utils.AddAssignmentNode(tacContainer1, null, "c", "a", "+", "b");

            var cfg = new ControlFlowGraph(tacContainer0);

            cfg.Rebuild(tacContainer1);

            Assert.IsTrue(cfg.IsEdgesEmpty);
            Assert.IsFalse(cfg.IsVerticesEmpty);

            Assert.AreEqual(cfg.EdgeCount, 0);
            Assert.AreEqual(cfg.VertexCount, 1);

            Assert.AreEqual(cfg.Edges.Count(), 0);
            Assert.AreEqual(cfg.Vertices.Count(), 1);

            Assert.IsNotNull(cfg.SourceBasicBlocks);
            Assert.AreEqual(cfg.EntryBlock.ToString(), tacContainer1.ToString());
            Assert.AreEqual(cfg.ExitBlock.ToString(), tacContainer1.ToString());
        }
コード例 #2
0
        public bool Optimize(ThreeAddressCode tac)
        {
            var initialTac = tac.ToString();

            var node = tac.Last;

            while (node != null)
            {
                if (node.Value is TacAssignmentNode assignment)
                {
                    if (assignment.SecondOperand == null && Utility.Utility.IsNum(assignment.FirstOperand))
                    {
                        var key = new VarNodePair(assignment.LeftPartIdentifier, node);
                        if (_detector.Definitions.ContainsKey(key))
                        {
                            foreach (var usage in _detector.Definitions[key])
                            {
                                ChangeByConst(usage.Value, assignment);
                            }
                            _detector.Definitions.Remove(key);
                        }
                    }
                }

                node = node.Previous;
            }

            return(!initialTac.Equals(tac.ToString()));
        }
コード例 #3
0
        public void Optimize_OneCopyPropagation()
        {
            /*
             *      a = b
             *      c = b - a  ---> c = b - b
             *      a = 1
             *      e = d * a  ---> e = d * a
             */

            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, "L1", "a", "b");
            Utils.AddAssignmentNode(tacContainer, null, "c", "b", "-", "a");
            Utils.AddAssignmentNode(tacContainer, null, "a", "1");
            Utils.AddAssignmentNode(tacContainer, null, "e", "d", "*", "a");

            var expectedResult = new ThreeAddressCode();

            Utils.AddAssignmentNode(expectedResult, "L1", "a", "b");
            Utils.AddAssignmentNode(expectedResult, null, "c", "b", "-", "b");
            Utils.AddAssignmentNode(expectedResult, null, "a", "1");
            Utils.AddAssignmentNode(expectedResult, null, "e", "d", "*", "a");

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

            Assert.IsTrue(isOptimized);
            Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString());
        }
コード例 #4
0
        public void Optimize_SimpleBlock()
        {
            TmpNameManager.Instance.Drop();

            /*
             *
             *      x = a;  To be removed
             *  x = b;
             *  y = x + 1;
             */

            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, null, "x", "a");
            Utils.AddAssignmentNode(tacContainer, null, "x", "b");
            Utils.AddAssignmentNode(tacContainer, null, "y", "x", "+", "1");
            Utils.AddAssignmentNode(tacContainer, null, "e", "d", "*", "a");

            var expectedResult = new ThreeAddressCode();

            Utils.AddAssignmentNode(expectedResult, null, "x", "b");
            Utils.AddAssignmentNode(expectedResult, null, "y", "x", "+", "1");
            Utils.AddAssignmentNode(expectedResult, null, "e", "d", "*", "a");

            var optimization = new DeadCodeOptimization();

            var isOptimized = optimization.Optimize(tacContainer);

            Assert.IsTrue(isOptimized);
            Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString());
            isOptimized = optimization.Optimize(tacContainer);
            Assert.IsFalse(isOptimized);
        }
        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());
        }
コード例 #6
0
        public bool Optimize(ThreeAddressCode tac)
        {
            _detector = new DefUseDetector();
            _detector.DetectAndFillDefUse(tac);

            var initialTac = tac.ToString();

            var node = tac.First;

            while (node != null)
            {
                if (node.Value is TacAssignmentNode assignment)
                {
                    if (assignment.SecondOperand == null && Utility.Utility.IsVariable(assignment.FirstOperand))
                    {
                        var key = new VarNodePair(assignment.LeftPartIdentifier, node);
                        if (_detector.Definitions.ContainsKey(key))
                        {
                            foreach (var usage in _detector.Definitions[key])
                            {
                                ChangeByVariable(usage.Value, assignment);
                                var keyAdded      = new VarNodePair(assignment.FirstOperand, usage);
                                var keyDefenition = new VarNodePair(assignment.FirstOperand, node);
                                _detector.Usages[keyAdded] = _detector.Usages[keyDefenition];
                                if (_detector.Usages[keyDefenition] != null)
                                {
                                    var keyUsage = new VarNodePair(assignment.FirstOperand, _detector.Usages[keyDefenition]);
                                    _detector.Definitions[keyUsage].Add(node);
                                }
                            }
                            _detector.Definitions.Remove(key);
                        }
                    }
                }

                node = node.Next;
            }

            return(!initialTac.Equals(tac.ToString()));
        }
        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());
        }
コード例 #8
0
        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());
        }
コード例 #9
0
        public void Optimize_ChangedSecondOperand()
        {
            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, "L1", "t1", "a", "+", "b");
            Utils.AddAssignmentNode(tacContainer, null, "b", "2");
            Utils.AddAssignmentNode(tacContainer, 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(tacContainer);

            Assert.IsFalse(isOptimized);
            Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString());
        }
コード例 #10
0
        public void Optimize_MultipleExpressions()
        {
            var tacContainer = new ThreeAddressCode();

            Utils.AddAssignmentNode(tacContainer, "L1", "t1", "a", "+", "b");
            Utils.AddAssignmentNode(tacContainer, null, "t2", "c", "+", "d");
            Utils.AddAssignmentNode(tacContainer, null, "t3", "c", "+", "d");
            Utils.AddAssignmentNode(tacContainer, 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(tacContainer);

            Assert.IsTrue(isOptimized);
            Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString());
        }
コード例 #11
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);
        }
コード例 #12
0
 /// <summary>
 /// Checks whether the graph contains an edge with specified source and target
 /// </summary>
 public static bool IsContainsEdge(BidirectionalGraph graph,
                                   ThreeAddressCode source, ThreeAddressCode target) =>
 graph.Edges.Any(edge =>
                 edge.Source.ToString() == source.ToString() &&
                 edge.Target.ToString() == target.ToString());