Exemple #1
0
        public void RelationSymmetricTest()
        {
            var r = new SymmetricRelation <int>();

            r.Add(new Tuple2 <int, int>(1, 2));
            Assert.IsTrue(r.Contains(new Tuple2 <int, int>(2, 1)));
        }
        public void RelationSymmetricEquality2Test()
        {
            var r1 = new SymmetricRelation <int>();

            r1.Add(new TupleElement <int>(1).SetElement());
            var r2 = new SymmetricRelation <int>();

            r2.Add(new TupleElement <int>(1).SetElement());
            Assert.IsTrue(r1.Equals(r2));
        }
Exemple #3
0
        public void RelationSymmetricEqualityTest()
        {
            var r1 = new SymmetricRelation <int>();

            r1.Add(new Tuple2 <int, int>(1, 2));
            var r2 = new SymmetricRelation <int>();

            r2.Add(new Tuple2 <int, int>(2, 1));
            Assert.IsTrue(r1.Equals(r2));
        }
        public void AddContainsRemove()
        {
            var relation = new SymmetricRelation <int>();

            Assert.IsTrue(relation.Add(7, 42));
            Assert.IsTrue(relation.Add(10, 20));
            Assert.IsTrue(relation.Contains(7, 42));
            Assert.IsTrue(relation.Contains(42, 7));
            Assert.IsFalse(relation.Add(7, 42));
            Assert.IsFalse(relation.Add(42, 7));
            Assert.IsTrue(relation.Contains(20, 10));
            Assert.IsTrue(relation.Remove(20, 10));
            Assert.IsFalse(relation.Contains(20, 10));
            Assert.IsFalse(relation.Contains(10, 20));
        }
        /// <inheritdoc/>
        public InterferenceGraph Analyze(FlowGraph graph)
        {
            var interference = new SymmetricRelation <ValueTag>();
            var liveness     = graph.GetAnalysisResult <ValueLiveness>();

            foreach (var block in graph.BasicBlocks)
            {
                foreach (var group in liveness.GetLiveness(block.Tag).GetLiveValuesByIndex().Values)
                {
                    foreach (var first in group)
                    {
                        foreach (var second in group)
                        {
                            interference.Add(first, second);
                        }
                    }
                }
            }
            return(new InterferenceGraph(interference));
        }
        /// <inheritdoc/>
        public RelatedValues Analyze(FlowGraph graph)
        {
            var relation = new SymmetricRelation <ValueTag>();

            // Examine direct copies.
            foreach (var selection in graph.NamedInstructions)
            {
                var instruction = selection.Instruction;
                var prototype   = instruction.Prototype as CopyPrototype;
                if (prototype != null)
                {
                    relation.Add(
                        selection.Tag,
                        prototype.GetCopiedValue(instruction));
                }
            }

            // Examine copies produced by branches.
            foreach (var block in graph.BasicBlocks)
            {
                foreach (var branch in block.Flow.Branches)
                {
                    var parameters = graph.GetBasicBlock(branch.Target).Parameters;
                    foreach (var pair in branch.Arguments.Zip(parameters, Tuple.Create))
                    {
                        if (pair.Item1.IsValue)
                        {
                            relation.Add(
                                pair.Item1.ValueOrNull,
                                pair.Item2.Tag);
                        }
                    }
                }
            }
            return(new RelatedValues(relation));
        }
 internal RelatedValues(SymmetricRelation <ValueTag> relation)
 {
     this.relation = relation;
 }
 internal InterferenceGraph(
     SymmetricRelation <ValueTag> interferingValues)
 {
     this.interferingValues = interferingValues;
 }