From ade9f31efb42b6ce603f70191a2801adc244f733 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Wed, 6 May 2026 22:14:45 +0200 Subject: [PATCH] recognize more phis as copies Not only phi(%a, %a, ...) is a copy but any argument can also be a self reference. --- copy.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/copy.c b/copy.c index 658a381..975d1df 100644 --- a/copy.c +++ b/copy.c @@ -388,14 +388,20 @@ phicopyref(Fn *fn, Blk *b, Phi *p) { Blk *d, **s; Phi *p1; + Ref r; uint n, c; /* identical args */ - for (n=0; nnarg-1; n++) - if (!req(p->arg[n], p->arg[n+1])) - break; - if (n == p->narg-1) - return p->arg[n]; + r = R; + for (n=0; nnarg; n++) + if (!req(p->arg[n], p->to)) { + if (req(r, R)) + r = p->arg[n]; + else if (!req(p->arg[n], r)) + break; + } + if (n == p->narg) + return r; /* same as a previous phi */ for (p1=b->phi; p1!=p; p1=p1->link) {