<div dir="ltr"><div>FWIW, If I add the main() to call fred() and then I do <a href="https://godbolt.org/z/WPvbed8f6">see </a>the constant being inlined as expected at O1 and above.<br></div><div></div><div>What is the optimization level you're trying at? I think code generated at O0 level for both compilers may vary significantly due to different pass configurations.<br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jul 12, 2021 at 11:30 AM Santanu Das 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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div style="overflow-wrap: break-word;" lang="EN-US">
<div class="gmail-m_-5933987461733511631WordSection1">
<p class="MsoNormal">Hello community members,<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I was experimenting to see whether LLVM is able to devirtualize calls via vtable. I have this particular example:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">========<u></u><u></u></p>
<p class="MsoNormal">class Foo {<u></u><u></u></p>
<p class="MsoNormal">public:<u></u><u></u></p>
<p class="MsoNormal">  virtual int foo() const = 0;<u></u><u></u></p>
<p class="MsoNormal">  int baz() const { return foo(); }<u></u><u></u></p>
<p class="MsoNormal">};<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">class Bar : public Foo {<u></u><u></u></p>
<p class="MsoNormal">public:<u></u><u></u></p>
<p class="MsoNormal">  int foo() const override final { return 0xdeadbeef; }<u></u><u></u></p>
<p class="MsoNormal">};<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">int fred(Bar &x) {<u></u><u></u></p>
<p class="MsoNormal">  return x.baz();<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal">========<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">As we can see, there is a call to Bar::foo(), via  Foo::baz(), which returns a constant.<u></u><u></u></p>
<p class="MsoNormal">The Bar::foo() function has final specifier, hence this implementation cannot be overridden by any child class.  In this case, the compiler should be able to call Bar::foo() directly instead of calling via vtable, and then should be able
 to inline the const value.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">When I compile with LLVM main branch, I see this piece of code being generated below. It makes a call to the function via vtable entry.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">_Z4fredR3Bar:<u></u><u></u></p>
<p class="MsoNormal">movq    (%rdi), %rax<u></u><u></u></p>
<p class="MsoNormal">jmpq    *(%rax)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">When I compile with GCC, I see that it is able to correctly identify that it should call Bar::foo() directly and successfully inlines the const value.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">_Z4fredR3Bar:<u></u><u></u></p>
<p class="MsoNormal">movq    (%rdi), %rax<u></u><u></u></p>
<p class="MsoNormal">movq    (%rax), %rax<u></u><u></u></p>
<p class="MsoNormal">cmpq    $_ZNK3Bar3fooEv, %rax<u></u><u></u></p>
<p class="MsoNormal">jne     .L5<u></u><u></u></p>
<p class="MsoNormal">movl    $-559038737, %eax<u></u><u></u></p>
<p class="MsoNormal">ret<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Should LLVM be optimizing this call, or am I missing something?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">-<u></u><u></u></p>
<p class="MsoNormal">Santanu Das<u></u><u></u></p>
</div>
</div>

_______________________________________________<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="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br clear="all"><br>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><i style="font-size:12.8px">Disclaimer: Views, concerns, thoughts, questions, ideas expressed in this mail are of my own and my employer has no take in it. </i><br></div><div>Thank You.<br>Madhur D. Amilkanthwar<br><br></div></div></div>