qbe

Internal scc patchset buffer for QBE
Log | Files | Refs | README | LICENSE

commit 491c55e6e0295904c8c5f996503b4e8b9e2e180c
parent 8992106928756d47697ea26f88b7b5eceacf3845
Author: Quentin Carbonneaux <quentin.carbonneaux@yale.edu>
Date:   Wed, 13 Apr 2016 11:41:26 -0400

handle odd jumps in blkdel() an renblk()

Diffstat:
Mssa.c | 7+++----
Mutil.c | 2++
2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/ssa.c b/ssa.c @@ -154,15 +154,14 @@ fillrpo(Fn *f) n = 1 + rporec(f->start, f->nblk-1); f->nblk -= n; f->rpo = alloc(f->nblk * sizeof f->rpo[0]); - for (p=&f->start; *p;) { - b = *p; + for (p=&f->start; (b=*p);) { if (b->id == -1) { blkdel(b); *p = b->link; } else { b->id -= n; f->rpo[b->id] = b; - p=&(*p)->link; + p = &b->link; } } } @@ -453,7 +452,7 @@ renblk(Blk *b, Name **stk, Fn *fn) if (fn->tmp[t].visit) b->jmp.arg = getstk(t, b, stk); succ[0] = b->s1; - succ[1] = b->s2; + succ[1] = b->s2 == b->s1 ? 0 : b->s2; succ[2] = 0; for (ps=succ; (s=*ps); ps++) for (p=s->phi; p; p=p->link) { diff --git a/util.c b/util.c @@ -104,6 +104,8 @@ blkdel(Blk *b) Phi *p; uint a; + if (b->s1 == b->s2) /* do not delete twice */ + b->s2 = 0; for (ps=(Blk*[]){b->s1, b->s2, 0}; (s=*ps); ps++) { for (p=s->phi; p; p=p->link) { for (a=0; p->blk[a]!=b; a++)