aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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) {