qbe

Internal scc patchset buffer for QBE
Log | Files | Refs | README | LICENSE

commit cde5f95591b6f38df235ac16ee7ee979ec19bd09
parent d9b0d77cf20cb8340bc4a77b66aa8cb56c75b496
Author: Quentin Carbonneaux <quentin@c9x.me>
Date:   Mon, 18 Feb 2019 13:47:33 +0100

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.

Diffstat:
Malias.c | 4+++-
Atest/load1.ssa | 27+++++++++++++++++++++++++++
2 files changed, 30 insertions(+), 1 deletion(-)

diff --git 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 @@ -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); +# } +# <<<