<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <br>
    <br>
    <div class="moz-cite-prefix">On 03/24/2016 12:45 PM, Xiangyang Guo
      via llvm-dev wrote:<br>
    </div>
    <blockquote
cite="mid:CAApsxOE8rW+bZ-zLpcos+h1R_1RZaPtbCLRnJqMCAULXxPU1UA@mail.gmail.com"
      type="cite">
      <div dir="ltr">Hi, 
        <div><br>
        </div>
        <div>When I define an intrinsic function with memory write
          permission, my assumption is that we can either attach
          [IntrReadWriteArgMem] or [] to the intrinsic function. Based
          on the comment of the source code , "IntrReadWriteArgMem -
          This intrinsic reads and writes only from memory that one of
          its arguments points to, but may access an unspecified
          amount." "If no property is set, the worst case is assumed (it
          may read and write any memory it can get access to and it may
          have other side effects)". </div>
        <div><br>
        </div>
        <div>But when I define the intrinsic function with different
          attributes, there is no difference when I dump the IR. For
          example, two intrinsic functions are </div>
        <div><br>
        </div>
        <div>
          <div>def int_foo5 : Intrinsic<[], [llvm_ptr_ty],
            [IntrReadWriteArgMem]>;</div>
          <div>def int_foo6 : Intrinsic<[], [llvm_ptr_ty], []>;</div>
        </div>
        <div><br>
        </div>
        <div>Then I write a very simple module, in each module the
          intrinsic function is called twice as shown below:</div>
        <div><br>
        </div>
        <div>/******the intrinsic function foo5 is used******/</div>
        <div>
          <div>; Function Attrs: nounwind</div>
          <div>define void @_Z3fooPi(i8* %a) #0 {</div>
          <div>  call void @llvm.foo5(i8* %a)</div>
          <div>  call void @llvm.foo5(i8* %a)</div>
          <div>  ret void</div>
          <div>}</div>
          <div>; Function Attrs: nounwind</div>
          <div>declare void @llvm.foo5(i8*) #0</div>
          <div>attributes #0 = { nounwind }</div>
        </div>
      </div>
    </blockquote>
    This is strange.  I would expect this to introduce the argmemonly
    attribute.  Can you confirm that you're on tip-of-tree and not some
    previous LLVM release version?<br>
    <blockquote
cite="mid:CAApsxOE8rW+bZ-zLpcos+h1R_1RZaPtbCLRnJqMCAULXxPU1UA@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div><br>
        </div>
        <div><br>
        </div>
        <div>/****** the intrinsic function foo6 is used******/</div>
        <div>
          <div>; Function Attrs: nounwind</div>
          <div>define void @_Z3fooPi(i8* %a) #0 {</div>
          <div>  call void @llvm.foo6(i8* %a)</div>
          <div>  call void @llvm.foo6(i8* %a)</div>
          <div>  ret void</div>
          <div>}</div>
          <div>; Function Attrs: nounwind</div>
          <div>declare void @llvm.foo6(i8*) #0</div>
          <div>attributes #0 = { nounwind }</div>
        </div>
        <div><br>
        </div>
        <div>And my when I apply -O3 optimization level for these two
          bitcode, I hope the second call can be eliminated. But from
          the result, it doesn't. </div>
      </div>
    </blockquote>
    Removing the previous call would be an incorrect optimization. 
    Specifically, the intrinsic "foo5" could be an increment of the
    passed memory location.  Removing one of the two increments would be
    incorrect.<br>
    <br>
    I suspect you actually know something stronger about the intrinsic. 
    Is it possible readonly?  Or write only?  Or idempotent?  Or
    something else?<br>
    <blockquote
cite="mid:CAApsxOE8rW+bZ-zLpcos+h1R_1RZaPtbCLRnJqMCAULXxPU1UA@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div>For intrinsic functio foo5, I don't understand it. I mean,
          when I apply [IntrReadWriteArgMem] to this intrinsic function,
          I hope the LLVM can know the second one is redundant because
          nothing is changed. Can you tell why LLVM cannot optimize it
          in this case?</div>
        <div><br>
        </div>
        <div>Any input is appreciable.</div>
        <div><br>
        </div>
        <div>Regards,</div>
        <div><br>
        </div>
        <div>Xiangyang</div>
        <div><br>
        </div>
        <div><br>
        </div>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
    </blockquote>
    <br>
  </body>
</html>