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); }
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); }
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); }
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); } }