From f123a0868ca44ca5fb5adf5c230ad03e5eb058b0 Mon Sep 17 00:00:00 2001 From: lemon Date: Sat, 20 Dec 2025 13:17:08 +0100 Subject: copyopt: optimize same-arg phis with multiple preds --- ir/ssa.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'ir') diff --git a/ir/ssa.c b/ir/ssa.c index 31cab4b..9d248f4 100644 --- a/ir/ssa.c +++ b/ir/ssa.c @@ -7,15 +7,19 @@ copyopt(struct function *fn) FREQUIRE(FNUSE); do { - if (blk->npred == 1) for (int i = 0; i < blk->phi.n; ++i) { - /* simplify 1-arg phi */ + for (int i = 0; i < blk->phi.n; ++i) { + /* simplify same-arg phi */ int phi = blk->phi.p[i]; union ref *arg = phitab.p[instrtab[phi].l.i]; + for (int j = 1; j < blk->npred; ++j) { + if (arg[j].bits != arg->bits) goto Next; + } /* being conservative here because phis could have circular dependencies? */ if (arg->t != RTMP || instrtab[arg->i].op != Ophi) { replcuses(mkref(RTMP, phi), *arg); delphi(blk, i--); } + Next:; } for (int i = 0; i < blk->ins.n; ++i) { union ref var = mkref(RTMP, blk->ins.p[i]); -- cgit v1.2.3