Beispiel #1
0
        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;
                    }
                }
            }
        }
Beispiel #2
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);
            }
        }
Beispiel #3
0
        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 }));
        }