Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #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);
        }
Пример #30
0
 public IEnumerable <string> InteractionWithNoopRemoval(string sourceCode) =>
 ThreeAddressCodeOptimizer.Optimize(
     GenTAC(sourceCode),
     allCodeOptimizations: new List <Optimization>()
 {
     ThreeAddressCodeRemoveGotoThroughGoto.RemoveGotoThroughGoto,
     ThreeAddressCodeRemoveNoop.RemoveEmptyNodes
 })
 .Select(instruction => instruction.ToString());