private void Combine(Node u, Node v) { if (FreezeWorklist.Contains(v)) { FreezeWorklist.Remove(v); } else { SpillWorklist.Remove(v); } CoalescedNodes.Add(v); v.Alias = u; HashSet <Move> tmp = new HashSet <Move>(u.MoveList); tmp.UnionWith(v.MoveList); u.MoveList = new List <Move>(tmp); List <Node> vv = new List <Node>(); vv.Add(v); EnableMoves(vv); foreach (Node t in Adjacent(v)) { AddEdge(t.Temp, u.Temp); DecrementDegree(t); } if (u.Degree >= K && FreezeWorklist.Contains(u)) { FreezeWorklist.Remove(u); SpillWorklist.Add(u); } }
private void AddWorkList(Node u) { if (!Precolored.Contains(u) && !MoveRelated(u) && u.Degree < K) { FreezeWorklist.Remove(u); SimplifyWorklist.Add(u); } }
private void Freeze() { HashSet <Node> .Enumerator it = FreezeWorklist.GetEnumerator(); it.MoveNext(); Node n = it.Current; FreezeWorklist.Remove(n); SimplifyWorklist.Add(n); FreezeMoves(n); }
private void DecrementDegree(Node m) { int d = m.Degree; m.Degree = d - 1; if (d == K) { List <Node> nodes = new List <Node>(Adjacent(m)); nodes.Add(m); EnableMoves(nodes); SpillWorklist.Remove(m); if (MoveRelated(m)) { FreezeWorklist.Add(m); } else { SimplifyWorklist.Add(m); } } }
private void MakeWorklist() { while (Initial.Count != 0) { HashSet <Node> .Enumerator it = Initial.GetEnumerator(); it.MoveNext(); Node n = it.Current; Initial.Remove(n); if (n.Degree >= K) { SpillWorklist.Add(n); } else if (MoveRelated(n)) { FreezeWorklist.Add(n); } else { SimplifyWorklist.Add(n); } } }
private void FreezeMoves(Node u) { foreach (Move m in NodeMoves(u)) { Node x = GetNodeByTemp(m.Dst); Node y = GetNodeByTemp(m.Src); Node v; if (GetAlias(y) == GetAlias(u)) { v = GetAlias(x); } else { v = GetAlias(y); } ActiveMoves.Remove(m); FrozenMoves.Add(m); if (NodeMoves(v).Count == 0 && v.Degree < K) { FreezeWorklist.Remove(v); SimplifyWorklist.Add(v); } } }