public void Run() { GetGenKillSet(); var assignList = new List <TACInstruction>(); foreach (var instr in graph.blocks.SelectMany(block => block.Instructions)) { if (!(instr.Result.Equals("") || instr.Result.Contains("#"))) { assignList.Add(instr); } } INvector[graph.start] = new InOutVector(assignList.Count); OUTvector[graph.start] = new InOutVector(assignList.Count); foreach (var block in graph.blocks) { OUTvector[block] = new InOutVector(assignList.Count); } bool change = true; while (change) { for (int i = 0; i < graph.blocks.Count; ++i) { change = false; INvector[graph.blocks[i]] = graph.blocks[i].In.Select(n => OUTvector[n]) .Aggregate((x, y) => x + y); var prevOut = OUTvector[graph.blocks[i]]; var genTransform = new InOutVector(assignList.Count); foreach (var instr in gen[graph.blocks[i]]) { genTransform[assignList.IndexOf(instr)] = true; } var killTransform = new InOutVector(assignList.Count); foreach (var instr in kill[graph.blocks[i]]) { killTransform[assignList.IndexOf(instr)] = true; } OUTvector[graph.blocks[i]] = genTransform + (INvector[graph.blocks[i]] - killTransform); if (prevOut != OUTvector[graph.blocks[i]]) { change = true; } } } }
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); } }
public void Operations() { var array1 = new InOutVector(new BitArray(new[] { true, true, false, true })); var array2 = new InOutVector(new BitArray(new[] { false, false, false, true })); var array3 = new InOutVector(new BitArray(new[] { true, false, true, false })); var array1copy = array1; // -a Assert.AreEqual((-array1).Data, new BitArray(new[] { false, false, true, false })); // [] Assert.AreEqual(array1[0], true); Assert.AreEqual(array1[2], false); // == != Assert.False(array1 == array2); Assert.True(array2 != array3); Assert.True(array1copy == array1); Assert.True(array1copy != array2); // + - Assert.AreEqual((array1 + array2).Data, new BitArray(new[] { true, true, false, true })); Assert.AreEqual((array2 + array3).Data, new BitArray(new[] { true, false, true, true })); Assert.AreEqual((array1 - array2).Data, new BitArray(new[] { true, true, false, false })); Assert.AreEqual((array3 - array2).Data, new BitArray(new[] { true, false, true, false })); }