From 644b604af4b3535c1cc3208fada2a4909fca5a92 Mon Sep 17 00:00:00 2001 From: Quentin Carbonneaux Date: Thu, 7 Mar 2024 16:40:51 +0100 Subject: fix bug in alias analysis The handling of phi was incorrect and we would sometimes miss escapes. We now handle phis at the very end of the pass to make sure the defs for their arguments have all been processed. --- alias.c | 8 +++++--- test/alias1.ssa | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 test/alias1.ssa diff --git a/alias.c b/alias.c index 3885115..9b41084 100644 --- a/alias.c +++ b/alias.c @@ -132,7 +132,7 @@ store(Ref r, int sz, Fn *fn) void fillalias(Fn *fn) { - uint n, m; + uint n; int t, sz; int64_t x; Blk *b; @@ -146,8 +146,6 @@ fillalias(Fn *fn) for (n=0; nnblk; ++n) { b = fn->rpo[n]; for (p=b->phi; p; p=p->link) { - for (m=0; mnarg; m++) - esc(p->arg[m], fn); assert(rtype(p->to) == RTmp); a = &fn->tmp[p->to.val].alias; assert(a->type == ABot); @@ -217,4 +215,8 @@ fillalias(Fn *fn) if (b->jmp.type != Jretc) esc(b->jmp.arg, fn); } + for (b=fn->start; b; b=b->link) + for (p=b->phi; p; p=p->link) + for (n=0; nnarg; n++) + esc(p->arg[n], fn); } diff --git a/test/alias1.ssa b/test/alias1.ssa new file mode 100644 index 0000000..a064fac --- /dev/null +++ b/test/alias1.ssa @@ -0,0 +1,21 @@ +export function w $main() { +@start + %a =l alloc4 4 + %b =l alloc4 4 + storew 4, %a + storew 5, %b + +@loop + # %mem will be %a and %b successively, + # but we do not know it when processing + # the phi because %b goes through a cpy + %mem =l phi @start %a, @loop %bcpy + + %w =w load %mem + %eq5 =w ceqw %w, 5 + %bcpy =l copy %b + jnz %eq5, @exit, @loop + +@exit + ret 0 +} -- cgit 1.4.1