public void CopyUsageInNestedMethodInvocations() { var source = @" var x = 0; var y = x; Outer(x, Inner1(Inner2(y)));"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = x DECL $temp_0 $temp_0 = Inner2(x) DECL $temp_1 $temp_1 = Inner1($temp_0) INVOKE Outer(x, $temp_1)"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CodeWithCodeWithCopyUsageDoesNotPropagateNestedCopies() { var source = @" var x = 0; var y = x; var z = y; var a = z; var b = a; var c = b;"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = x DECL z z = x DECL a a = y DECL b b = z DECL c c = a"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CopyUsageInCondition() { var source = @" var x = 0; var y = x; if(y == x) { }"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = x IF x == x JUMP #0 JUMP #1 LABEL #0 LABEL #1"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CopyUsageInNestedBinaryExpressions() { var source = @" var x = 0; var y = x; var a = 4; var b = a; var c = x + y * b - y;"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = x DECL a a = 4 DECL b b = a DECL c DECL $temp_0 $temp_0 = x * a DECL $temp_1 $temp_1 = x + $temp_0 c = $temp_1 - x"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CodeWithUsageAndCopyInBranch() { var source = @" var x = 0; var y = 5; if(x > 0) { y = x; var z = y; }"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = 5 IF x > 0 JUMP #0 JUMP #1 LABEL #0 y = x DECL z z = x LABEL #1"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CopyUsageInArrayAccessor() { var source = @" var x = 0; var y = x; var z = 5 + array[y]"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = x DECL z DECL $temp_0 $temp_0 = array[x] z = 5 + $temp_0"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public ControlFlowGraph CreateControlFlowGraph(string body) { var code = TestCodeFactory.CreateThreeAddressCode(body); Debug.WriteLine(CodeStringifier.Generate(code)); return(ControlFlowGraphFactory.Create(code)); }
public void CodeWithSameVariableAndDoubleIntermediateOverwritingDoesNotAffectSucceedingCopies() { var source = @" var x = 0; var y = x; var z = y; x = 5; var a = y; var b = z;"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = x DECL z z = x x = 5 DECL a a = y DECL b b = y"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CommonSubexpressionsInSingleMethodInvocation() { var source = @"Method(x + 1, x + 1);"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CommonSubexpressionElimination.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL $temp_0 $temp_0 = x + 1 DECL $temp_1 $temp_1 = $temp_0 INVOKE Method($temp_0, $temp_1)"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CodeWithCodeWithSingleCopyUsage() { var source = "var x = 0; var y = x; var z = y;"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = x DECL z z = x"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CodeWithSingleCommonInvocation() { var source = "var x = 3; var y = Method(x); var z = Method(x);"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CommonSubexpressionElimination.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 3 DECL y y = Method(x) DECL z z = y"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CommonSubexpressionsWithMultipleInvocationsOfTheSameMethodWithTheSameArguments() { var source = @"var result = Method(x) + Method(x);"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CommonSubexpressionElimination.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL result DECL $temp_0 $temp_0 = Method(x) DECL $temp_1 $temp_1 = $temp_0 result = $temp_0 + $temp_1"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CopyUsageInMethodInvocation() { var source = @" var x = 0; var y = x; Method(x, y);"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CopyPropagation.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL x x = 0 DECL y y = x INVOKE Method(x, x)"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CodeWithCommonInvocationArgumentExpressions() { var source = @" var a = Method[x + 1]; Method[x + 1] = 4;"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CommonSubexpressionElimination.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL a DECL $temp_0 $temp_0 = x + 1 a = Method[$temp_0] DECL $temp_1 $temp_1 = $temp_0 Method[$temp_1] = 4"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }
public void CommonSubexpressionsInMultipleMethodInvocations() { var source = @"var result = Method1(x + 1) + Method2(x + 1);"; var code = TestCodeFactory.CreateThreeAddressCode(source); var cfg = ControlFlowGraphFactory.Create(code); var optimized = CommonSubexpressionElimination.Optimize(code, cfg); Assert.AreNotEqual(code, optimized.Code); Assert.IsTrue(optimized.Changed); var expected = @" DECL result DECL $temp_0 $temp_0 = x + 1 DECL $temp_1 $temp_1 = Method1($temp_0) DECL $temp_2 $temp_2 = $temp_0 DECL $temp_3 $temp_3 = Method2($temp_2) result = $temp_1 + $temp_3"; Assert.AreEqual(expected.Trim(), CodeStringifier.Generate(optimized.Code)); }