summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--alias.c8
-rw-r--r--test/alias1.ssa21
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
+}