diff options
| -rw-r--r-- | ir/regalloc.c | 5 | ||||
| -rw-r--r-- | test/06-goto.c | 5 |
2 files changed, 9 insertions, 1 deletions
diff --git a/ir/regalloc.c b/ir/regalloc.c index e8eccfb..c1d925d 100644 --- a/ir/regalloc.c +++ b/ir/regalloc.c @@ -1218,11 +1218,14 @@ fini(struct rega *ra) bool delet = 1; for (int i = 0; i < blk->npred; ++i) { struct block *p = blkpred(blk, i); - if (p->s2 && !blk->s1) + if (p == blk || (p->s2 && !blk->s1)) delet = 0; } + startbbvisit(); for (int i = 0; i < blk->npred; ++i) { struct block *p = blkpred(blk, i); + if (wasvisited(p)) break; + markvisited(p); if (!p->s2 && !blk->s1) { /* simplify: * diff --git a/test/06-goto.c b/test/06-goto.c index 075467c..a0f2457 100644 --- a/test/06-goto.c +++ b/test/06-goto.c @@ -22,6 +22,11 @@ e: x <<= 1; goto b; } +void dummy() { + for (;;) { + ; + } +} int printf(const char *, ...); int main(int n) { |