Beispiel #1
0
        public void ManyBlockTest2()
        {
            var TAC = GenerateTAC(
                @"
{
i = m - 1;
j = n;
a = u1;
2: i = i + 1;
j = j - 1;
if a
    {
        a = u2;
    }
i = u3;
if b 
    {
        goto 2;
    }
}
");

            var blocks = new TACBaseBlocks(TAC.Instructions);

            blocks.GenBaseBlocks();
            var cfg             = new ControlFlowGraph(blocks.blocks);
            var optimizer       = new ReachingDefinitionOptimizer(cfg);
            var vectorOptimizer = new ReachingDefinitionVectorOptimizer(cfg);

            CheckEquality(optimizer, vectorOptimizer);
        }
Beispiel #2
0
        public void ManyBlockTest1()
        {
            var TAC = GenerateTAC(
                @"
{
  n = 4;
  c = n + 5;
  if a + 3 > 4 * 2
  {
    a = a + 3;
  }
  else
  {
    b = 5;
  }
  s = 8;
}
");
            var blocks = new TACBaseBlocks(TAC.Instructions);

            blocks.GenBaseBlocks();
            var cfg             = new ControlFlowGraph(blocks.blocks);
            var optimizer       = new ReachingDefinitionOptimizer(cfg);
            var vectorOptimizer = new ReachingDefinitionVectorOptimizer(cfg);

            CheckEquality(optimizer, vectorOptimizer);
        }
Beispiel #3
0
        public void OneBlockTest1()
        {
            var TAC = GenerateTAC(
                @"
{
x = z + y;
u = x;
t = z + y;
}
");
            var blocks = new TACBaseBlocks(TAC.Instructions);

            blocks.GenBaseBlocks();
            var cfg             = new ControlFlowGraph(blocks.blocks);
            var optimizer       = new ReachingDefinitionOptimizer(cfg);
            var vectorOptimizer = new ReachingDefinitionVectorOptimizer(cfg);

            CheckEquality(optimizer, vectorOptimizer);
        }
Beispiel #4
0
        void CheckEquality(ReachingDefinitionOptimizer a, ReachingDefinitionVectorOptimizer b)
        {
            a.Run(); b.Run();
            var assignList = new List <TACInstruction>();

            foreach (var instr in b.graph.blocks.SelectMany(block => block.Instructions))
            {
                if (!(instr.Result.Equals("") ||
                      instr.Result.Contains("#")))
                {
                    assignList.Add(instr);
                }
            }
            // сравнить ин ауты, получившиеся из векторов и из списков
            foreach (var block in a.graph.blocks)
            {
                var inB  = a.IN[block];
                var outB = a.OUT[block];

                var inBTransformed = new InOutVector(assignList.Count);
                foreach (var instr in inB)
                {
                    inBTransformed[assignList.IndexOf(instr)] = true;
                }

                var outBTransformed = new InOutVector(assignList.Count);
                foreach (var instr in outB)
                {
                    outBTransformed[assignList.IndexOf(instr)] = true;
                }

                var inBVector  = b.INvector[block];
                var outBVector = b.OUTvector[block];

                Assert.AreEqual(inBTransformed.Data, inBVector.Data);
                Assert.AreEqual(outBTransformed.Data, outBVector.Data);
            }
        }