Exemplo n.º 1
0
        public void Task3Test()
        {
            var TAC           = GenTAC(@"
var a, b;
goto 1;
a = 1;
1: if (true) 
    goto 2;
else 
3: a=5;
4: b = 2;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto
            };


            var expected = new List <string>()
            {
                "if True goto 2",
                "goto 3",
                "a = 1",
                "noop",
                "3: a = 5",
                "goto L2",
                "L1: goto 2",
                "L2: noop",
                "4: b = 2",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations)
                         .Select(instruction => instruction.ToString());


            CollectionAssert.AreEqual(expected, actual);
        }
        public void ShouldRemoveAllTheNoops()
        {
            var TAC = new List <Instruction>
            {
                new Instruction("1", "noop", null, null, null),
                new Instruction("2", "noop", null, null, null),
                new Instruction("3", "assign", "1", "", "a"),
                new Instruction("4", "noop", null, null, null),
                new Instruction("5", "noop", null, null, null),
                new Instruction("6", "assign", "a", "", "b"),
                new Instruction("7", "noop", null, null, null),
                new Instruction("8", "noop", null, null, null),
            };

            ThreeAddressCodeOptimizer.Optimizations.Clear();
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeRemoveNoop.RemoveEmptyNodes);

            var expected = new List <string>()
            {
                "3: a = 1",
                "6: b = a",
                "8: noop"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);

            AssertChanged(OptimizeLocal(TAC), expected);
        }
Exemplo n.º 3
0
        public void MultiGoToTest()
        {
            var TAC           = GenTAC(@"
var a, b;
1: goto 2;
2: goto 5;
3: goto 6;
4: a = 1;
5: goto 6;
6: a = b;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto
            };

            var expected = new List <string>()
            {
                "1: goto 6",
                "2: goto 6",
                "3: goto 6",
                "4: a = 1",
                "5: goto 6",
                "6: a = b",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 4
0
        public void NoDeadInputPrint()
        {
            var TAC = GenTAC(@"
var a, b;
a = 1;
print(a);
input(a);
b = a + 1;
");

            ThreeAddressCodeOptimizer.Optimizations.Clear();
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeDefUse.DeleteDeadCode);

            var expected = new List <string>()
            {
                "a = 1",
                "print a",
                "input a",
                "#t1 = a + 1",
                "b = #t1"
            };

            var actual = ThreeAddressCodeOptimizer.Optimize(TAC)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 5
0
        public void OptimizationLabelIfTest()
        {
            var TAC           = GenTAC(@"
var a, b;
goto 1;
a = 1;
1: if (true) 
    goto 2;
2: a = 5;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto
            };

            var expected = new List <string>()
            {
                "if True goto 2",
                "goto L3",
                "L3: noop",
                "goto L2",
                "L1: goto 2",
                "L2: noop",
                "2: a = 5",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations, UnreachableCodeElimination: true)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 6
0
        public void TestGotoIfElseTACGen1()
        {
            var TAC = GenTAC(@"
var a,b;
b = 5;
if(a > b)
	goto 6;
6: a = 4;
");

            ThreeAddressCodeOptimizer.Optimizations.Clear();
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto);
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeRemoveNoop.RemoveEmptyNodes);

            var expected = new List <string>()
            {
                "b = 5",
                "#t1 = a > b",
                "if #t1 goto 6",
                "goto 6",
                "L1: goto 6",
                "6: a = 4",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 7
0
        public void TestGototoGotoEmptyNodes()
        {
            var TAC = GenTAC(@"
var a, b;
goto 1;
1: if (true) 
    goto 2;
2: a = 5;
");

            ThreeAddressCodeOptimizer.Optimizations.Clear();
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto);
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeRemoveNoop.RemoveEmptyNodes);

            var expected = new List <string>()
            {
                "goto 2",
                "1: if True goto 2",
                "goto 2",
                "L1: goto 2",
                "2: a = 5",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 8
0
        public void Test1()
        {
            var TAC = GenTAC(@"
var a, b;
1: goto 2;
2: goto 5;
3: goto 6;
4: a = 1;
5: goto 6;
6: a = b;
");

            ThreeAddressCodeOptimizer.Optimizations.Clear();
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto);

            var expected = new List <string>()
            {
                "1: goto 6",
                "2: goto 6",
                "3: goto 6",
                "4: a = 1",
                "5: goto 6",
                "6: a = b",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 9
0
        public void TestGotoIfElseTACGen1()
        {
            var TAC           = GenTAC(@"
var a,b;
b = 5;
if(a > b)
	goto 6;
6: a = 4;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto
            };

            var expected = new List <string>()
            {
                "b = 5",
                "#t1 = a > b",
                "#t2 = !#t1",
                "if #t2 goto L1",
                "goto 6",
                "L1: noop",
                "6: a = 4",
            };

            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 10
0
        public void OptimizationLabelIfTest()
        {
            var TAC           = GenTAC(@"
var a, b;
goto 1;
a = 1;
1: if (true) 
    goto 2;
2: a = 5;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto
            };

            var expected = new List <string>()
            {
                "goto 1",
                "a = 1",
                "1: #t1 = !True",
                "if #t1 goto L1",
                "goto 2",
                "L1: noop",
                "2: a = 5",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 11
0
        public void GoToLabelTest()
        {
            var TAC           = GenTAC(@"
var a;
goto 1;
1: goto 2;
2: goto 3;
3: goto 4;
4: a = 4;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto
            };

            var expected = new List <string>()
            {
                "goto 4",
                "1: goto 4",
                "2: goto 4",
                "3: goto 4",
                "4: a = 4",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 12
0
        public void TestGotoIfElseTACGen2()
        {
            var TAC           = GenTAC(@"
var a,b;
b = 5;
if(a > b)
	goto 6;
else
    goto 4;
6: a = 4;
4: a = 6;

");
            var optimizations = new List <Optimization>
            {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto,
                ThreeAddressCodeRemoveNoop.RemoveEmptyNodes,
            };

            var expected = new List <string>()
            {
                "b = 5",
                "#t1 = a > b",
                "if #t1 goto 6",
                "goto 4",
                "goto 6",
                "L1: goto 6",
                "6: a = 4",
                "4: a = 6",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 13
0
        public void IfNoDead()
        {
            var TAC           = GenTAC(@"
var a, b, c;
a = 2;
if a
{
b = 1;
c = b + 3;
}
a = 3;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeDefUse.DeleteDeadCode
            };

            var expected = new List <string>()
            {
                "a = 2",
                "if a goto L1",
                "goto L2",
                "L1: b = 1",
                "#t1 = b + 3",
                "c = #t1",
                "L2: noop",
                "a = 3"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 14
0
        public void DeadInput()
        {
            var TAC           = GenTAC(@"
var a, b;
input(a);
input(a);
b = a + 1;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeDefUse.DeleteDeadCode
            };

            var expected = new List <string>()
            {
                "noop",
                "input a",
                "#t1 = a + 1",
                "b = #t1"
            };

            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 15
0
        public void Test2()
        {
            var TAC           = GenTAC(@"
                var a, b, c, d, e, x, y, k;
                b = x;
                x = 5;
                c = b + 5;
                d = c;
                e = d;
                ");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeCopyPropagation.PropagateCopies
            };

            var expected = new List <string>()
            {
                "b = x",
                "x = 5",
                "#t1 = b + 5",
                "c = #t1",
                "d = #t1",
                "e = #t1"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 16
0
        public void NoDeadCode()
        {
            var TAC           = GenTAC(@"
var a, b, c;
a = 2;
b = a + 4;
c = a * b;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeDefUse.DeleteDeadCode
            };

            var expected = new List <string>()
            {
                "a = 2",
                "#t1 = a + 4",
                "b = #t1",
                "#t2 = a * b",
                "c = #t2"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 17
0
        public void Test2()
        {
            var TAC           = GenTAC(@"
                var x, y, b;
                y = 5;
                x = b;
                y = 7;
                x = y + y;
                ");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeConstantPropagation.PropagateConstants
            };

            var expected = new List <string>()
            {
                "y = 5",
                "x = b",
                "y = 7",
                "#t1 = 7 + 7",
                "x = #t1"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 18
0
        public void Test1()
        {
            var TAC = GenTAC(@"
                var a, b, c, d, e, x, y, k;
                a = b;
                c = b - a;
                d = c + 1;
                e = d * a;
                a = x - y;
                k = c + a;
                ");

            var optimizations = new List <Optimization> {
                ThreeAddressCodeCopyPropagation.PropagateCopies
            };

            var expected = new List <string>()
            {
                "a = b",
                "#t1 = b - b",
                "c = #t1",
                "#t2 = #t1 + 1",
                "d = #t2",
                "#t3 = #t2 * b",
                "e = #t3",
                "#t4 = x - y",
                "a = #t4",
                "#t5 = #t1 + #t4",
                "k = #t5"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 19
0
        public void RemoveEmptyNodesShouldWorkWithGotoToGoto()
        {
            var TAC = new List <Instruction>
            {
                new Instruction("1", "goto", "5", null, null),
                new Instruction("2", "goto", "5", null, null),
                new Instruction("", "noop", null, null, null),
                new Instruction("5", "assign", "b", null, "a"),
            };

            var opts = new List <Optimization>()
            {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto,
                ThreeAddressCodeRemoveNoop.RemoveEmptyNodes
            };

            var result = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: opts);

            var expected = new List <string>
            {
                "1: goto 5",
                "2: goto 5",
                "5: a = b",
            };

            AssertEquality(result, expected);
        }
Exemplo n.º 20
0
        public void Test1()
        {
            var TAC           = GenTAC(@"
var a;
a = 1 - 20;
a = 4 * 2;
a = 10 / 5;
a = 9 + 3;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeFoldConstants.FoldConstants
            };

            var expected = new List <string>()
            {
                "#t1 = -19",
                "a = #t1",
                "#t2 = 8",
                "a = #t2",
                "#t3 = 2",
                "a = #t3",
                "#t4 = 12",
                "a = #t4"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 21
0
        public void RemoveGotoThroughGotoShouldNotRemoveExtraLabelsAfterRemoveEmptyNodes()
        {
            var TAC = GenTAC(@"
var a;
input(a);
1: if a == 0
    goto 3;
2: a = 2;
3: a = 3;
");

            var opts = new List <Func <List <Instruction>, (bool, List <Instruction>)> >()
            {
                ThreeAddressCodeRemoveGotoThroughGoto.RemoveGotoThroughGoto,
                ThreeAddressCodeRemoveNoop.RemoveEmptyNodes
            };

            var result = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: opts);

            var expected = new List <string>
            {
                "input a",
                "1: #t1 = a == 0",
                "#t2 = !#t1",
                "#t3 = !#t2",
                "if #t3 goto 3",
                "2: a = 2",
                "3: a = 3"
            };

            AssertEquality(result, expected);
        }
Exemplo n.º 22
0
        public void GotoDead()
        {
            var TAC           = GenTAC(@"
var a, b, c;
a = a or b;
goto 777;
777: c = 1;
c = 2;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeDefUse.DeleteDeadCode
            };

            var expected = new List <string>()
            {
                "#t1 = a or b",
                "a = #t1",
                "goto 777",
                "777: noop",
                "c = 2"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 23
0
        public void RemoveEmptyNodesWorksWithRemoveGotoThroughGoto()
        {
            var TAC = GenTAC(@"
var a;
1:  if (1 < 2) 
        a = 4 + 5 * 6;
    else
        goto 4;");

            var opts = new List <Func <List <Instruction>, (bool, List <Instruction>)> >()
            {
                ThreeAddressCodeRemoveGotoThroughGoto.RemoveGotoThroughGoto,
                ThreeAddressCodeRemoveNoop.RemoveEmptyNodes
            };

            var result = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: opts);

            var expected = new List <string>
            {
                "1: #t1 = 1 < 2",
                "if #t1 goto L1",
                "goto 4",
                "goto L2",
                "L1: #t2 = 5 * 6",
                "#t3 = 4 + #t2",
                "a = #t3",
                "L2: noop"
            };

            AssertEquality(result, expected);
        }
Exemplo n.º 24
0
        public void TestGototoGotoEmptyNodes()
        {
            var TAC           = GenTAC(@"
var a, b;
goto 1;
a = 1;
1: if (true) 
    goto 2;
2: a = 5;
");
            var optimizations = new List <Optimization>
            {
                ThreeAddressCodeGotoToGoto.ReplaceGotoToGoto,
                ThreeAddressCodeRemoveNoop.RemoveEmptyNodes,
            };

            var expected = new List <string>()
            {
                "if True goto 2",
                "goto 2",
                "a = 1",
                "L3: goto 2",
                "L1: goto 2",
                "2: a = 5",
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 25
0
        public void Test1()
        {
            var TAC = GenTAC(@"
var x, y;
x = 14;
y = 7 - x;
x = x + x;
");

            ThreeAddressCodeOptimizer.Optimizations.Clear();
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeFoldConstants.FoldConstants);
            ThreeAddressCodeOptimizer.Optimizations.Add(ThreeAddressCodeConstantPropagation.PropagateConstants);

            var expected = new List <string>()
            {
                "x = 14",
                "#t1 = -7",
                "y = -7",
                "#t2 = 28",
                "x = 28"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 26
0
        public void ArithmeticOpsNoDead()
        {
            var TAC           = GenTAC(@"
var a, b, c, x;
a = (2 + x) - a;
b = (c * 3) - (b / 4);
c = (a * 10 + b * 2) / 3;
");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeDefUse.DeleteDeadCode
            };

            var expected = new List <string>()
            {
                "#t1 = 2 + x",
                "#t2 = #t1 - a",
                "a = #t2",
                "#t3 = c * 3",
                "#t4 = b / 4",
                "#t5 = #t3 - #t4",
                "b = #t5",
                "#t6 = a * 10",
                "#t7 = b * 2",
                "#t8 = #t6 + #t7",
                "#t9 = #t8 / 3",
                "c = #t9"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 27
0
        public void Test1()
        {
            var TAC           = GenTAC(@"
                var x, y;
                x = 14;
                y = 7 - x;
                x = x + x;
                ");
            var optimizations = new List <Optimization> {
                ThreeAddressCodeConstantPropagation.PropagateConstants
            };

            var expected = new List <string>()
            {
                "x = 14",
                "#t1 = 7 - 14",
                "y = #t1",
                "#t2 = 14 + 14",
                "x = #t2"
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, optimizations)
                         .Select(instruction => instruction.ToString());

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 28
0
        protected ControlFlowGraph BuildTACOptimizeCFG(string program)
        {
            var TAC       = GenTAC(program);
            var optResult = ThreeAddressCodeOptimizer.OptimizeAll(TAC);
            var blocks    = BasicBlockLeader.DivideLeaderToLeader(optResult);

            return(new ControlFlowGraph(blocks));
        }
        public void Optimization()
        {
            // обновление глобальных переменных для корректной работы теста
            GenTAC(@"var a;");

            var expectedTAC = new List <string>()
            {
                "1: #t1 = 1 < 2",
                "7: if #t1 goto L1",
                "goto L2",
                "L1: goto 3",
                "L2: noop",
                "2: goto 4",
                "3: a = 0",
                "4: a = 1",
                "666: a = False"
            };

            var TAC = new List <Instruction>()
            {
                new Instruction("1", "LESS", "1", "2", "#t1"),
                new Instruction("7", "ifgoto", "#t1", "L1", ""),
                new Instruction("", "goto", "L2", "", ""),
                new Instruction("L1", "goto", "3", "", ""),
                new Instruction("L2", "noop", "", "", ""),
                new Instruction("2", "goto", "4", "", ""),
                new Instruction("3", "assign", "0", "", "a"),
                new Instruction("4", "assign", "1", "", "a"),
                new Instruction("666", "assign", "False", "", "a")
            };

            ThreeAddressCodeTmp.GenTmpLabel(); // L1
            ThreeAddressCodeTmp.GenTmpLabel(); // L2
            ThreeAddressCodeTmp.GenTmpName();  // #t1

            var expected = new List <string>()
            {
                "1: #t1 = 1 < 2",
                "7: #t2 = !#t1",
                "if #t2 goto L2",
                "goto 3",
                "L2: noop",
                "2: goto 4",
                "3: a = 0",
                "4: a = 1",
                "666: a = False"
            };

            //CollectionAssert.AreEqual(TAC.Select(instruction => instruction.ToString()), expectedTAC);

            var optimizations = new List <Optimization> {
                ThreeAddressCodeRemoveGotoThroughGoto.RemoveGotoThroughGoto
            };
            var actual = ThreeAddressCodeOptimizer.Optimize(TAC, allCodeOptimizations: optimizations)
                         .Select(instruction => instruction.ToString()).ToList();

            CollectionAssert.AreEqual(expected, actual);
        }
Exemplo n.º 30
0
 public IEnumerable <string> InteractionWithNoopRemoval(string sourceCode) =>
 ThreeAddressCodeOptimizer.Optimize(
     GenTAC(sourceCode),
     allCodeOptimizations: new List <Optimization>()
 {
     ThreeAddressCodeRemoveGotoThroughGoto.RemoveGotoThroughGoto,
     ThreeAddressCodeRemoveNoop.RemoveEmptyNodes
 })
 .Select(instruction => instruction.ToString());