diff options
-rw-r--r-- | alias.c | 8 | ||||
-rw-r--r-- | test/alias1.ssa | 21 |
2 files changed, 26 insertions, 3 deletions
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; 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); } 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 +} |