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); }
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; }
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); }
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; }