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()); }
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())); }
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()); }
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()); }
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()); }
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()); }
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()); }
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()); }
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> /// 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());