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"); } } }
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()); } } }