<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Thu, Jul 14, 2016 at 4:48 PM Sanjoy Das via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<br>
<br>
It looks like the key controversial point is the bit about the extra<br>
control dependence on loads and stores[0].  Generally the consensus is<br>
that (please chime if you think otherwise) it is not reasonable to<br>
make the safety (or semantics) of a load instruction depend on the<br>
type it is loading.  Introducing such a thing would involve changing<br>
the IR semantics in a fundamental way, and therefore has a high bar<br>
for acceptance.<br>
<br>
Here is a summary of the alternative solutions that were proposed here<br>
and on IRC (thanks Chandler, Andy, Eli!):<br></blockquote><div><br></div><div>Thanks for writing up the summary, sorry I didn't summarize #2 for you as I had promised. ;]</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">  2. Introduce a flag on load and stores that either<br>
       a. Denotes a "gc_safety" control dependence.<br>
       b. Denotes a "blackbox_safety" control dependence.  In this case<br>
          we will probably have some optional metadata on loads and<br>
          stores to indicate that the control dependence is actually on<br>
          GC safety.<br></blockquote><div><br></div><div>Suggested name for 2b: "unsafe" or "predicated". Essentially, that the load is not generally safe to do even if the *memory* is generally safe to load from because of some external effect.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
     As a starting point, LLVM will conservatively not speculate such<br>
     loads and stores; and will leave open the potential to upstream<br>
     logic that will have a more precise sense of when these loads and<br>
     stores are safe to speculate.<br>
<br>
  3. Introduce a general way to denote control dependence on loads and<br>
     stores.  This can be helpful to LLVM in general, and will let us<br>
     basically implement a more precise version of (2).<br></blockquote><div><br></div><div>I actually think there is a pretty clean incremental path from 2a to 3 here. We can start with just the basic "there is something control dependent about this" and use metadata to experiment with communicating it to the optimizer. If we come up with something really general and precise, we can fold it into the blanket thing, but until then we don't scope creep or put something into the IR.</div><div><br></div><div><br></div><div>One thing you didn't mention is that this requires a matching function attribute too so that we can distinguish between a call site that reads memory and a call site that reads memory in a way that is potentially unsafe.</div></div></div>