public void SmallColorableGraph()
        {
            var registers = new List <HardwareRegisterNode> ();

            registers.Add(new HardwareRegisterNode("a"));
            registers.Add(new HardwareRegisterNode("b"));

            var v1 = new Vertex(registers [1]);
            var v2 = new Vertex(new TemporaryNode());
            var v3 = new Vertex(new TemporaryNode());
            var v4 = new Vertex(registers [0]);

            v1.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v4, v2 }));
            v2.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v1, v3 }));
            v3.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v2, v4 }));
            v4.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v3, v1 }));

            var graph = new InterferenceGraph(new List <Vertex> (new Vertex[4] {
                v1, v2, v3, v4
            }));
            var allocator = new RegisterAllocator(registers);

            allocator.AllocateRegisters(graph);
            Assert.AreEqual(IsValid(graph, allocator.RegistersColoring), true);
            Assert.IsEmpty(allocator.SpilledRegisters);
        }
예제 #2
0
		public void IgAddEdge()
		{
			var ig = new InterferenceGraph();
			var id1 = new Identifier("id1", PrimitiveType.Word32, null);
			var id2 = new Identifier("id2", PrimitiveType.Word32, null);
			ig.Add(id1, id2);
			Assert.IsTrue(ig.Interfere(id1, id2), "id1 inteferes with id2", null);
			Assert.IsTrue(ig.Interfere(id2, id1), "id2 inteferes with id1", null);
		}
 private bool IsValid(InterferenceGraph graph, Dictionary <RegisterNode, HardwareRegisterNode> coloring)
 {
     foreach (Vertex vertex in graph.Vertices)
     {
         foreach (Vertex neigh in vertex.NonCopyNeighbors)
         {
             if (coloring [vertex.Register] == coloring [neigh.Register])
             {
                 return(false);
             }
         }
     }
     return(true);
 }
예제 #4
0
        public void SelectTest()
        {
            var ig    = new InterferenceGraph();
            var stack = new Stack <string>();

            foreach (var n in "ghkdjefbcm")
            {
                stack.Push(n.ToString());
                ig.Nodes.Add(n.ToString());
            }

            ig.Graph.Add(new Tuple <string, string>("j", "f"));
            ig.Graph.Add(new Tuple <string, string>("j", "e"));
            ig.Graph.Add(new Tuple <string, string>("j", "k"));
            ig.Graph.Add(new Tuple <string, string>("j", "d"));
            ig.Graph.Add(new Tuple <string, string>("j", "h"));
            ig.Graph.Add(new Tuple <string, string>("j", "g"));

            ig.Graph.Add(new Tuple <string, string>("f", "m"));
            ig.Graph.Add(new Tuple <string, string>("f", "e"));

            ig.Graph.Add(new Tuple <string, string>("e", "b"));
            ig.Graph.Add(new Tuple <string, string>("e", "m"));

            ig.Graph.Add(new Tuple <string, string>("k", "b"));
            ig.Graph.Add(new Tuple <string, string>("k", "d"));
            ig.Graph.Add(new Tuple <string, string>("k", "g"));

            ig.Graph.Add(new Tuple <string, string>("b", "c"));
            ig.Graph.Add(new Tuple <string, string>("b", "m"));
            ig.Graph.Add(new Tuple <string, string>("b", "d"));

            ig.Graph.Add(new Tuple <string, string>("m", "c"));
            ig.Graph.Add(new Tuple <string, string>("m", "d"));

            ig.Graph.Add(new Tuple <string, string>("h", "g"));

            var newgraph = GraphColoring.Select(ig, stack);

            Assert.AreEqual(4, newgraph.Allocation.Count);
        }
        public void SpillNeeded()
        {
            var registers = new List <HardwareRegisterNode> ();

            registers.Add(new HardwareRegisterNode("a"));
            registers.Add(new HardwareRegisterNode("b"));

            var v1 = new Vertex(new TemporaryNode());
            var v2 = new Vertex(new TemporaryNode());
            var v3 = new Vertex(new TemporaryNode());

            v1.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v3, v2 }));
            v2.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v1, v3 }));
            v3.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v2, v1 }));

            var graph = new InterferenceGraph(new List <Vertex> (new Vertex[3] {
                v1, v2, v3
            }));
            var allocator = new RegisterAllocator(registers);

            allocator.AllocateRegisters(graph);
            Assert.AreEqual(allocator.SpilledRegisters.Count, 1);
        }
        public void NonTrivialThreeColorableGraph()
        {
            var registers = new List <HardwareRegisterNode> ();

            registers.Add(new HardwareRegisterNode("a"));
            registers.Add(new HardwareRegisterNode("b"));
            registers.Add(new HardwareRegisterNode("c"));

            var v1 = new Vertex(new TemporaryNode());
            var v2 = new Vertex(new TemporaryNode());
            var v3 = new Vertex(new TemporaryNode());
            var v4 = new Vertex(new TemporaryNode());
            var v5 = new Vertex(new TemporaryNode());
            var v6 = new Vertex(new TemporaryNode());
            var v7 = new Vertex(registers[1]);
            var v8 = new Vertex(new TemporaryNode());
            var v9 = new Vertex(new TemporaryNode());

            v1.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v2, v3 }));
            v2.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v1, v3 }));
            v3.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v1, v2 }));
            v4.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v5, v6 }));
            v5.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v4, v6 }));
            v6.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v4, v5 }));
            v7.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v3, v4 }));
            v8.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v7, v9 }));
            v9.NonCopyNeighbors.UnionWith(new HashSet <Vertex> (new Vertex[] { v7, v8 }));

            var graph = new InterferenceGraph(new List <Vertex> (new Vertex[9] {
                v1, v2, v3, v4, v5, v6, v7, v8, v9
            }));
            var allocator = new RegisterAllocator(registers);

            allocator.AllocateRegisters(graph);
            Assert.AreEqual(IsValid(graph, allocator.RegistersColoring), true);
            Assert.IsEmpty(allocator.SpilledRegisters);
        }
예제 #7
0
 public InterferenceGraphRenderer(InterferenceGraph graph, MethodCompileInfo methodCompileInfo)
 {
     Graph = graph;
     MethodCompileInfo = methodCompileInfo;
 }
예제 #8
0
 public void IgCreate()
 {
     InterferenceGraph ig = new InterferenceGraph();
 }
예제 #9
0
 void AssertNoEdge(InterferenceGraph graph, Register r1, Register r2)
 {
     Assert.IsTrue(
         !graph.Graph.Contains(new Tuple <string, string>(r1.ToString(), r2.ToString())) &&
         !graph.Graph.Contains(new Tuple <string, string>(r2.ToString(), r1.ToString())));
 }