<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 21, 2016 at 1:45 AM, Matthias Braun <span dir="ltr"><<a href="mailto:matze@braunis.de" target="_blank">matze@braunis.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
> On Jun 20, 2016, at 12:53 PM, Sanjoy Das via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br>
><br>
> Hi Vivek,<br>
><br>
> vivek pandya via llvm-dev wrote:<br>
> >     int foo() {<br>
> >     return 12;<br>
> >     }<br>
> ><br>
> >     int bar(int a) {<br>
> >     return foo() + a;<br>
> >     }<br>
> ><br>
> >     int (*fp)() = 0;<br>
> >     int (*fp1)(int) = 0;<br>
> ><br>
> >     int main() {<br>
> >     fp = foo;<br>
> >     fp();<br>
> >     fp1 = bar;<br>
> >     fp1(15);<br>
> >     return 0;<br>
> >     }<br>
><br>
> IMO it is waste of time trying to do a better job at the IPRA level on<br>
> IR like the above ^.  LLVM should be folding the indirect calls to<br>
> direct calls at the IR level, and if it isn't that's a bug in the IR<br>
> level optimizer.<br>
</span>+1 from me.<br>
<br></blockquote><div>Yes at -O3 level simple indirect calls including virtual functions are getting optimized to direct call.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The interesting cases are the non-obvious ones (assumeing foo/bar have the same parameters). Things gets interesting once you have uncertainty in the mix. The minimally interesting case would look like this:<br>
<br>
int main() {<br>
    int (*fp)();<br>
    if (rand()) {<br>
        fp = foo;<br>
    } else {<br>
        fp = bar;<br>
    }<br>
    fp(42);<br>
}<br></blockquote><div> </div><div>I tried this case and my simple hack fails to optimize it :-) . This requires discussion on IRC.</div><div><br></div><div>Sincerely,</div><div>-Vivek</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
However predicting the possible targets of a call is IMO a question of computing a call graph datastructure and improving upon that. We should be sure that we discuss and implement this independently of the register allocation work!<br>
<span class="HOEnZb"><font color="#888888"><br>
- Matthias<br>
<br>
</font></span></blockquote></div><br></div></div>