aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir/regalloc.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-12-20 20:22:12 +0100
committerlemon <lsof@mailbox.org>2025-12-20 20:22:12 +0100
commit3ff0bfcb86427ea33cd94fde1336dd6687fb5f99 (patch)
treee25496bc2277cfbb406200544bf17b8929b8f9bb /ir/regalloc.c
parent9721d6ba4036c325a7bdecbf867927566f78e81e (diff)
rega: fix infinite loop when compiling infinite loop
Diffstat (limited to 'ir/regalloc.c')
-rw-r--r--ir/regalloc.c5
1 files changed, 4 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:
*