aboutsummaryrefslogtreecommitdiffhomepage
path: root/ir
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-11-02 19:26:01 +0100
committerlemon <lsof@mailbox.org>2025-11-02 19:26:01 +0100
commitfab6314ffcb547cbbf45ce16e390eba00e5bfa31 (patch)
tree63bc430c4009122367e13ce52446b440c3d652e9 /ir
parentca3dd9e031edf9c5c756e7bcee12a45eca368c62 (diff)
cfg: allow dead blocks with alloca pseudo instrs
Diffstat (limited to 'ir')
-rw-r--r--ir/cfg.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/ir/cfg.c b/ir/cfg.c
index df428d1..8e86cb2 100644
--- a/ir/cfg.c
+++ b/ir/cfg.c
@@ -24,14 +24,19 @@ sortrpo(struct function *fn)
fn->entry->id = 0;
porec(&rpo, fn->entry);
ndead = rpo - rpobuf;
- for (struct block *blk = fn->entry->lprev, *next; ndead > 0; blk = next) {
+ for (struct block *blk = fn->entry->lprev, *next; blk != fn->entry; blk = next) {
next = blk->lprev;
if (!wasvisited(blk)) {
+ for (int i = 0; i < blk->ins.n; ++i) {
+ /* don't delete unreachable blocks with alloca pseudo-instrs */
+ if (oisalloca(instrtab[blk->ins.p[i]].op))
+ goto Next;
+ }
for (int i = 0; i < blk->npred; ++i)
assert(!wasvisited(blkpred(blk, i)));
- blk->lnext = blk->lprev = NULL;
freeblk(fn, blk);
--ndead;
+ Next:;
}
}
for (i = 1, ++rpo; rpo < rpoend; ++rpo, ++i) {