Exemplo n.º 1
0
 void Trace(Tree.StmList l)
 {
     for (; ;)
     {
         Tree.LABEL lab = (Tree.LABEL)l.Head;
         Table.Remove(lab.Label);
         Tree.StmList last = GetLast(l);
         Tree.Stm     s    = last.Tail.Head;
         if (s is Tree.JUMP)
         {
             Tree.JUMP    j      = (Tree.JUMP)s;
             Tree.StmList target = (Tree.StmList)Table[j.Targets.Head];
             if (j.Targets.Tail == null && target != null)
             {
                 last.Tail = target;
                 l         = target;
             }
             else
             {
                 last.Tail.Tail = GetNext();
                 return;
             }
         }
         else if (s is Tree.CJUMP)
         {
             Tree.CJUMP   j = (Tree.CJUMP)s;
             Tree.StmList t = (Tree.StmList)Table[j.IfTrue];
             Tree.StmList f = (Tree.StmList)Table[j.IfFalse];
             if (f != null)
             {
                 last.Tail.Tail = f;
                 l = f;
             }
             else if (t != null)
             {
                 last.Tail.Head = new Tree.CJUMP(Tree.CJUMP.NotRel(j.Relop),
                                                 j.Left, j.Right,
                                                 j.IfFalse, j.IfTrue);
                 last.Tail.Tail = t;
                 l = t;
             }
             else
             {
                 Temp.Label ff = new Temp.Label();
                 last.Tail.Head = new Tree.CJUMP(j.Relop, j.Left, j.Right,
                                                 j.IfTrue, ff);
                 last.Tail.Tail = new Tree.StmList(new Tree.LABEL(ff),
                                                   new Tree.StmList(new Tree.JUMP(j.IfFalse),
                                                                    GetNext()));
                 return;
             }
         }
         else
         {
             throw new FatalError("Bad basic block in TraceSchedule");
         }
     }
 }
Exemplo n.º 2
0
 Tree.StmList GetNext()
 {
     if (Blocks.Blocks == null)
     {
         return(new Tree.StmList(new Tree.LABEL(Blocks.Done), null));
     }
     else
     {
         Tree.StmList s   = Blocks.Blocks.Head;
         Tree.LABEL   lab = (Tree.LABEL)s.Head;
         if (Table[lab.Label] != null)
         {
             Trace(s);
             return(s);
         }
         else
         {
             Blocks.Blocks = Blocks.Blocks.Tail;
             return(GetNext());
         }
     }
 }