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:
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++)