<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 1, 2014, at 3:44 PM, Philip Reames <<a href="mailto:listmail@philipreames.com" class="">listmail@philipreames.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
  
    <meta content="text/html; charset=windows-1252" http-equiv="Content-Type" class="">
  
  <div bgcolor="#FFFFFF" text="#000000" class="">
    (Spawning a separate subthread off the 'Optimization hints for
    "constant" loads' discussion for a related question. )<br class="">
    <br class="">
    Looking at TBAA again, I was reminded that TBAA also contains a
    third field which indicates that "meaning
    <tt class="literal docutils">pointsToConstantMemory</tt>
    should return true; see <a class="external reference" href="http://llvm.org/docs/AliasAnalysis.html#OtherItfs">other
      useful
      AliasAnalysis methods</a>".  Looking at this a bit, it really
    seems like this flag has the exact same meaning as !invariant.load. 
    <br class="">
    <br class="">
    pointsToConstantMemory returns a value for a Location.  Since it is
    entirely legal to have two Locations which describe the same
    physical memory, it seems like you'd be back to the same semantics
    as !invariant.load.  <br class="">
    <br class="">
    The only uncertainty here is that a Location is clearly (??)
    position/Instruction specific.  Does that also imply that the
    Location is control dependent?  What is the semantics of the
    following code?<br class="">
    if (is_known_invariant) {<br class="">
      load %p, !tbaa is_constant=true<br class="">
    }<br class="">
    <br class="">
    Is the optimizer allowed to lift the load above the conditional? 
    (Assuming it can prove the location is known dereferenceable.)  The
    semantics for !invariant.load clearly allow this, but do the
    semantics for TBAA's constant flag?  <br class="">
    <br class="">
    I think the answer to these questions is that the load is *not*
    control dependent on the conditional (assuming it's otherwise known
    dereferenceable).  Given this, why do we have both?  Should we
    canonicalize one into the other?<br class=""></div></div></blockquote><div><br class=""></div><div>It would be very confusing if the two had different semantics.</div><div><br class=""></div><div>In either case, hoisting the load (without dropping metadata) is definitely legit. But conservatively, the invariance is still a path sensitive property. The load is invariant w.r.t. any store as long as control reaches a use-with-side-effects of the loaded value.</div><div><br class=""></div><div>Given:</div><div><br class=""></div><div>store %q</div><div>m1 = load %p</div><div>if <something> {</div><div> m2 = load %p, !invariant.load</div><div>}</div><div>m = phi(m1, m2)</div><div><br class=""></div><div>We can safely convert to:</div><div><div><br class=""></div><div>m2 = load %p, !invariant.load</div><div>store %q</div><div>m1 = load %p</div><div>if <something> {}</div><div>m = phi(m1, m2)</div><div class=""><br class=""></div><div class="">But cannot safely convert to:</div><div class=""><br class=""></div></div><div><div>m = load %p, !invariant.load</div><div>store %q</div><div><br class=""></div><div>I would *really* like to specify more aggressive semantics so that we can do that, but haven’t adequately proved we can do that safely. I’m don’t think the optimizer will do the unsafe thing today, unless there’s an oversight somewhere. </div><div><br class=""></div></div><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class="">
    Looking at the current implementations, it appears that TBAA's
    constant flag is more broadly implemented.  On first glance, I'm
    really tempted to just deprecate !invariant.load in place of TBAA's
    constant flag.  Thoughts?<br class=""></div></div></blockquote><div><br class=""></div><div>I don’t have a strong opinion here. I’m fine relying on TBAA being enabled to active these sort of optimizations.</div><div><br class=""></div><div>-Andy</div><br class=""><blockquote type="cite" class=""><div class=""><div bgcolor="#FFFFFF" text="#000000" class="">
    
    Philip<br class="">
    <br class="">
    <br class="">
    <br class="">
  </div>

</div></blockquote></div><br class=""></body></html>