<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jun 13, 2016 at 9:57 AM, 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 dir="ltr"><div><div class="h5"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jun 13, 2016 at 7:35 AM, 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>On Sun, Jun 12, 2016 at 10:12 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 dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><span>On Sun, Jun 12, 2016 at 9:31 PM, Yichao Yu <span dir="ltr"><<a href="mailto:yyc1992@gmail.com" target="_blank">yyc1992@gmail.com</a>></span> wrote:<span></span><br><span></span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>
> Alias analysis results should not be confused with value equivalence (though<br>
> it is common).  MustAlias or NoAlias implies nothing about the actual<br>
> pointer value, only the abstract memory location it represents.<br>
<br>
</span>I can understand they are not equivalent but shouldn't not being the<br>
same pointer value be a necessary condition for NoAlias? In another<br>
word, are the following valid?<br>
<br>
```<br>
define i64 @f1(i64 *%p0, i64 *%p1) {<br>
  store i64 0, i64 *%p0, !tbaa !0<br>
<span>  %v2 = load i64, i64 *%p1, !tbaa !1<br>
</span>  ret %v2<br>
}<br>
<br>
define i64 @f2(i64 *%p1) {<br>
  store i64 0, i64 *%p1, !tbaa !0<br>
<span>  %v2 = load i64, i64 *%p1, !tbaa !1<br>
</span>  ret %v2<br>
}<br>
<br></blockquote><div><br></div></span><div>It depends on what you mean by "valid"... @f1 passed two identical pointers is basically equivalent to "ret i64 undef". </div></div></div></div></blockquote><div><br></div></span><div>So, i can't see anything in the langref that says this.<br></div><div><br></div><div>For f1, the valid things i see you can do are (and have an argument you can)<br><br></div><div>1. move the load before the store, return value of load (IE reorder them)</div><div>2. eliminate both the load and store and return 0 (IE forward the store)</div><div><br></div><div>I don't see a valid path to ret undef. I'm eminently curious what i've missed :)</div><div><br></div></div></div></div>
</blockquote></div><br></div></div></div><div class="gmail_extra">LLVM can turn "store zero" into "store <arbitrary-value>; store zero", then reorder the load between the two stores.<br><br></div></div></blockquote><div>I have trouble seeing why this would be legal, unless arbitrary value is also zero :)</div><div><br></div><div>The original of the load semantics were either "it loads the value that existed prior to function start", or "it loads the value of the store (zero)".<br></div><div>What you are suggesting is something that changes the semantics to "it loads an arbitrary value".</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"></div><div class="gmail_extra">In practice, that particular transformation is unlikely to be profitable... a more realistic example is that on a 32-bit platform the store will get split, and the load could get reordered between the pieces.<span class="HOEnZb"><font color="#888888"><br></font></span></div><span class="HOEnZb"><font color="#888888"><div class="gmail_extra"><br></div></font></span></div></blockquote><div><br></div><div>If the store is split, it will not change the semantics like you are suggesting above, in the sense that you are still performing the same operations you were originally, just at different times. That seems okay to me, unlike "i'm going to perform a different set of operations that cause a visible difference to occur"</div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span class="HOEnZb"><font color="#888888"><div class="gmail_extra">-Eli<br></div></font></span></div>
</blockquote></div><br></div></div>