<div dir="auto">I think here, I would fix ipsccp.<div dir="auto"><br></div><div dir="auto">It transform an access of a function argument based on that argument into an access of a function argument not based on that argument.</div><div dir="auto"><br></div><div dir="auto">While one could argue it is still argmemonly (the documentation is ambiguous on that) it makes it significantly harder to trace that correlation for deadargelim or any form of alias analysis.</div><div dir="auto"><br></div><div dir="auto">In general I wonder if we would not benefit from an attribute that list the globals that a function may access, and having argmemonly include those globals in what it consider "arg".</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 14, 2020, 09:29 Fangqing Du 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"><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" target="_blank" rel="noreferrer">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" target="_blank" rel="noreferrer">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" rel="noreferrer">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" rel="noreferrer">llvm-dev@lists.llvm.org</a>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank" rel="noreferrer">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>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" rel="noreferrer">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>