<div dir="ltr"><div><div>Getting more detailed tbaa information (for both, the access and the structure content) should help for this case.<br><br></div>Greetings,<br><br></div>Jeroen <br><div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 20, 2015 at 9:01 PM, Daniel Berlin <span dir="ltr"><<a href="mailto:dberlin@dberlin.org" target="_blank">dberlin@dberlin.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">So, on that review thread Nick, sadly, pointed out a difference between language and llvm level analysis.<div><span class=""><br><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px">void test_s03c(struct S03* a, struct S03* b)</span><br style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px">{</span><br style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px">  a->mS00_1[0].mI_2=1;</span><br style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px">  b->mS00_1[1].mI_2=2;</span><br style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><br style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px">  // c++11:   NoAlias</span><br style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px">  // llvm:    MayAlias ******** performance</span><br style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px">  // future:  NoAlias</span><br style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px">}</span><br><div><span style="font-family:monospace,monospace;font-size:13.1999998092651px;line-height:19.7999992370605px"><br></span></div><div><br></div></span><div>(Assuming for a second that we all agree they are NoAlias at the C++ level.</div><div><br></div><div>You can make these alias at the LLVM level using negative GEPs  to make the a and b pointers go to the same place (and while I had noticed this at the local level, nick deviously pointed out it could have happened in our caller).</div><div><br></div><div>The good news is nick believes it's still possible to get this optimization back in some cases :)</div><div><div class="h5"><div><br></div>[...]<br></div></div></div></div></blockquote></div>-- <br><div class="gmail_signature">Jeroen Dobbelaere<br></div>
</div></div></div></div></div>