コード例 #1
0
        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]);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }