summary refs log tree commit diff
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin@c9x.me>2019-02-18 13:47:33 +0100
committerQuentin Carbonneaux <quentin@c9x.me>2019-02-18 13:56:03 +0100
commitcde5f95591b6f38df235ac16ee7ee979ec19bd09 (patch)
tree84443f9ab1c20761b59c833e66a804144ae62235
parentd9b0d77cf20cb8340bc4a77b66aa8cb56c75b496 (diff)
downloadroux-cde5f95591b6f38df235ac16ee7ee979ec19bd09.tar.gz
mark phi arguments as escaping
Thanks to Michael Forney for spotting this
oversight and providing the test case.

Note: because esc() leaves ABot unchanged,
the assertion "a->type == ABot" on line 122
remains valid.
-rw-r--r--alias.c4
-rw-r--r--test/load1.ssa27
2 files changed, 30 insertions, 1 deletions
diff --git a/alias.c b/alias.c
index 66c12e5..aa3846e 100644
--- a/alias.c
+++ b/alias.c
@@ -106,7 +106,7 @@ esc(Ref r, Fn *fn)
 void
 fillalias(Fn *fn)
 {
-	uint n;
+	uint n, m;
 	Blk *b;
 	Phi *p;
 	Ins *i;
@@ -115,6 +115,8 @@ 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);
diff --git a/test/load1.ssa b/test/load1.ssa
new file mode 100644
index 0000000..a87fd2d
--- /dev/null
+++ b/test/load1.ssa
@@ -0,0 +1,27 @@
+# checks that phi arguments are correctly
+# handled in alias analysis
+
+export
+function w $f(w %cond) {
+@start
+        %x =l alloc4 4
+        %y =l alloc4 4
+        storew 0, %x
+        jnz %cond, @true, @false
+@true
+        jmp @end
+@false
+        jmp @end
+@end
+        %ptr =l phi @true %x, @false %y
+        storew 1, %ptr
+        %result =w loadsw %x
+        ret %result
+}
+
+# >>> driver
+# extern int f(int);
+# int main() {
+# 	return !(f(0) == 0 && f(1) == 1);
+# }
+# <<<