예제 #1
0
파일: Allocate.cs 프로젝트: ipud2/tcd-swift
        public static List <List <string> > simplify(Graph graph, List <string> spill)
        {
            //conditions to start colouring graph
            if (graph.Count == 1 || graph.isRegisters())
            {
                return(assign(graph));
            }

            List <List <string> > result  = new List <List <string> >();
            List <int>            degrees = new List <int>();
            Node n;

            for (int i = 0; i < graph.Count; i++)
            {
                if (graph.Get(i).isRegister)
                {
                    degrees.Add(-1); //causes nodes that are already registers to be ignored when simplifying
                }
                else
                {
                    degrees.Add(graph.Get(i).getDegree());
                }
            }

            //define degree that node must be at (or less than) to be simplified
            int k = Allocate.registers - 1;

            while (k >= 0)
            {
                if (degrees.Contains(k))
                {
                    int index = degrees.IndexOf(k);
                    n = graph.Get(index);
                    graph.Remove(n);
                    result = simplify(graph, spill);
                    if (result == null)
                    {
                        return(null);
                    }
                    graph.Add(n);
                    return(appendToAllocated(result, n));
                }
                k--;
            }
            n = graph.GetHighestDegreeNode();
            graph.Remove(n);
            spill.Add(n.id);
            result = simplify(graph, spill);
            if (result == null)
            {
                return(null);
            }
            graph.Add(n);
            result = appendToAllocated(result, n); //you know, let's just try to colour the node anyway
            if (result != null)
            {
                spill.Remove(n.id);
            }
            return(result);
        }
예제 #2
0
        public static List<List<string>> assign(Graph graph)
        {
            List<List<string>> assigned = new List<List<string>>();
            List<string> available = new List<string>();

            Regex literal = new Regex(@"^[0-9]+");
            Regex str = new Regex(@"^"".+""");
            Regex memory = new Regex(@"[MEM.+]");

            //build list of available registers
            for(int i = 1; i <= Allocate.registers; i++){
            string reg = "R" + i;
            if(!livein.Contains(reg)){
                available.Add(reg);
            }
            }

            //assign registers
            for(int i = 0; i < graph.Count; i++){
            Node n = graph.Get(i);
            if(n.isRegister || str.IsMatch(n.id) || memory.IsMatch(n.id)){
                assigned.Add(new List<string>(){n.id,n.id});
            }
            else if(literal.IsMatch(n.id)){
                assigned.Add(new List<string>(){n.id,"="+n.id});
            }
            else{
                assigned.Add(new List<string>(){n.id,available[0]});
                available.Remove(available[0]);
            }
            }
            return assigned;
        }
예제 #3
0
파일: Allocate.cs 프로젝트: ipud2/tcd-swift
        public static List <List <string> > assign(Graph graph)
        {
            List <List <string> > assigned  = new List <List <string> >();
            List <string>         available = new List <string>();

            Regex literal = new Regex(@"^[0-9]+");
            Regex str     = new Regex(@"^"".+""");
            Regex memory  = new Regex(@"[MEM.+]");

            //build list of available registers
            for (int i = 1; i <= Allocate.registers; i++)
            {
                string reg = "R" + i;
                if (!livein.Contains(reg))
                {
                    available.Add(reg);
                }
            }

            //assign registers
            for (int i = 0; i < graph.Count; i++)
            {
                Node n = graph.Get(i);
                if (n.isRegister || str.IsMatch(n.id) || memory.IsMatch(n.id))
                {
                    assigned.Add(new List <string>()
                    {
                        n.id, n.id
                    });
                }
                else if (literal.IsMatch(n.id))
                {
                    assigned.Add(new List <string>()
                    {
                        n.id, "=" + n.id
                    });
                }
                else
                {
                    assigned.Add(new List <string>()
                    {
                        n.id, available[0]
                    });
                    available.Remove(available[0]);
                }
            }
            return(assigned);
        }
예제 #4
0
        public static List<List<string>> simplify(Graph graph, List<string> spill)
        {
            //conditions to start colouring graph
            if(graph.Count == 1 || graph.isRegisters()){
            return assign(graph);
            }

            List<List<string>> result = new List<List<string>>();
            List<int> degrees = new List<int>();
            Node n;

            for(int i = 0; i < graph.Count; i++){
            if(graph.Get(i).isRegister){
                degrees.Add(-1); //causes nodes that are already registers to be ignored when simplifying
            }
            else{
                degrees.Add(graph.Get(i).getDegree());
            }
            }

            //define degree that node must be at (or less than) to be simplified
            int k = Allocate.registers - 1;
            while(k >= 0){
            if(degrees.Contains(k)){
                int index = degrees.IndexOf(k);
                n = graph.Get(index);
                graph.Remove(n);
                result = simplify(graph, spill);
                if(result == null){
                    return null;
                }
                graph.Add(n);
                return appendToAllocated(result, n);
            }
            k--;
            }
            n = graph.GetHighestDegreeNode();
            graph.Remove(n);
            spill.Add(n.id);
            result = simplify(graph, spill);
            if(result == null){
            return null;
            }
            graph.Add(n);
            result = appendToAllocated(result, n); //you know, let's just try to colour the node anyway
            if(result != null){
            spill.Remove(n.id);
            }
            return result;
        }