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"); } } }
static Tree.StmList Linear(Tree.Stm s, Tree.StmList l) { if (s is Tree.SEQ) { return(Linear((Tree.SEQ)s, l)); } else { return(new Tree.StmList(s, l)); } }
static Tree.Stm Seq(Tree.Stm a, Tree.Stm b) { if (IsNop(a)) { return(b); } else if (IsNop(b)) { return(a); } else { return(new Tree.SEQ(a, b)); } }
static Tree.Stm DoStm(Tree.Stm s) { if (s is Tree.SEQ) { return(DoStm((Tree.SEQ)s)); } else if (s is Tree.MOVE) { return(DoStm((Tree.MOVE)s)); } else if (s is Tree.EXP) { return(DoStm((Tree.EXP)s)); } else { return(ReorderStm(s)); } }
static public Tree.StmList Linearize(Tree.Stm s) { return(Linear(DoStm(s), null)); }
private void AddStm(Tree.Stm s) { LastStm = LastStm.Tail = new Tree.StmList(s, null); }
static Tree.ESEQ DoExp(Tree.ESEQ e) { Tree.Stm stms = DoStm(e.Stm); Tree.ESEQ b = DoExp(e.Exp); return(new Tree.ESEQ(Seq(stms, b.Stm), b.Exp)); }
static Tree.Stm ReorderStm(Tree.Stm s) { StmExpList x = Reorder(s.Kids()); return(Seq(x.Stm, s.Build(x.Exps))); }
static bool Commute(Tree.Stm a, Tree.Expr b) { return(IsNop(a) || b is Tree.NAME || b is Tree.CONST); }
static bool IsNop(Tree.Stm a) { return(a is Tree.EXP && ((Tree.EXP)a).Exp is Tree.CONST); }
public StmExpList(Tree.Stm s, Tree.ExpList e) { Stm = s; Exps = e; }