aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--ir/regalloc.c5
-rw-r--r--test/06-goto.c5
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) {