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.
This commit is contained in:
Quentin Carbonneaux 2024-03-07 16:40:51 +01:00
parent 2d683e0c53
commit bd7a73d0ea
2 changed files with 26 additions and 3 deletions

View file

@ -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; n<fn->nblk; ++n) {
b = fn->rpo[n];
for (p=b->phi; p; p=p->link) {
for (m=0; m<p->narg; 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; n<p->narg; n++)
esc(p->arg[n], fn);
}

21
test/alias1.ssa Normal file
View file

@ -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
}