<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 09/08/2014 04:22 PM, Dan Gohman
      wrote:<br>
    </div>
    <blockquote
cite="mid:CAF4K+2iAZqn6Vh=Dg2z_-NgY03cN5D9Th4NDL=1_1eEpCnYwZg@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div>An object can be allocated at virtual address 5 through
          extra-VM means (eg. mmap), and then one can (creatively)
          interpret the return value of @f as being associated with
          whatever %A was associated with *and* 5. The return value of
          @g can only be associated with exactly the same set that %A
          was associated with. Consequently, it's not always safe to
          replace @f with @g.<br>
        </div>
      </div>
    </blockquote>
    Dan, I'm trying to follow your logic here and am not arriving at the
    same conclusion.  Can you point out the flaw in my reasoning here?<br>
    <br>
    define i8* @f(i8* %A) {  <br>
    %pti = ptrtoint i8* %A to i64  <-- %pti is not a pointer and is
    thus not based on anything<br>
    %add = add i64 %pti, 5  <-- %add is not a pointer and is thus not
    based on anything, it is "associated with" the memory pointed to by
    %A<br>
    --- In particular, "5" is NOT a "an integer constant ... returned
    from
    a function not defined within LLVM".  It is not returned by a
    function.  As a result the pointer value of 5 is not associated with
    any address range.   <br>
    %itp = inttoptr i64 %add to i8*  %itp is based on %pti only<br>
    ret i8* %itp}<br>
    <br>
    I'm guessing the key difference in our reasoning is about the
    constant 5.  :)  I'm also guessing that you have an example in mind
    which motivates the need for 5 to be considered associated with the
    address range.  Could you expand on why?<br>
    <br>
    <br>
    <blockquote
cite="mid:CAF4K+2iAZqn6Vh=Dg2z_-NgY03cN5D9Th4NDL=1_1eEpCnYwZg@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div><br>
          It looks a little silly to say this in the case of the integer
          constant 5, and there are some semantic gray areas around
          extra-VM allocation, but the same thing happens if the add
          were adding a dynamic integer value, and then it's difficult
          to find a way to separate that case from the constant 5 case.</div>
        <div><br>
        </div>
        <div>In any case, the general advice is that people should
          prefer to use getelementptr to begin with. LLVM's own
          optimizers were converted to use getelementptr instead of
          ptrtoint+add+inttoptr even when they have to do raw byte
          arithmetic.<br>
        </div>
      </div>
    </blockquote>
    It would be nice to be able to canoncalize ptrtoint+add+inttoptr to
    geps.  Having seemingly reasonable-looking legal IR that simply
    doesn't optimize is not the best introduction for new frontend
    authors.  :) <br>
    <blockquote
cite="mid:CAF4K+2iAZqn6Vh=Dg2z_-NgY03cN5D9Th4NDL=1_1eEpCnYwZg@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div><br>
        </div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Sat, Aug 30, 2014 at 6:01 PM, David
          Majnemer <span dir="ltr"><<a moz-do-not-send="true"
              href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@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">Consider the two functions bellow:
              <div><br>
                define i8* @f(i8* %A) {  %pti = ptrtoint i8* %A to i64 
                %add = add i64 %pti, 5  %itp = inttoptr i64 %add to i8* 
                ret i8* %itp}<br>
                define i8* @g(i8* %A) {<br>
                  %gep = getelementptr i8* %A, i64 5  ret i8* %gep}<br>
                What, if anything, prevents us from canonicalizing @f to
                @g?I've heard that this might be in violation of <a
                  moz-do-not-send="true"
                  href="http://llvm.org/docs/LangRef.html#pointeraliasing"
                  target="_blank">http://llvm.org/docs/LangRef.html#pointeraliasing</a>
                but I don't see how.</div>
            </div>
          </blockquote>
        </div>
        <br>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a class="moz-txt-link-freetext" href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a>
<a class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>