From 07eb8577152f1cfb491e352132ab887c8b0d4237 Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 21 Nov 2025 09:39:10 +0100 Subject: ir: fix delpred when npred becomes 1 --- ir/ir.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/ir/ir.c b/ir/ir.c index 8bf9d4e..a54b04e 100644 --- a/ir/ir.c +++ b/ir/ir.c @@ -209,7 +209,7 @@ addpred(struct block *blk, struct block *p) } if (blk->npred == 1) { struct block *p0 = blk->_pred0; - blk->_pred = 0; + blk->_pred = NULL; xbgrow(&blk->_pred, 4); *blk->_pred = p0; } @@ -221,10 +221,20 @@ delpred(struct block *blk, struct block *p) { for (int i = 0; i < blk->npred; ++i) { if (blkpred(blk, i) == p) { + for (int j = 0; j < blk->phi.n; ++j) { + union ref *phiargs = phitab.p[instrtab[blk->phi.p[j]].l.i]; + for (int k = i; k < blk->npred - 1; ++k) { + phiargs[k] = phiargs[k + 1]; + } + } for (int k = i; k < blk->npred - 1; ++k) { blkpred(blk, k) = blkpred(blk, k + 1); } - --blk->npred; + if (--blk->npred == 1) { + struct block *p0 = blk->_pred[0]; + xbfree(blk->_pred); + blk->_pred0 = p0; + } return; } } -- cgit v1.2.3