Here is the result of running mem2reg then basicaa, it is even worse: (%a should be alias to %0, and partial alias to %3)<div><br></div><div><div>opt -mem2reg -basicaa -aa-eval -print-all-alias-modref-info < foo.s > /dev/null</div>
<div>Function: foo: 6 pointers, 0 call sites</div><div>  NoAlias:      i32* %a, i32* %b</div><div>  NoAlias:      i32* %a, i32* %c</div><div>  NoAlias:      i32* %b, i32* %c</div><div><span style="background-color:rgb(255,255,102)">  PartialAlias: i32* %1, i32* %a</span></div>
<div>  NoAlias:      i32* %1, i32* %b</div><div>  NoAlias:      i32* %1, i32* %c</div><div>  NoAlias:      i32* %4, i32* %a</div><div>  PartialAlias: i32* %4, i32* %b</div><div>  NoAlias:      i32* %4, i32* %c</div><div>  NoAlias:      i32* %1, i32* %4</div>
<div>  NoAlias:      i32* %8, i32* %a</div><div>  NoAlias:      i32* %8, i32* %b</div><div>  PartialAlias: i32* %8, i32* %c</div><div>  NoAlias:      i32* %1, i32* %8</div><div>  NoAlias:      i32* %4, i32* %8</div><div><br>
</div><br><div class="gmail_quote">On Fri, Sep 21, 2012 at 3:18 PM, Eli Friedman <span dir="ltr"><<a href="mailto:eli.friedman@gmail.com" target="_blank">eli.friedman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On Fri, Sep 21, 2012 at 3:08 PM, Welson Sun <<a href="mailto:welson.sun@gmail.com">welson.sun@gmail.com</a>> wrote:<br>
> OK, with the restrict type qualifier, it is a little bit better:<br>
><br>
> The IR's function signature becomes:<br>
> define void @foo(i32* noalias %a, i32* noalias %b, i32* noalias %c) nounwind<br>
> {<br>
><br>
> Now the AA result:<br>
> Function: foo: 13 pointers, 0 call sites<br>
>   NoAlias:      i32* %a, i32* %b<br>
>   NoAlias:      i32* %a, i32* %c<br>
>   NoAlias:      i32* %b, i32* %c<br>
>   NoAlias:      i32* %a, i32** %a_addr<br>
>   NoAlias:      i32* %b, i32** %a_addr<br>
>   NoAlias:      i32* %c, i32** %a_addr<br>
>   NoAlias:      i32* %a, i32** %b_addr<br>
>   NoAlias:      i32* %b, i32** %b_addr<br>
>   NoAlias:      i32* %c, i32** %b_addr<br>
>   NoAlias:      i32** %a_addr, i32** %b_addr<br>
>   NoAlias:      i32* %a, i32** %c_addr<br>
>   NoAlias:      i32* %b, i32** %c_addr<br>
>   NoAlias:      i32* %c, i32** %c_addr<br>
>   NoAlias:      i32** %a_addr, i32** %c_addr<br>
>   NoAlias:      i32** %b_addr, i32** %c_addr<br>
>   NoAlias:      i32* %a, i32* %i<br>
>   NoAlias:      i32* %b, i32* %i<br>
>   NoAlias:      i32* %c, i32* %i<br>
>   NoAlias:      i32* %i, i32** %a_addr<br>
>   NoAlias:      i32* %i, i32** %b_addr<br>
>   NoAlias:      i32* %i, i32** %c_addr<br>
>   MayAlias:     i32* %0, i32* %a<br>
>   MayAlias:     i32* %0, i32* %b<br>
>   MayAlias:     i32* %0, i32* %c<br>
>   NoAlias:      i32* %0, i32** %a_addr<br>
>   NoAlias:      i32* %0, i32** %b_addr<br>
>   NoAlias:      i32* %0, i32** %c_addr<br>
>   NoAlias:      i32* %0, i32* %i<br>
>   MayAlias:     i32* %3, i32* %a<br>
>   MayAlias:     i32* %3, i32* %b<br>
>   MayAlias:     i32* %3, i32* %c<br>
>   NoAlias:      i32* %3, i32** %a_addr<br>
>   NoAlias:      i32* %3, i32** %b_addr<br>
>   NoAlias:      i32* %3, i32** %c_addr<br>
>   NoAlias:      i32* %3, i32* %i<br>
>   PartialAlias: i32* %0, i32* %3<br>
>   MayAlias:     i32* %5, i32* %a<br>
>   MayAlias:     i32* %5, i32* %b<br>
>   MayAlias:     i32* %5, i32* %c<br>
>   NoAlias:      i32* %5, i32** %a_addr<br>
>   NoAlias:      i32* %5, i32** %b_addr<br>
>   NoAlias:      i32* %5, i32** %c_addr<br>
>   NoAlias:      i32* %5, i32* %i<br>
>   MayAlias:     i32* %0, i32* %5<br>
>   MayAlias:     i32* %3, i32* %5<br>
>   MayAlias:     i32* %8, i32* %a<br>
>   MayAlias:     i32* %8, i32* %b<br>
>   MayAlias:     i32* %8, i32* %c<br>
>   NoAlias:      i32* %8, i32** %a_addr<br>
>   NoAlias:      i32* %8, i32** %b_addr<br>
>   NoAlias:      i32* %8, i32** %c_addr<br>
>   NoAlias:      i32* %8, i32* %i<br>
>   MayAlias:     i32* %0, i32* %8<br>
>   MayAlias:     i32* %3, i32* %8<br>
>   PartialAlias: i32* %5, i32* %8<br>
>   MayAlias:     i32* %11, i32* %a<br>
>   MayAlias:     i32* %11, i32* %b<br>
>   MayAlias:     i32* %11, i32* %c<br>
>   NoAlias:      i32* %11, i32** %a_addr<br>
>   NoAlias:      i32* %11, i32** %b_addr<br>
>   NoAlias:      i32* %11, i32** %c_addr<br>
>   NoAlias:      i32* %11, i32* %i<br>
>   MayAlias:     i32* %0, i32* %11<br>
>   MayAlias:     i32* %11, i32* %3<br>
>   MayAlias:     i32* %11, i32* %5<br>
>   MayAlias:     i32* %11, i32* %8<br>
>   MayAlias:     i32* %14, i32* %a<br>
>   MayAlias:     i32* %14, i32* %b<br>
>   MayAlias:     i32* %14, i32* %c<br>
>   NoAlias:      i32* %14, i32** %a_addr<br>
>   NoAlias:      i32* %14, i32** %b_addr<br>
>   NoAlias:      i32* %14, i32** %c_addr<br>
>   NoAlias:      i32* %14, i32* %i<br>
>   MayAlias:     i32* %0, i32* %14<br>
>   MayAlias:     i32* %14, i32* %3<br>
>   MayAlias:     i32* %14, i32* %5<br>
>   MayAlias:     i32* %14, i32* %8<br>
>   PartialAlias: i32* %11, i32* %14<br>
><br>
> a, b and c are no longer alias, as expected. However, they all may alias to<br>
> %0. I guess basicaa doesn't handle data flow analysis?<br>
<br>
</div></div>No.  Try running mem2reg.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Eli<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>Welson<div><br></div><div>Phone: (408) 418-8385</div><div>Email:  <a href="mailto:welson.sun@gmail.com" target="_blank">welson.sun@gmail.com</a></div>
<div><br></div><br>
</div>