<div dir="ltr">Looks like the type information for the indirect callsite in 'test' needs to be updated after inline transformations so that devirtualization can kick in.  This sounds like a bug (I remember similar situation was discussed before somewhere).<div><br></div><div>David</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, May 6, 2019 at 4:05 PM Teresa Johnson <<a href="mailto:tejohnson@google.com">tejohnson@google.com</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 dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi Kamlesh,<div><br></div><div>Cc'ing llvm-dev as well as some specific parties interested in devirtualization in clang for thoughts. Some comments below.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr"><strong>From: </strong>kamlesh kumar <span dir="ltr"><<a href="mailto:kamleshbhalui@gmail.com" target="_blank">kamleshbhalui@gmail.com</a>></span><br><strong>Date: </strong>Mon, May 6, 2019 at 7:48 AM<br><strong>To: </strong> <<a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a>><br><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 dir="ltr"><div dir="ltr">Hi Teresa,</div><div dir="ltr">I am going through devirtualization in clang/llvm.</div><div dir="ltr">And found a testcase which suitable for devirtualzation but clang is unable to do so.<br><div>Consider below test case link of Godbolt.</div><div><a href="https://gcc.godbolt.org/z/j4uhZT" target="_blank">https://gcc.godbolt.org/z/j4uhZT</a><br></div><div><br></div><div>Even though B::value() is marked as final,</div><div>clang is unable to devirtualize it.</div><div>can you please shed some light here?</div><div>or am i missing something?</div></div></div></blockquote><div><br></div><div>In general, devirtualization in cases like this where inlining is required is pretty limited in clang.</div><div><br></div><div>Note that clang can devirtualize if you changed foo_test to define the variable (rather than take it as a parameter). E.g.:</div><div><br></div><div>void foo_test()<br></div><div>{</div><div>    B b;</div><div>    test(&b);  <- b->value() gets devirtualized after inlining test() (looks like it is devirtualized during inlining, presumably via some constant propagation after inlining test(), because we then inline B::value()).</div><div>}</div><div><br></div><div>It also works if inlining isn't required, e.g. if I manually inline test():</div><div><br></div><div><div>void foo_test2(B*b)</div><div>{</div><div>    b->value() + 11;  <--- b->value() gets devirtualized early by clang that sees the final specifier</div><div>}</div></div><div><br></div><div>So I think there is a phase ordering issue between the type of devirt supported by clang, and the inlining that happens later and exposes the opportunity in the original test case.</div><div><br></div><div>I've been focusing so far on whole program devirtualization (which Peter implemented for LTO as well as hybrid ThinLTO/LTO, but I am porting to ThinLTO only). But devirtualization opportunities exposed by inlining is one of the limitations that I'd like to figure out how to address. In this case it doesn't require whole program analysis since B::value is explicitly marked final.</div><div><br></div><div>Piotr - not sure if your -fstrict-vtable-pointers devirtualization can help at all in this case - I tried it but it didn't seem to.</div><div><br></div><div>Teresa</div><div><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 dir="ltr"><div dir="ltr"><div><br></div><div><br></div><div>Thanks</div><div>./Kamlesh</div><div><br></div></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail-m_4927788474205627754m_8806348097649170223gmail_signature"><div dir="ltr"><div><span style="font-family:Times;font-size:medium"><table cellspacing="0" cellpadding="0"><tbody><tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small"><td nowrap style="border-top:2px solid rgb(213,15,37)">Teresa Johnson |</td><td nowrap style="border-top:2px solid rgb(51,105,232)"> Software Engineer |</td><td nowrap style="border-top:2px solid rgb(0,153,57)"> <a href="mailto:tejohnson@google.com" target="_blank">tejohnson@google.com</a> |</td><td nowrap style="border-top:2px solid rgb(238,178,17)"><br></td></tr></tbody></table></span></div></div></div></div></div></div></div>
</blockquote></div>