private void EnableMoves(List <Node> nodes) { foreach (Node n in nodes) { foreach (Move m in NodeMoves(n)) { if (ActiveMoves.Contains(m)) { ActiveMoves.Remove(m); WorklistMoves.Add(m); } } } }
private void Coalesce() { Move m = WorklistMoves[0]; WorklistMoves.RemoveAt(0); Node x = GetAlias(GetNodeByTemp(m.Dst)); Node y = GetAlias(GetNodeByTemp(m.Src)); Node u, v; if (Precolored.Contains(y)) { u = y; v = x; } else { u = x; v = y; } List <Node> nodes = new List <Node>(Adjacent(u)); nodes.AddRange(Adjacent(v)); if (u == v) { CoalescedMoves.Add(m); AddWorkList(u); } else if (Precolored.Contains(v) || AdjSet.Contains(new Edge(u, v))) { ConstrainedMoves.Add(m); AddWorkList(u); AddWorkList(v); } else if (Precolored.Contains(u) && CheckOK(u, v) || !Precolored.Contains(u) && Conservative(nodes)) { CoalescedMoves.Add(m); Combine(u, v); AddWorkList(u); } else { ActiveMoves.Add(m); } }
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); } } }