<div dir="ltr">Thank you Hal and 

Stefan!<div><br></div><div>Bug report is filed: <a href="https://bugs.llvm.org/show_bug.cgi?id=46717">https://bugs.llvm.org/show_bug.cgi?id=46717</a></div><div><br></div><div>And Stefan,</div><div>I think 'attributor' is a really nice pass, and can infer more precise and useful attributes, which may give more opportunities for optimization.</div><div>But we shouldn't depend on 'attributor' to correct wrong function attributes, because we cannot run 'attributor' after every pass, right?</div><div><br></div><div>Thanks,</div><div>Fangqing</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Jul 11, 2020 at 5:12 AM Hal Finkel <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

  
  <div>
    <p>Hi, Fangqing,</p>
    <p>Yes, this seems like a bug. Can you please file a bug report at
      <a href="https://bugs.llvm.org/" target="_blank">https://bugs.llvm.org/</a> ? If you need someone else to do this on
      your behalf, please let us know.</p>
    <p> -Hal<br>
    </p>
    <div>On 7/10/20 9:04 PM, Fangqing Du via
      llvm-dev wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">Hi all,
        <div><br>
        </div>
        <div>Let's see an example (from Alexandre Isoard) first:</div>
        <div>****************************************************************************************</div>
        <div><font face="monospace" color="#666666">; RUN: opt -ipsccp
            -deadargelim -licm -O2 -S < %s<br>
            <br>
          </font>
          <div style="color:rgb(0,0,0);background-color:rgb(255,255,254)">
            <div><font face="monospace"><span style="color:rgb(0,17,136)">@g</span> = <span style="color:rgb(0,0,255)">internal</span> <span style="color:rgb(0,0,255)">global</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(9,134,88)">0</span></font></div>
            <font face="monospace"><br>
            </font>
            <div><span style="color:rgb(0,128,0)"><font face="monospace">; Function Attrs: argmemonly</font></span></div>
            <div><font face="monospace"><span style="color:rgb(0,0,255)">define</span> <span style="color:rgb(0,0,255)">internal</span> <span style="color:rgb(0,128,128)">void</span> <span style="color:rgb(0,17,136)">@foo</span>(<span style="color:rgb(0,128,128)">i32*</span> <span style="color:rgb(0,0,255)">nonnull</span> <span style="color:rgb(0,0,255)">dereferenceable</span>(<span style="color:rgb(9,134,88)">4</span>) <span style="color:rgb(0,17,136)">%arg</span>, <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">%val</span>) #<span style="color:rgb(9,134,88)">0</span> {</font></div>
            <div><span style="color:rgb(128,0,0)"><font face="monospace">entry:</font></span></div>
            <div><font face="monospace">  store <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">%val</span>, <span style="color:rgb(0,128,128)">i32*</span> <span style="color:rgb(0,17,136)">%arg</span></font></div>
            <div><font face="monospace">  ret <span style="color:rgb(0,128,128)">void</span></font></div>
            <div><font face="monospace">}</font></div>
            <font face="monospace"><br>
            </font>
            <div><font face="monospace"><span style="color:rgb(0,0,255)">define</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">@bar</span>(<span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">%n</span>) {</font></div>
            <div><span style="color:rgb(128,0,0)"><font face="monospace">entry:</font></span></div>
            <div><font face="monospace">  store <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(9,134,88)">1</span>, <span style="color:rgb(0,128,128)">i32*</span> <span style="color:rgb(0,17,136)">@g</span></font></div>
            <div><font face="monospace">  br <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(0,17,136)">%loop</span></font></div>
            <font face="monospace"><br>
            </font>
            <div><font face="monospace"><span style="color:rgb(128,0,0)">loop:</span>                                              <span style="color:rgb(0,128,0)">; preds = %bb1, %bb</span></font></div>
            <div><font face="monospace">  <span style="color:rgb(0,17,136)">%i</span> = phi <span style="color:rgb(0,128,128)">i32</span> [ <span style="color:rgb(0,17,136)">%i.inc</span>, <span style="color:rgb(0,17,136)">%loop</span> ], [ <span style="color:rgb(9,134,88)">0</span>, <span style="color:rgb(0,17,136)">%entry</span> ]</font></div>
            <div><font face="monospace">  <span style="color:rgb(0,17,136)">%g.val</span> = load <span style="color:rgb(0,128,128)">i32</span>, <span style="color:rgb(0,128,128)">i32*</span> <span style="color:rgb(0,17,136)">@g</span></font></div>
            <div><font face="monospace">  <span style="color:rgb(0,17,136)">%g.inc</span> = add nuw <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">%g.val</span>, <span style="color:rgb(9,134,88)">1</span></font></div>
            <div><font face="monospace">  <span style="color:rgb(0,0,255)">tail</span> call <span style="color:rgb(0,128,128)">void</span> <span style="color:rgb(0,17,136)">@foo</span>(<span style="color:rgb(0,128,128)">i32*</span> <span style="color:rgb(0,17,136)">@g</span>, <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">%g.inc</span>)</font></div>
            <div><font face="monospace">  <span style="color:rgb(0,17,136)">%i.inc</span> = add nuw <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">%i</span>, <span style="color:rgb(9,134,88)">1</span></font></div>
            <div><font face="monospace">  <span style="color:rgb(0,17,136)">%cond</span> = icmp eq <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">%i.inc</span>, <span style="color:rgb(0,17,136)">%n</span></font></div>
            <div><font face="monospace">  br <span style="color:rgb(0,128,128)">i1</span> <span style="color:rgb(0,17,136)">%cond</span>, <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(0,17,136)">%exit</span>, <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(0,17,136)">%loop</span></font></div>
            <font face="monospace"><br>
            </font>
            <div><font face="monospace"><span style="color:rgb(128,0,0)">exit:</span>                                              <span style="color:rgb(0,128,0)">; preds = %bb1</span></font></div>
            <div><font face="monospace">  ret <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,17,136)">%g.val</span></font></div>
            <div><font face="monospace">}</font></div>
            <font face="monospace"><br>
            </font>
            <div><font face="monospace"><span style="color:rgb(0,0,255)">declare</span> <span style="color:rgb(0,128,128)">void</span> <span style="color:rgb(0,17,136)">@llvm.assume</span>(<span style="color:rgb(0,128,128)">i1</span>)</font></div>
            <font face="monospace"><br>
            </font>
            <div><font face="monospace">attributes #<span style="color:rgb(9,134,88)">0</span> = { <span style="color:rgb(0,0,255)">argmemonly</span> }</font></div>
          </div>
        </div>
        <div>****************************************************************************************  <br>
        </div>
        <div>With opt cmd '-ipsccp -deadargelim -licm -O2',
          function @bar will return constant value 1, instead of correct
          value %n. This is crazy, right?</div>
        <div>Let's see what happens here.</div>
        <div>Due to pass 'ipsccp' replaced the argument of function
          '@foo' with global variable '@g', but keeps attr 'argmemonly'
          there, so pass 'licm' will hoist the load of '@g' before the
          loop (as the value of @g isn't changed, but it is changed),
          and will cause function return wrong constant value '1',
          instead of '%n' (the correct value) , like following:<br>
        </div>
        <div>**************************************************************************************** 
            <br>
        </div>
        <div>
          <div style="color:rgb(0,0,0);background-color:rgb(255,255,254)">
            <div><span style="color:rgb(0,128,0)"><font face="monospace">; Function Attrs: nofree norecurse nounwind writeonly</font></span></div>
            <div><font face="monospace"><span style="color:rgb(0,0,255)">define</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,128,128)">@bar</span>(<span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,128,128)">%n</span>) <span style="color:rgb(0,128,128)">local_unnamed_addr</span> <span style="color:rgb(9,134,88)">#0</span> {</font></div>
            <div><span style="color:rgb(0,128,128)"><font face="monospace">entry:</font></span></div>
            <div><font face="monospace">  <span style="color:rgb(0,0,255)">ret</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(9,134,88)">1</span></font></div>
            <div><font face="monospace">}</font></div>
            <font face="monospace"><br>
            </font>
            <div><font face="monospace"><span style="color:rgb(0,128,128)">attributes #0 =</span> { <span style="color:rgb(0,128,128)">nofree</span> <span style="color:rgb(0,128,128)">norecurse</span> <span style="color:rgb(0,128,128)">nounwind</span> <span style="color:rgb(0,128,128)">writeonly</span> }</font></div>
          </div>
        </div>
        <div>**************************************************************************************** 
            <br>
        </div>
        <div><br>
        </div>
        <div>And if remove the 'argmemonly' attribute, function @bar
          will return the correct value:</div>
        <div>
          <div>**************************************************************************************** 
              <br>
          </div>
          <div>
            <div style="color:rgb(0,0,0);background-color:rgb(255,255,254)">
              <div>
                <div><span style="color:rgb(0,128,0)"><font face="monospace">; Function Attrs: nofree norecurse nounwind</font></span></div>
                <div><font face="monospace"><span style="color:rgb(0,0,255)">define</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,128,128)">@bar</span>(<span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,128,128)">%n</span>) <span style="color:rgb(0,128,128)">local_unnamed_addr</span> <span style="color:rgb(9,134,88)">#0</span> {</font></div>
                <div><span style="color:rgb(0,128,128)"><font face="monospace">entry:</font></span></div>
                <div><font face="monospace">  <span style="color:rgb(0,0,255)">ret</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,128,128)">%n</span></font></div>
                <div><font face="monospace">}</font></div>
              </div>
            </div>
          </div>
          <div>**************************************************************************************** 
              </div>
        </div>
        <div><br>
        </div>
        <div>So if function attribute 'argmemonly' on function @foo is
          correct, then there's a bug in pass 'ipsccp'. When it replaces
          the function local value with global variable, then it shoud
          remember to remove this function attribute.</div>
        <div><br>
        </div>
        <div>Thanks,</div>
        <div>Fangqing</div>
      </div>
      <br>
      <fieldset></fieldset>
      <pre>_______________________________________________
LLVM Developers mailing list
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
    </blockquote>
    <pre cols="72">-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
  </div>

</blockquote></div>