Пример #1
0
            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);
                }
            }
Пример #2
0
 private void AddWorkList(Node u)
 {
     if (!Precolored.Contains(u) && !MoveRelated(u) && u.Degree < K)
     {
         FreezeWorklist.Remove(u);
         SimplifyWorklist.Add(u);
     }
 }
Пример #3
0
            private void Freeze()
            {
                HashSet <Node> .Enumerator it = FreezeWorklist.GetEnumerator();
                it.MoveNext();
                Node n = it.Current;

                FreezeWorklist.Remove(n);
                SimplifyWorklist.Add(n);
                FreezeMoves(n);
            }
Пример #4
0
            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);
                    }
                }
            }
Пример #5
0
 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);
         }
     }
 }
Пример #6
0
 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);
         }
     }
 }