<div dir="ltr">Okay, overnight i ran a ton of tests on this patch, and it seems right.<div>Nick, Hal, can you review it?</div><div><br></div><div>I've reattached it for simplicity</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 15, 2015 at 3:05 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"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Thu, Jan 15, 2015 at 1:26 PM, Nick Lewycky <span dir="ltr"><<a href="mailto:nlewycky@google.com" target="_blank">nlewycky@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>On 15 January 2015 at 13:10, 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">Yes.<div>I've attached an updated patch that does the following:<br><br></div><div>1. Fixes the partialalias of globals/arguments</div><div>2. Enables partialalias for cases where nothing has been unified to a global/argument</div><div>3. Fixes that select was unifying the condition to the other pieces (the condition does not need to be processed :P). This was causing unnecessary aliasing.</div></div></blockquote><div><br></div></span><div>Consider this:<br></div><div><br></div><div>void *p = ...;</div><div>uintptr_t i = p;</div><div>uintptr_t j = 0;</div><div>for (int a = 0; a < sizeof(uintptr_t); ++a) {</div><div>  j = i >> (sizeof(uintptr_t) - a - 1) ? 1 : 0;</div><div>  j <<= 1;</div><div>}</div><div>void *q = j;</div><div><br></div><div>alias(p, q) isn't NoAlias. (Okay, it kinda is in C++, but not in the equivalent LLVM IR. Please don't make me rewrite my example in LLVM IR.)</div><span><font color="#888888"><div><br></div></font></span></div></div></div></blockquote></span><div>Agreed :)</div><div><br></div><div>But after chatting with you, i think we both agree that this change does not affect.</div><div>I probably should not have said "the condition does not need to be processed".  It would be more accurate to say "the reference to a condition in a select instruction, by itself, does not cause aliasing" </div><div><br></div><div>What happens now is:</div><div><br></div><div>given %4 = select %1, %2, %3</div><div><br></div><div>we do</div><div>aliasset(%4) += %1</div><div>aliasset(%4) += %2</div><div>aliasset(%4) += %3</div><div> </div><div>The first one is unnecessary.</div><div>There can be no alias caused simply because it is referenced in condition of the select.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span><font color="#888888"></font></span></div></div></div></blockquote><div>We still need to process what %1 refers to (and we do).</div><div><br></div><div><br></div><div>To make this empirical, in your example, we get the right answer in CFL-AA.</div><div><br></div><div>Interestingly, i'll point out that basic-aa says:<br><div>  NoAlias:<span style="white-space:pre-wrap">     </span>i8* %p, i8** %q</div><div>  NoAlias:<span style="white-space:pre-wrap">       </span>i8** %p.addr, i8** %q</div></div><div><br></div><div>(I translated your case as best i can :P)</div><div><br></div><div>So you may want to implement it for real if you think it's supposed to be handled right in basic-aa, because I don't believe it is :)</div><div><br></div></div></div></div>
</blockquote></div><br></div>