public void DefUseBBlocks_CopyPropagationTest() { TmpNameManager.Instance.Drop(); var tacVisitor = new ThreeAddressCodeVisitor(); var expectedResult = "a = 42 \nt1 = a + 10\nx = t1 \nz = 1 \nt2 = t1 + y\nb = t2 \nt3 = a * z\nt4 = t3 / t1\nt5 = 100 + t4\nv = t5 \nt6 = t1 + t2\nt7 = z + t6\nvar1 = t7 \n"; var source = "a = 42;\nx = a + 10;\nz = 1;\nb = x + y;\nv = 100 + (a * z) / x;\nvar1 = z + (x + b);\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(); var defUseConstPropagation = new DefUseCopyPropagation(); var result = defUseConstPropagation.Optimize(tacVisitor.TACodeContainer); while (result) { result = defUseConstPropagation.Optimize(tacVisitor.TACodeContainer); } Assert.AreEqual(expectedResult, tacVisitor.TACodeContainer.ToString()); }
public void SplitTACode_ThreeBasicBlocks() { var source = "goto l 7:" + "g = 34;" + "l 7:"; /* * goto l 7; * g = 34; * l 7: */ 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 bblocks = new BasicBlocks(); bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer); Assert.AreEqual(3, bblocks.BasicBlockItems.Count); }
public void Visit_NestedLoopWithCounter() { const string source = "a = 1;\n" + "for (i = 1 to 10)\n" + " for (j = 1 to 10)\n" + " a = a + 1;"; var scanner = new Scanner(); scanner.SetSource(source, 0); /* * a = 1; * for (i = 1 to 10) * for (j = 1 to 10) * a = a + 1; */ var expectedResult = Utils.GetNestedLoopWithCounterInTAC(); var parser = new Parser(scanner); parser.Parse(); var root = parser.root; var tacVisitor = new ThreeAddressCodeVisitor(); root.Visit(tacVisitor); Assert.AreEqual(tacVisitor.TACodeContainer.ToString(), expectedResult.ToString()); }
public void Optimize_DivisionInts() { var threeAddressCodeVisitor = new ThreeAddressCodeVisitor(); threeAddressCodeVisitor.TACodeContainer.PushNode( new TacAssignmentNode() { LeftPartIdentifier = "t1", FirstOperand = "4", Operation = "/", SecondOperand = "2" }); var isOptimized = new ConvConstOptimization().Optimize(threeAddressCodeVisitor.TACodeContainer); var optimizedTac = threeAddressCodeVisitor.TACodeContainer.TACodeLines.First.Value as TacAssignmentNode; var res = new TacAssignmentNode() { LeftPartIdentifier = "t1", FirstOperand = "2" }; Assert.IsTrue(isOptimized); Assert.AreEqual(optimizedTac.ToString(), res.ToString()); }
public void SplitTACode_FourBasicBlocks() { var source = "a = 123;" + "if (a > 444) {" + "g = 34;" + "}"; /* * a = 123; * if (a > 44) { * g = 34; * } */ 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 bblocks = new BasicBlocks(); bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer); Assert.AreEqual(4, bblocks.BasicBlockItems.Count); }
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 void SplitTACode_OneBasicBlock() { var source = "c = 9;\na = c == c;\n"; /* * c = 9; * a = c == c; */ 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 bblocks = new BasicBlocks(); bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer); Assert.AreEqual(1, bblocks.BasicBlockItems.Count); }
public ControlFlowGraph(ThreeAddressCodeVisitor code) { var code_blocks = new Block.Block(code); this.blocks = code_blocks.GenerateBlocks(); cfg = new Graph(this.blocks.Count); GenerateCFG(); }
public List <LinkedList <ThreeCode> > Apply(ThreeAddressCodeVisitor visit) { Block.Block bl = new Block.Block(visit); List <LinkedList <ThreeCode> > res = bl.GenerateBlocks(); Apply(ref res); return(res); }
static void Main(string[] args) { var DirectoryPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName; string FileName = Path.Combine(DirectoryPath, "a.txt"); try { string Text = File.ReadAllText(FileName); Text = Text.Replace('\t', ' '); Scanner scanner = new Scanner(); scanner.SetSource(Text, 0); Parser parser = new Parser(scanner); var b = parser.Parse(); var r = parser.root; var printv = new PrettyPrintVisitor(true); r.Visit(printv); Console.WriteLine("Текст программы:"); Console.WriteLine(printv.Text); Console.WriteLine(); var threeAddressCodeVisitor = new ThreeAddressCodeVisitor(); r.Visit(threeAddressCodeVisitor); threeAddressCodeVisitor.Postprocess(); var cfg = new ControlFlowGraph(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("CFG: "); Console.WriteLine(cfg); Console.WriteLine("DominationBorder: "); foreach (var vertex in cfg.Vertices) { Console.WriteLine(); Console.WriteLine("vertex: \n" + vertex); var borderSet = DominationBorder.Execute(cfg, vertex); string borderStr = ""; foreach (var el in borderSet) { borderStr += el + "\n"; } if (borderSet.Count() == 0) { borderStr = "Empty"; } Console.WriteLine("borderSet: \n\n" + borderStr); Console.WriteLine(); } } catch (FileNotFoundException) { Console.WriteLine("Файл {0} не найден", FileName); } catch (Exception e) { Console.WriteLine("{0}", e); } }
public List <LinkedList <ThreeCode> > Apply(ThreeAddressCodeVisitor visit) { Block.Block bl = new Block.Block(visit); List <LinkedList <ThreeCode> > res = bl.GenerateBlocks(); for (int i = 0; i < res.Count; i++) { Apply(res[i]); } return(res); }
static private ThreeAddressCode GetCodeLinesByText(string text) { Scanner scanner = new Scanner(); scanner.SetSource(text, 0); Parser parser = new Parser(scanner); var b = parser.Parse(); var r = parser.root; var threeAddressCodeVisitor = new ThreeAddressCodeVisitor(); r.Visit(threeAddressCodeVisitor); return(threeAddressCodeVisitor.TACodeContainer); }
static void TacTests(Parser parser) // 14.04 { var pf = new FillParentVisitor(); parser.root.Visit(pf); //var ne = new NumberEqualityVisitor(); //parser.root.Visit(ne); //var ifelse = new AlwaysIfOrElseVisitor(); //parser.root.Visit(ifelse); var tac = new ThreeAddressCodeVisitor(); parser.root.Visit(tac); Console.WriteLine("Tac code: \n"); Console.WriteLine(tac.TACodeContainer.ToString()); }
public void Optimize_IsNotOptimized() { var threeAddressCodeVisitor = new ThreeAddressCodeVisitor(); threeAddressCodeVisitor.TACodeContainer.PushNode( new TacAssignmentNode() { LeftPartIdentifier = "t1", FirstOperand = "4", Operation = "!=", SecondOperand = "a" }); var isOptimized = new ConvConstOptimization().Optimize(threeAddressCodeVisitor.TACodeContainer); Assert.IsFalse(isOptimized); }
public void Optimize_RightOptimized2() { var tacContainer = new ThreeAddressCode(); Utils.AddAssignmentNode(tacContainer, null, "t1", "4", "*", "i"); Utils.AddAssignmentNode(tacContainer, null, "a1", "t1"); Utils.AddAssignmentNode(tacContainer, null, "t2", "b"); Utils.AddAssignmentNode(tacContainer, null, "i", "1"); Utils.AddIfGotoNode(tacContainer, null, "L1", "t2"); Utils.AddGotoNode(tacContainer, null, "L2"); Utils.AddAssignmentNode(tacContainer, "L1", "t3", "4", "*", "i"); Utils.AddAssignmentNode(tacContainer, null, "a3", "t3"); Utils.AddAssignmentNode(tacContainer, "L2", "t4", "4", "*", "i"); Utils.AddAssignmentNode(tacContainer, null, "a2", "t4"); var expectedResult = new ThreeAddressCodeVisitor(); Utils.AddAssignmentNode(expectedResult, null, "t1", "4", "*", "i"); Utils.AddAssignmentNode(expectedResult, null, "a1", "t1"); Utils.AddAssignmentNode(expectedResult, null, "i", "1"); Utils.AddAssignmentNode(expectedResult, null, "t2", "b"); Utils.AddIfGotoNode(expectedResult, null, "L1", "t2"); Utils.AddGotoNode(expectedResult, null, "L2"); Utils.AddAssignmentNode(expectedResult, null, "t5", "4", "*", "1"); Utils.AddAssignmentNode(expectedResult, "L1", "t3", "t5"); Utils.AddAssignmentNode(expectedResult, null, "a3", "t3"); Utils.AddAssignmentNode(expectedResult, null, "t5", "4", "*", "1"); Utils.AddAssignmentNode(expectedResult, "L2", "t4", "t5"); Utils.AddAssignmentNode(expectedResult, null, "a2", "t4"); var cfg = new ControlFlowGraph(tacContainer); E_GenKillVisitor availExprVisitor = new E_GenKillVisitor(); var availExprContainers = availExprVisitor.GenerateAvailableExpressionForBlocks(cfg.SourceBasicBlocks); var availableExpressionsITA = new AvailableExpressionsITA(cfg, availExprContainers); var availableExprOptimization = new AvailableExprOptimization(); bool isOptimized = availableExprOptimization.Optimize(availableExpressionsITA); var basicBlockItems = cfg.SourceBasicBlocks.BasicBlockItems; var codeText = cfg.SourceBasicBlocks.BasicBlockItems .Select(bl => bl.ToString()).Aggregate((b1, b2) => b1 + b2); Assert.IsTrue(isOptimized); }
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()); }
static void TacConstantsAndCopies(Parser parser) // 14.04 { var pf = new FillParentVisitor(); parser.root.Visit(pf); var taco = new ThreeAddressCodeVisitor(); parser.root.Visit(taco); var tacCode = taco.TACodeContainer; Console.WriteLine("Tac code before: \n"); Console.WriteLine(tacCode.ToString()); var cc = new CopyAndConstantsOptimizer(tacCode); Console.WriteLine("Tac code after: \n"); Console.WriteLine(tacCode.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 tacVisitor = new ThreeAddressCodeVisitor(); Utils.AddAssignmentNode(tacVisitor, "L1", "t1", "a", "+", "b"); Utils.AddAssignmentNode(tacVisitor, null, "b", "2"); Utils.AddAssignmentNode(tacVisitor, 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(tacVisitor.TACodeContainer); Assert.IsFalse(isOptimized); Assert.AreEqual(tacVisitor.ToString(), expectedResult.ToString()); }
/// <summary> /// Parses the source code of the program and converts it into a three-address code /// </summary> protected ThreeAddressCode GetTAC(string source) { var scanner = new Scanner(); scanner.SetSource(source, 0); var parser = new Parser(scanner); if (!parser.Parse()) { throw new Exception("An error occurred while parsing the program."); } var root = parser.root; var tacVisitor = new ThreeAddressCodeVisitor(); root.Visit(tacVisitor); return(tacVisitor.TACodeContainer); }
public void Optimize_MultipleExpressions() { var tacVisitor = new ThreeAddressCodeVisitor(); Utils.AddAssignmentNode(tacVisitor, "L1", "t1", "a", "+", "b"); Utils.AddAssignmentNode(tacVisitor, null, "t2", "c", "+", "d"); Utils.AddAssignmentNode(tacVisitor, null, "t3", "c", "+", "d"); Utils.AddAssignmentNode(tacVisitor, 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(tacVisitor.TACodeContainer); Assert.IsTrue(isOptimized); Assert.AreEqual(tacVisitor.ToString(), expectedResult.ToString()); }
public void Optimize_ChangedOperandThenTwiceRepeatedExpression() { var tacContainer = new ThreeAddressCode(); Utils.AddAssignmentNode(tacContainer, "L1", "t1", "a", "+", "b"); Utils.AddAssignmentNode(tacContainer, null, "b", "2"); Utils.AddAssignmentNode(tacContainer, null, "t2", "a", "+", "b"); Utils.AddAssignmentNode(tacContainer, null, "t3", "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"); Utils.AddAssignmentNode(expectedResult, null, "t3", "t2"); var optimization = new CommonSubexprOptimization(); var isOptimized = optimization.Optimize(tacContainer); Assert.IsTrue(isOptimized); Assert.AreEqual(tacContainer.ToString(), expectedResult.ToString()); }
public void Optimize_CombinationOfBlocks() { /* * x = b; * x = a; --> Should be deleted despite of it's latest operation in block * if (1==1) * { * x = b; * y = x; * } * x = 1; * v = x; */ TmpNameManager.Instance.Drop(); var tacVisitor = new ThreeAddressCodeVisitor(); var expectedResult = "t1 = 1 == 1\nif t1 goto L1\n"; var source = "x = b;\nx = a;\nif (1==1){\nx = b;\n y = x;\n}\n x = 1;\n v = x;\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(); var cfg = new ControlFlowGraph(tacVisitor.TACodeContainer); var defUseContainers = DefUseForBlocksGenerator.Execute(cfg.SourceBasicBlocks); var activeVariablesITA = new ActiveVariablesITA(cfg, defUseContainers); DeadCodeOptimizationWithITA optimization = new DeadCodeOptimizationWithITA(); var isOptimized = optimization.Optimize(activeVariablesITA); Assert.AreEqual(expectedResult, activeVariablesITA.controlFlowGraph.SourceBasicBlocks.BasicBlockItems[0].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> /// Creates and pushes assignment node to the end of the visitor's tac container /// </summary> public static void AddAssignmentNode(ThreeAddressCodeVisitor tacVisitor, string label, string id, string firstOp, string op = null, string secondOp = null) { AddAssignmentNode(tacVisitor.TACodeContainer, label, id, firstOp, op, secondOp); }
public static void Main(string[] args) { string FileName = @"../../../data/DeadOrAliveOptimizationTest.txt"; if (args.Length > 0) { FileName = args[0]; } try { string Text = File.ReadAllText(FileName); Scanner scanner = new Scanner(); scanner.SetSource(Text, 0); Parser parser = new Parser(scanner); var b = parser.Parse(); if (!b) { Console.WriteLine("Ошибка"); } else { Console.WriteLine("Синтаксическое дерево построено"); var r = parser.root; FillParentVisitor generateParrent = new FillParentVisitor(); r.Visit(generateParrent); { ThreeAddressCodeVisitor treeCod2e = new ThreeAddressCodeVisitor(); r.Visit(treeCod2e); //var blocks = new Block(treeCod2e).GenerateBlocks(); AutoThreeCodeOptimiser ap2p = new AutoThreeCodeOptimiser(); ap2p.Add(new DeadOrAliveOptimizationAdapter()); var blockwss = ap2p.Apply(treeCod2e); Console.WriteLine(ThreeAddressCodeVisitor.ToString(blockwss)); } //Console.WriteLine(r.ToString()); /*Opt2Visitor opt2 = new Opt2Visitor(); * r.Visit(opt2); * * PrettyPrintVisitor ppvis = new PrettyPrintVisitor(); * r.Visit(ppvis); * Console.WriteLine(ppvis.Text); * * Console.WriteLine("\nAssignCountVisitor"); * AssignCountVisitor vis1 = new AssignCountVisitor(); * r.Visit(vis1); * Console.WriteLine(vis1.Count); * * Console.WriteLine("\nStatementCountVisitor"); * StatementCountVisitor vis2 = new StatementCountVisitor(); * r.Visit(vis2); * Console.WriteLine(vis2.Count); * * Console.WriteLine("\nMaxCountExprOpsVisitor"); * MaxCountExprOpsVisitor vis3 = new MaxCountExprOpsVisitor(); * r.Visit(vis3); * Console.WriteLine(vis3.Max); * * Console.WriteLine("\nNestedCyclesVisitor"); * NestedCyclesVisitor vis4 = new NestedCyclesVisitor(); * r.Visit(vis4); * Console.WriteLine(vis4.HasNestedCycles); * * Console.WriteLine("\nCycleNestedToIfVisitor"); * CycleNestedToIfVisitor vis5 = new CycleNestedToIfVisitor(); * r.Visit(vis5); * Console.WriteLine(vis5.HasCycleNestedToIf); * * Console.WriteLine("\nIfNestedToCycleVisitor"); * IfNestedToCycleVisitor vis6 = new IfNestedToCycleVisitor(); * r.Visit(vis6); * Console.WriteLine(vis6.HasIfNestedToCycle); * * Console.WriteLine("\nMaxDepthOfNestedCyclesVisitor"); * MaxDepthOfNestedCyclesVisitor vis7 = new MaxDepthOfNestedCyclesVisitor(); * r.Visit(vis7); * Console.WriteLine(vis7.Max);*/ Console.WriteLine("\nGenerate Three address code"); ThreeAddressCodeVisitor treeCode = new ThreeAddressCodeVisitor(); r.Visit(treeCode); var blocks = new Block(treeCode).GenerateBlocks(); CFG controlFlowGraph = new CFG(blocks); Console.WriteLine("\nГлубина графа:\n" + GraphDepth.GetGraphDepth(controlFlowGraph)); Console.WriteLine(treeCode.ToString()); // выполнение оптимизации для программы, не разбитой на блоки //DeadOrAliveOptimization.DeleteDeadVariables(treeCode.GetCode()); // вычисление множеств Def и Use для всего графа потоков данных /*var DefUse = new DefUseBlocks(controlFlowGraph); * * var InOut = new InOutActiveVariables(DefUse, controlFlowGraph); * * ControlFlowOptimisations.DeadOrAliveOnGraph(InOut, controlFlowGraph); * * var DefUse = new DefUseBlocks(controlFlowGraph); * * GraphToDOTHelper.SaveAsDOT("C:\\Users\\vladr\\Desktop\\graph.dot", controlFlowGraph); * var InOut = new InOutActiveVariables(DefUse, controlFlowGraph); * * //ControlFlowOptimisations.DeadOrAliveOnGraph(InOut, controlFlowGraph); * Console.WriteLine("\nafter DeleteDeadVariables for graph\n"); * foreach (var block in controlFlowGraph.blocks) * foreach (var line in block) * Console.WriteLine(line); * * Console.Write("");*/ //DeadOrAliveOptimization. /* SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); * gen.Generate(treeCode.GetCode()); * * gen.PrintCommands(); * Console.WriteLine("\nExecute:"); * gen.Execute(); * * Console.Write("");*/ //DeadOrAliveOptimization. /*CFG cfg = SimpleLang.GenericIterativeAlgorithm.Test * .DeadOrAliveOptimization(controlFlowGraph.blocks); * Console.WriteLine("\nafter DeadOrAliveOptimization\n"); * Console.WriteLine(cfg);*/ /*var constPropOptimizer = new ConstantPropagationOptimizer(); * CFG cfg1 = constPropOptimizer.ApplyOptimization(controlFlowGraph.blocks); * Console.WriteLine("\nafter ConstantPropagationOptimization\n"); * Console.WriteLine(cfg1);*/ //var reachingDefsTest = new ReachingDefsTest(); //reachingDefsTest.IterativeAlgorithm(controlFlowGraph.blocks); //reachingDefsTest.PrintOutput(); //SimpleLang.Compiler.ILCodeGenerator gen = new SimpleLang.Compiler.ILCodeGenerator(); //gen.Generate(treeCode.GetCode()); //gen.PrintCommands(); //Console.WriteLine("\nExecute:"); //gen.Execute(); AutoThreeCodeOptimiser app = new AutoThreeCodeOptimiser(); app.Add(new DistributionOfConstants()); app.Add(new EvalConstExpr()); app.Add(new ApplyAlgebraicIdentities()); var blockws = app.Apply(treeCode); Console.WriteLine(ThreeAddressCodeVisitor.ToString(blockws)); /*CFG cfg = new CFG(blocks); * TransferFunction tf = new TransferFunction(cfg); * Console.WriteLine("\nGen 1"); * foreach (var d in tf.Gen(blocks[0])) * Console.WriteLine(d); * Console.WriteLine("\nGen"); * foreach (var d in tf.Gen(blocks[3])) * Console.WriteLine(d); * Console.WriteLine("\nKill"); * foreach (var d in tf.Kill(blocks[3])) * Console.WriteLine(d); * * Console.WriteLine("\nTransfer function"); * var f = tf.BlockTransferFunction(blocks[3]); * foreach (var d in f(tf.Gen(blocks[0]))) * Console.WriteLine(d); * * var code = treeCode.GetCode(); * app.Apply(code);*/ /*Opt11Visitor opt11vis = new Opt11Visitor(); * ppvis.Text = ""; * r.Visit(opt11vis); * r.Visit(ppvis); * Console.WriteLine(ppvis.Text);*/ /*var avis = new AssignCountVisitor(); * parser.root.Visit(avis); * Console.WriteLine("Количество присваиваний = {0}", avis.Count); * Console.WriteLine("-------------------------------"); * * var pp = new PrettyPrintVisitor(); * parser.root.Visit(pp); * Console.WriteLine(pp.Text);*/ } } catch (FileNotFoundException) { Console.WriteLine("Файл {0} не найден", FileName); } catch (Exception e) { Console.WriteLine("{0}", e); } Console.ReadLine(); // ======== // My part, don't touch !!! // Sorry for this troubles, I deleted bad part // CFG controlFlowGraph = new CFG(blocks); // Console.WriteLine(treeCode.ToString()); // // выполнение оптимизации для программы, не разбитой на блоки // //DeadOrAliveOptimization.DeleteDeadVariables(treeCode.GetCode()); // // вычисление множеств Def и Use для всего графа потоков данных // var DefUse = new DefUseBlocks(controlFlowGraph); // // var InOut = new InOutActiveVariables(DefUse, controlFlowGraph); // // ControlFlowOptimisations.DeadOrAliveOnGraph(InOut, controlFlowGraph); // Console.WriteLine("\nafter DeleteDeadVariables for graph\n"); // foreach (var block in controlFlowGraph.blocks) // foreach (var line in block) // Console.WriteLine(line); // Console.Write(""); // ======== }
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); }
public static void Main() { var DirectoryPath = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName; string FileName = Path.Combine(DirectoryPath, "a.txt"); try { string Text = File.ReadAllText(FileName); Text = Text.Replace('\t', ' '); Scanner scanner = new Scanner(); scanner.SetSource(Text, 0); Parser parser = new Parser(scanner); var b = parser.Parse(); var r = parser.root; // Console.WriteLine(r); Console.WriteLine("Исходный текст программы"); var printv = new PrettyPrintVisitor(true); r.Visit(printv); Console.WriteLine(printv.Text); Console.WriteLine("-------------------------------"); if (!b) { Console.WriteLine("Ошибка"); } else { Console.WriteLine("Синтаксическое дерево построено"); // TODO: add loop through all tree optimizations var avis = new AssignCountVisitor(); parser.root.Visit(avis); Console.WriteLine("Количество присваиваний = {0}", avis.Count); Console.WriteLine("-------------------------------"); var operv = new OperatorCountVisitor(); parser.root.Visit(operv); Console.WriteLine(operv.Result); var maxcv = new MaxOpExprVisitor(); parser.root.Visit(maxcv); Console.WriteLine(maxcv.Result); var inncycv = new IsInnerCycleVisitor(); parser.root.Visit(inncycv); Console.WriteLine(inncycv.Result); var innifv = new IsInnerIfCycleVisitor(); parser.root.Visit(innifv); Console.WriteLine(innifv.Result); var maxdeepv = new MaxDeepCycleVistor(); parser.root.Visit(maxdeepv); Console.WriteLine(maxdeepv.Result); var parentv = new FillParentVisitor(); parser.root.Visit(parentv); var sameminusv = new SameMinusOptVisitor(); parser.root.Visit(sameminusv); var zeroMulVisitor = new ZeroMulOptVisitor(); parser.root.Visit(zeroMulVisitor); var compareFalseVisitor = new CompareToItselfFalseOptVisitor(); parser.root.Visit(compareFalseVisitor); Console.WriteLine("-------------------------------"); var ifNodeWithBoolExpr = new IfNodeWithBoolExprVisitor(); parser.root.Visit(ifNodeWithBoolExpr); //var plusZeroExpr = new PlusZeroExprVisitor(); //parser.root.Visit(plusZeroExpr); //var alwaysElse = new AlwaysElseVisitor(); //parser.root.Visit(alwaysElse); //var checkTruth = new CheckTruthVisitor(); //parser.root.Visit(checkTruth); //Console.WriteLine("Оптимизированная программа"); //printv = new PrettyPrintVisitor(true); //r.Visit(printv); //Console.WriteLine(printv.Text); //Console.WriteLine("-------------------------------"); Console.WriteLine("Оптимизированная программа"); printv = new PrettyPrintVisitor(true); r.Visit(printv); Console.WriteLine(printv.Text); Console.WriteLine("-------------------------------"); var threeAddressCodeVisitor = new ThreeAddressCodeVisitor(); r.Visit(threeAddressCodeVisitor); var cfg = new ControlFlowGraph(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine(cfg); cfg.SaveToFile(@"cfg.txt"); Console.WriteLine(threeAddressCodeVisitor.TACodeContainer); var availExprOpt = new AvailableExprOptimization(); availExprOpt.Optimize(cfg); Console.WriteLine("======= After algebraic identity ======="); Console.WriteLine(cfg); Console.WriteLine("======= DV ======="); Console.WriteLine(threeAddressCodeVisitor); var detector = new DefUseDetector(); detector.DetectAndFillDefUse(threeAddressCodeVisitor.TACodeContainer); //Console.WriteLine("======= Detector 1 ======="); //Console.WriteLine(detector); //Console.WriteLine("======= Detector 2 ======="); //Console.WriteLine(detector.ToString2()); var constPropagationOptimizer = new DefUseConstPropagation(detector); var result = constPropagationOptimizer.Optimize(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("======= After const propagation ======="); Console.WriteLine(threeAddressCodeVisitor); result = constPropagationOptimizer.Optimize(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("======= After const propagation ======="); Console.WriteLine(threeAddressCodeVisitor); var copyPropagationOptimizer = new DefUseCopyPropagation(detector); result = copyPropagationOptimizer.Optimize(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("======= After copy propagation ======="); Console.WriteLine(threeAddressCodeVisitor); //var bblocks = new BasicBlocks(); //bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer); //Console.WriteLine("Разбиение на базовые блоки завершилось"); var emptyopt = new EmptyNodeOptimization(); emptyopt.Optimize(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("Empty node optimization"); Console.WriteLine(threeAddressCodeVisitor.TACodeContainer); var gotoOpt = new GotoOptimization(); gotoOpt.Optimize(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("Goto optimization"); Console.WriteLine(threeAddressCodeVisitor.TACodeContainer); //var elimintaion = new EliminateTranToTranOpt(); //elimintaion.Optimize(threeAddressCodeVisitor.TACodeContainer); //Console.WriteLine("Удаление переходов к переходам завершилось"); var unreachableCode = new UnreachableCodeOpt(); var res = unreachableCode.Optimize(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("Оптимизация для недостижимых блоков"); var algOpt = new AlgebraicIdentityOptimization(); algOpt.Optimize(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("algebraic identity optimization"); Console.WriteLine(threeAddressCodeVisitor.TACodeContainer); var bblocks = new BasicBlocks(); bblocks.SplitTACode(threeAddressCodeVisitor.TACodeContainer); Console.WriteLine("Разбиение на базовые блоки завершилось"); Console.WriteLine(); GenKillVisitor genKillVisitor = new GenKillVisitor(); var genKillContainers = genKillVisitor.GenerateReachingDefinitionForBlocks(cfg.SourceBasicBlocks); InOutContainer inOutContainers = new InOutContainer(cfg.SourceBasicBlocks, genKillContainers); Console.WriteLine("=== InOut для базовых блоков ==="); Console.WriteLine(inOutContainers.ToString()); var defUseContainers = DefUseForBlocksGenerator.Execute(cfg.SourceBasicBlocks); DefUseForBlocksPrinter.Execute(defUseContainers); var reachingDefenitionsITA = new ReachingDefinitionsITA(cfg, genKillContainers); Console.WriteLine("=== InOut после итерационного алгоритма для достигающих определения ==="); Console.WriteLine(reachingDefenitionsITA); var activeVariablesITA = new ActiveVariablesITA(cfg, defUseContainers); Console.WriteLine("=== InOut после итерационного алгоритма для активных переменных ==="); Console.WriteLine(activeVariablesITA); } } catch (FileNotFoundException) { Console.WriteLine("Файл {0} не найден", FileName); } catch (Exception e) { Console.WriteLine("{0}", e); } Console.ReadLine(); }
/// <summary> /// Creates and pushes empty node to the end of the visitor's tac container /// </summary> public static void AddEmptyNode(ThreeAddressCodeVisitor tacVisitor, string label = null) { AddEmptyNode(tacVisitor.TACodeContainer, label); }
/// <summary> /// Creates and pushes if-goto node to the end of the visitor's tac container /// </summary> public static void AddIfGotoNode(ThreeAddressCodeVisitor tacVisitor, string label, string targetLabel, string condition) { AddIfGotoNode(tacVisitor.TACodeContainer, label, targetLabel, condition); }