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); }
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); }
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); }
public InterferenceGraphRenderer(InterferenceGraph graph, MethodCompileInfo methodCompileInfo) { Graph = graph; MethodCompileInfo = methodCompileInfo; }
public void IgCreate() { InterferenceGraph ig = new InterferenceGraph(); }
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()))); }