<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 12, 2017 at 12:05 PM, Hal Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000"><span class="">
<p><br>
</p>
<div class="m_-338768868072955767moz-cite-prefix">On 04/11/2017 09:19 PM, Daniel Berlin
via llvm-dev wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Tue, Apr 11, 2017 at 7:02 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">
<div class="gmail_extra">
<div class="gmail_quote"><span>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<span><br>
> It would require semantic changes to llvm
ir to fix this to properly<br>
> express object lifetimes that is
compatible with all the random babble<br>
> standards have written down :)<br>
> For now, the only sane solution IMHO, is
to say that no alias implies<br>
> pointer inequality, regardless of the
standards. Because the above can<br>
> occur in any situation noalias exists but
they are allowed to be pointer<br>
> equal (as mentioned, it's trivial to make
this happen in TBAA).<br>
<br>
</span>Just to be clear, you're suggesting that
we no longer mark malloc's<br>
return value as noalias?<br>
</blockquote>
<div><br>
</div>
</span>
<div>Actually, i'd suggest just letting it be a bug
:)</div>
<div>That's what other compilers seem to do.</div>
<div>You could hack around this in clang by using
the !alias.scope and !noalias form, and not
attaching the scope past the lifetime end.<br>
</div>
<div><br>
</div>
<div>But we don't optimize that.</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
<div>(by this i mean it's only used by memdep).</div>
<div><br>
</div>
<div>I believe hal also has a noalias instrinsic proposal
that would have been useful here.</div>
<div><br>
</div>
<div>But thinking harder, it has the same problem because
there is no way to end the lifetime of something in ssa,
and thus, iif do</div>
<div>a1 = llvm.noalias(a)<br>
b1 = llvm.noalias(b)</div>
<div>if (a1 == b1)</div>
<div> oh crap</div>
</div>
</div>
</div>
</blockquote>
<br></span>
Yep; doesn't help.<span class=""><br>
<br>
<blockquote type="cite">
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<div><br>
</div>
<div>So we can't use it to specify the lifetimes here.</div>
<div><br>
</div>
<div><br>
</div>
</div>
</div>
</div>
</blockquote>
<br></span>
I feel like this is the perfect place for a pithy quote on self
deception. The core problem here is that we allow the optimizer to
rely on a lie (that all memory from malloc, and other noalias
functions, is distinct). This, of course, is not really true. The
consequence seems to be that if you write code that can observe the
fallacy of this assumption - *even dead code* - then the model
breaks. Dead code can observe things, in this sense, I suppose, if
there are no data dependencies or side effects that prevent the
optimizer from making it speculatively live.<br></div></blockquote><div><br></div><div>I think richard put it better.</div><div>The core of the lie is that if two pointers have the same bit value, they are as good as each other, and must have the same abstract identity</div><div>This would in fact, be true, if we could *end* the identity of a pointer every time a language-level "abstract identity" change occurred.</div><div>The problem is this lie is pretty core to the identity of llvm right now.</div><div><br></div><div>There is no way to end the lifetime of a scalar value in SSA (and doing so would break pretty much every nice property it has).</div><div><br></div><div>So you can't say:</div><div>"lifetime.ended(foo)<br></div><div><it's not valid to use foo anymore>"</div><div><br></div><div><br></div><div>We can use something like memoryssa (let's call it or orderedmemoryssa, let's call it), mark the lifetime/identity changes as "ordering" defs, and get that the two pointers are not noalias because they are not the same abstract identity as the one marked noalias.</div><div><br></div><div>RIght now to hack up noalias we could use the noalias scoping information.</div><div>But it's not going to help the other cases we have that do the same thing.</div><div><br></div></div></div></div>