aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2025-11-21 09:39:10 +0100
committerlemon <lsof@mailbox.org>2025-11-21 09:41:45 +0100
commit07eb8577152f1cfb491e352132ab887c8b0d4237 (patch)
tree7a05c8cc19feea6c15acdf64fe746bf982a38c30
parent211a9fc2510556bf5efb58789509325e49dbdc26 (diff)
ir: fix delpred when npred becomes 1
-rw-r--r--ir/ir.c14
1 files 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;
}
}