Exemple #1
0
 private void Build()
 {
     foreach (BasicBlock b in Blocks)
     {
         HashSet <Temp.Temp> live = new HashSet <Temp.Temp>(b.LiveOut);
         for (int i = b.List.Count - 1; i >= 0; i--)
         {
             TExp inst = b.List[i];
             if (inst is Move)
             {
                 live.ExceptWith(inst.LivenessNode.Use);
                 HashSet <Temp.Temp> nodes = new HashSet <Temp.Temp>(inst.LivenessNode.Def);
                 nodes.UnionWith(inst.LivenessNode.Use);
                 foreach (Temp.Temp n in nodes)
                 {
                     GetNodeByTemp(n).MoveList.Add((Move)inst);
                 }
                 WorklistMoves.Add((Move)inst);
             }
             live.UnionWith(inst.LivenessNode.Def);
             foreach (Temp.Temp d in inst.LivenessNode.Def)
             {
                 foreach (Temp.Temp l in live)
                 {
                     AddEdge(l, d);
                 }
             }
             live.ExceptWith(inst.LivenessNode.Def);
             live.UnionWith(inst.LivenessNode.Use);
         }
     }
 }
Exemple #2
0
 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);
             }
         }
     }
 }
Exemple #3
0
            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);
                }
            }