<div dir="ltr">Interesting.<div><br></div><div>gcc does tail recursion elimination on it.</div><div><br></div><div>Clang does if you rewrite it like this:</div><div><br></div><div>int A[10000];</div><div><br></div><div>int MulRedRec(int N) {</div><div>    if (N < 0)</div><div>        return 1;</div><div>    return  A[N] * MulRedRec(N - 1);</div><div>}</div><div><br></div><div>That's more or less what gcc does by itself.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jun 2, 2018 at 8:32 PM, Alex Susu via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">  Hello.<br>
    Could you please tell me why is not LLVM performing tail recursion elimination on the following function:<br>
      int A[10000];<br>
<br>
      int MulRedRec(int N) {<br>
          if (N == 0)<br>
              return A[0];<br>
          return A[N] * MulRedRec(N - 1);<br>
      }<br>
<br>
    I ask also because, for example, for the following function LLVM is able to eliminate tail recursion:<br>
      int FactRec(int N) {<br>
          if (N == 0)<br>
              return 1;<br>
          return N * FactRec(N - 1);<br>
      }<br>
<br>
    Looking on the debug information printed by opt I was able to find some differences in behavior when opt runs on each of the functions above - I can detail more on these differences.<br>
<br>
  Thank you very much,<br>
    Alex<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br></div>