public void UseCopyEdgeWhenPossible() { /* * Graph: 1 <-> 2, 3 <-> 4 * 1 wants to have same color as 4. * Possible 3 colors but 2 is enough. */ var v1 = new NamedVirtualRegister("V1"); var v2 = new NamedVirtualRegister("V2"); var v3 = new NamedVirtualRegister("V3"); var v4 = new NamedVirtualRegister("V4"); var interference = new Dictionary <VirtualRegister, IReadOnlyCollection <VirtualRegister> > { [v1] = new List <VirtualRegister> { v2 }, [v2] = new List <VirtualRegister> { v1 }, [v3] = new List <VirtualRegister> { v4 }, [v4] = new List <VirtualRegister> { v3 }, }; var copies = new Dictionary <VirtualRegister, IReadOnlyCollection <VirtualRegister> > { [v1] = new List <VirtualRegister> { v4 }, [v4] = new List <VirtualRegister> { v1 }, }; var registers = new List <HardwareRegister> { HardwareRegister.RAX, HardwareRegister.RBX, HardwareRegister.RCX }; var result = this.SimpleTest(interference, copies, registers); Assert.AreEqual(0, result.Spilled.Count); Assert.AreEqual(result.Allocation[v1], result.Allocation[v4]); }
public void PreferBetterColoringOverCopyEdge() { /* * Path on 4 vertices with copy edge between ends. * Possible only 2 colors. */ var v1 = new NamedVirtualRegister("V1"); var v2 = new NamedVirtualRegister("V2"); var v3 = new NamedVirtualRegister("V3"); var v4 = new NamedVirtualRegister("V4"); var interference = new Dictionary <VirtualRegister, IReadOnlyCollection <VirtualRegister> > { [v1] = new List <VirtualRegister> { v2 }, [v2] = new List <VirtualRegister> { v1, v3 }, [v3] = new List <VirtualRegister> { v2, v4 }, [v4] = new List <VirtualRegister> { v3 }, }; var copies = new Dictionary <VirtualRegister, IReadOnlyCollection <VirtualRegister> > { [v1] = new List <VirtualRegister> { v4 }, [v4] = new List <VirtualRegister> { v1 }, }; var registers = new List <HardwareRegister> { HardwareRegister.RAX, HardwareRegister.RBX }; var result = this.SimpleTest(interference, copies, registers); Assert.AreEqual(0, result.Spilled.Count); }
public void CopyEdgeToUnavailableRegister() { var v1 = new NamedVirtualRegister("V1"); var interference = new Dictionary <VirtualRegister, IReadOnlyCollection <VirtualRegister> >(); var copies = new Dictionary <VirtualRegister, IReadOnlyCollection <VirtualRegister> > { [v1] = new List <VirtualRegister> { HardwareRegister.RAX }, [HardwareRegister.RAX] = new List <VirtualRegister> { v1 }, }; var registers = new List <HardwareRegister> { HardwareRegister.RBX }; var result = this.SimpleTest(interference, copies, registers); Assert.AreEqual(0, result.Spilled.Count); }