public void ForReverse()
        {
            var blocks = GenBlocks(@"
var a, b, x, c, d;
for x = 1, 2
{
    a = b;
    b = c;
    c = d;
    d = 5;
}
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.CONST, actual["a"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["b"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["c"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["d"].Type);

            Assert.AreEqual("5", actual["a"].ConstValue);
            Assert.AreEqual("5", actual["b"].ConstValue);
            Assert.AreEqual("5", actual["c"].ConstValue);
            Assert.AreEqual("5", actual["d"].ConstValue);
        }
        public void TransfNotDistr()
        {
            var blocks = GenBlocks(@"
var a, b, c;
if c > 5
{
    a = 2;
    b = 3;
}
else
{
    a = 3;
    b = 2;
}
c = a + b;
");

            Assert.AreEqual(4, blocks.Count);
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.NAC, actual["a"].Type);
            Assert.AreEqual(LatticeTypeData.NAC, actual["b"].Type);
            Assert.AreEqual(LatticeTypeData.NAC, actual["c"].Type);
        }
        public void InputAssignsNAC()
        {
            var blocks = GenBlocks(@"
var a, x, c;
input(c);
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);

            Assert.AreEqual(LatticeTypeData.NAC, InOut.OUT[blocks.Last()]["c"].Type);
        }
        public void OneAssign()
        {
            var blocks = GenBlocks(@"
var a,b,c;
a = 5;
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.CONST, actual["a"].Type);
            Assert.AreEqual("5", actual["a"].ConstValue);
        }
        public void NoBlocks()
        {
            var blocks = GenBlocks(@"
var a, b, c;
");

            Assert.AreEqual(0, blocks.Count);
            var cfg   = new ControlFlowGraph(blocks);
            var InOut = new ConstantPropagation().ExecuteNonGeneric(cfg);

            Assert.AreEqual(2, InOut.IN.Count);
            Assert.AreEqual(2, InOut.OUT.Count);
        }
Example #6
0
File: Demos.cs Project: koyre/b8
        public void ConstantPropagationTest()
        {
            var root   = Parser.ParseString(Samples.SampleProgramText.constantPropagationSample);
            var code   = ProgramTreeToLinear.Build(root);
            var blocks = LinearToBaseBlock.Build(code);

            ConstantPropagation constProp = new ConstantPropagation();

            Console.WriteLine(blocks[0]);
            var    resBlock = constProp.OptimizeBlock(blocks[0] as BaseBlock);
            string res      = resBlock.ToString();

            Console.WriteLine(res);
        }
        public void VariableAndConst()
        {
            var blocks = GenBlocks(@"
var u, p, v;
u = 3;
p = u + 2;
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.CONST, actual["u"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["p"].Type);

            Assert.AreEqual("3", actual["u"].ConstValue);
            Assert.AreEqual("5", actual["p"].ConstValue);
        }
        public void ForProp()
        {
            var blocks = GenBlocks(@"
var a, b, x, c;
for x = 1, 10
{
    a = 2;
    b = 2;
}
c = a + b;
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.CONST, actual["c"].Type);
            Assert.AreEqual("4", actual["c"].ConstValue);
        }
        public void VariableAndConst3()
        {
            var blocks = GenBlocks(@"
var a, b, c;
b = 3;
goto 11;
c = b + 2;
11: a = 7;
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.CONST, actual["b"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["a"].Type);

            Assert.AreEqual("3", actual["b"].ConstValue);
            Assert.AreEqual("7", actual["a"].ConstValue);
        }
        private List <IOptimization> BlockOptimizationList()
        {
            var optimizations = new List <IOptimization>();

            if (OptimizationList[Optimizations.Alg])
            {
                var algOptimization = new AlgebraicOptimization();
                optimizations.Add(algOptimization);
            }

            if (OptimizationList[Optimizations.Decl])
            {
                var declOptimization = new DeclarationOptimization();
                optimizations.Add(declOptimization);
            }

            if (OptimizationList[Optimizations.CopyProp])
            {
                var copyPropOptimization = new CopyPropagation();
                optimizations.Add(copyPropOptimization);
            }

            if (OptimizationList[Optimizations.ConstFold])
            {
                var constFoldingOptimization = new ConstantFolding();
                optimizations.Add(constFoldingOptimization);
            }

            if (OptimizationList[Optimizations.ConstProp])
            {
                var constPropOptimization = new ConstantPropagation();
                optimizations.Add(constPropOptimization);
            }

            if (OptimizationList[Optimizations.Subexpr])
            {
                var subexpOptimization = new SubexpressionOptimization();
                optimizations.Add(subexpOptimization);
            }

            return(optimizations);
        }
        public void ComplicatedEquation()
        {
            var blocks = GenBlocks(@"
var a, b, c;
a = 2;
b = 3;
c = a * b - 2;
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.CONST, actual["a"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["b"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["c"].Type);

            Assert.AreEqual("2", actual["a"].ConstValue);
            Assert.AreEqual("3", actual["b"].ConstValue);
            Assert.AreEqual("4", actual["c"].ConstValue);
        }
        public void PropagateTwoVariants2()
        {
            var blocks = GenBlocks(@"
var a, x, c;
x = 10;
a = 20;
goto 666;
666: c = a + x;
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.CONST, actual["a"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["x"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, actual["c"].Type);

            Assert.AreEqual("20", actual["a"].ConstValue);
            Assert.AreEqual("30", actual["c"].ConstValue);
            Assert.AreEqual("10", actual["x"].ConstValue);
        }
        public void TwoConstValues()
        {
            var blocks = GenBlocks(@"
var a, x, c;
input(c);
if c > 5
    x = 10;
else
    input(c);
if c > 5
    x = 20;
a = x;
");
            var cfg    = new ControlFlowGraph(blocks);
            var InOut  = new ConstantPropagation().ExecuteNonGeneric(cfg);
            var actual = InOut.OUT[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.NAC, actual["a"].Type);
            Assert.AreEqual(LatticeTypeData.NAC, actual["x"].Type);
            Assert.AreEqual(LatticeTypeData.NAC, actual["c"].Type);
        }
        public void ConstPropagation()
        {
            var program   = @"
var a, x, c;
input(c);
if c > 5
    x = 10;
else
    input(c);
if c > 5
    x = 20;
a = x;
";
            var graph     = GenCFG(program);
            var algorithm = new ConstantPropagation();

            _ = algorithm.Execute(graph);
            var iterationsFast = algorithm.Iterations;

            _ = algorithm.Execute(graph, false);
            var iterationsSlow = algorithm.Iterations;

            Assert.LessOrEqual(iterationsFast, iterationsSlow);
        }
        public void ConstPropagationIterative()
        {
            var cfg       = GenCFG(@"
var a, x, c;
if c > 5
    x = 10;
else
    input(c);
if c > 5
    a = x;
");
            var constProp = new ConstantPropagation();
            var result    = constProp.Execute(cfg);
            var blocks    = cfg.GetCurrentBasicBlocks();

            var(_, Out) = result[blocks.Last()];

            Assert.AreEqual(LatticeTypeData.NAC, Out["c"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, Out["x"].Type);
            Assert.AreEqual(LatticeTypeData.CONST, Out["a"].Type);

            Assert.AreEqual("10", Out["x"].ConstValue);
            Assert.AreEqual("10", Out["a"].ConstValue);
        }