<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></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 Jan 4, 2016, at 9:55 AM, Amaury SECHET via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">2016-01-04 18:21 GMT+01:00 Philip Reames <span dir="ltr" class=""><<a href="mailto:listmail@philipreames.com" target="_blank" class="">listmail@philipreames.com</a>></span>:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF" class=""><span class="">
    <div class="">On 01/04/2016 07:32 AM, Amaury SECHET
      wrote:<br class="">
    </div>
    <blockquote type="cite" class="">
      <div dir="ltr" class="">
        <div class="">
          <div class="">After a bit more investigation, it turns out that because
            %0 is stored into %1 (after bitcast) and so %3 may have
            access to it and clobber it.<br class="">
          </div>
        </div>
      </div>
    </blockquote></span>
    Can you give a bit more context?  I'm not sure which of the examples
    you're talking about.<br class=""><br class=""></div></blockquote><div class=""><br class=""></div><div class="">Sure. Let's look at <a href="http://pastebin.com/K0J9yGq1" class="">http://pastebin.com/K0J9yGq1</a><br class=""><br class=""></div><div class="">Because of the store line 7, it is assumed that the call line 8 may see %0 and even modify the memory it points to. As a result, it is assumed that the load line 11 may not be eliminated.<br class=""><br class=""></div><div class="">Which seems actually correct in the general case.<br class=""><br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF" class=""><span class=""><br class="">
    <blockquote type="cite" class="">
      <div dir="ltr" class="">
        <div class="">
          <div class=""><br class="">
          </div>
          After a bit of thought, it is correct in the general case, but
          definitively something stricter is needed here. Looking at <tt class=""><span class="">inaccessiblememonly</span></tt> I'm
          not sure this is what is needed. What if the memory allocator
          is defined is the current module ?<br class="">
        </div>
      </div>
    </blockquote></span>
    At the moment, inaccessiblememonly would require separate
    compilation of the allocation function.  <br class=""><span class="">
    <blockquote type="cite" class="">
      <div dir="ltr" class="">
        <div class=""><br class="">
        </div>
        This leads me to conclude this is way more linked to the memory
        allocation pass than I expected it to be in the first place. Can
        I ask what you plan to use <tt class=""><span class="">inaccessiblememonly</span></tt>
        for ? Should the semantic be refined to fit the bill better ?<br class="">
      </div>
    </blockquote></span>
    Well, I didn't introduce the attribute, so I can't speak for the
    original intent.  For me, I plan on applying it to some of our out
    of line allocation functions and other helper routines which modify
    runtime state, but not java visible state.  <br class="">
    <br class="">
    If you have specific suggestions for how to refine the semantics,
    please make them.  Getting the details right is always the hard
    part.  :)<br class="">
    <br class="">
    You might also consider using a variant of your allocation function
    which takes a pointer to the global state it needs to modify.  Doing
    this would allow you to use argmemonly to restrict the aliasing
    while still allowing whole program optimization.  I haven't tried
    this in practice, but it seems like it would probably work...<span class=""><br class=""></span></div></blockquote><div class=""><br class=""></div><div class="">I do not wish to make suggestion before I understand where this is coming from. So far, from what I've collected, use cases are:<br class=""></div><div class=""> - Memory allocation<br class=""></div><div class=""> - Runtime isolation for managed languages.<br class=""></div><div class=""><br class=""></div><div class="">I have some more though to put into this, but to boot, would that be possible to only use this attribute on method that are declared, but not defined and remove it when merging modules ? It doesn't look like it is necessary to have it when the function may be exposed depending on the way the software is built.<br class=""></div></div></div></div></div></blockquote><div><br class=""></div></div>We can imagine a function defined in the current module, that does not modify any global, but calls malloc. Could it be inferred the argmemonly?<div class=""><br class=""></div><div class="">— </div><div class="">Mehdi</div><div class=""><br class=""></div></body></html>