<div dir="ltr"><div dir="ltr"><br></div><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 28, 2020 at 11:32 AM Gábor Horváth <<a href="mailto:xazax@google.com" target="_blank">xazax@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>I looked into this and printing the list of functions omitted from the combined module is pretty straightforward. My only problem is that I am not sure what is the most idiomatic way to surface this information for the user. I initially wanted to add an optimization remark, but optimization remarks are set up later on in the LTO backend (just before running opt).</div><div><br></div><div>Do you think it is ok to set the remarks up earlier or should I plumb the list of removed symbols and emit them later? Or is there another way to surface this information?</div></div></blockquote><div><br></div><div>+Peter for thoughts.<br></div><div>That's a good question. A few possibilities come to mind. You could add a custom internal option to LTO.cpp to emit the list of dead functions.  If you do want to use the opt remarks infrastructure, which isn't a bad idea, you will need to add the setup earlier as you noted. However, note that this is only possible for regular LTO, not any ThinLTO modules, since we don't have those until later. What I would suggest in this case is to move the invocation of linkRegularLTO for modules with summaries into runRegularLTO and do the setup there, to minimize the handling along both LTO type paths. It looks like this should be doable. </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><br></div><div>Thanks,</div><div>Gabor</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jan 27, 2020 at 6:26 PM Gábor Horváth <<a href="mailto:xazax@google.com" target="_blank">xazax@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">Thanks! </div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jan 27, 2020 at 6:05 PM Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank">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">By default even regular LTO now has module summaries (like the kind used for ThinLTO). LTO will then run index based dead symbol analysis here:<div><a href="http://llvm-cs.pcc.me.uk/lib/LTO/LTO.cpp#923" target="_blank">http://llvm-cs.pcc.me.uk/lib/LTO/LTO.cpp#923</a>. Then when linkRegularLTO is called here: <a href="http://llvm-cs.pcc.me.uk/lib/LTO/LTO.cpp#935" target="_blank">http://llvm-cs.pcc.me.uk/lib/LTO/LTO.cpp#935</a>, it indicates that the index should be consulted for liveness, and that routine skips even adding the dead symbols to the Keep set. So they never make it into the combined module.<br></div><div><br></div><div>Teresa</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jan 27, 2020 at 5:43 PM Gábor Horváth via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">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 dir="ltr">Hi!<div><br></div><div>LLVM newbie here, I was mainly working on the frontend so far. We had a small hackathon project idea to piggyback on LTO to detect dead code (unused functions). The basic idea is to compile the code for every target and dump the removed functions. Intersect the function symbol names for each target and those functions should be safe to remove from the source code (unless there were some configuration that was not compiled). Is this reasonable?</div><div><br></div><div>I started to play around with some toy examples and got stuck on the very beginning not being able to figure out where the unused functions are actually getting removed.<br><br>Here is what I did:<br>tu1.cpp:<br><font face="monospace">int unused(int a);<br>int probably_inlined(int a);<br>int main(int argc, const char *argv[]) {<br>  return probably_inlined(argc);<br>}</font><br><br>tu2.cpp:<br><font face="monospace">int unused(int a) {<br>  return a + 1;<br>}<br>int probably_inlined(int a) {<br>  return a + 2;<br>}</font><br></div><div><br>I produced two object files with bitcode:<br><font face="monospace">clang -c -flto tu1.cpp -o tu1.o</font><br></div><div><br></div><div>And I run LTO and attempted to dump the IR before each pass:<br><font face="monospace">clang -O2 -Wl,-mllvm -Wl,-print-before-all tu1.o tu2.o -o optimized</font><br></div><div><br>In my dumps I saw the function <font face="monospace">unused</font> removed even before the first pass. Where did that happen? I tried to invoke <font face="monospace">llvm-link</font> manually and that did not remove <font face="monospace">unused</font>.</div><div><br></div><div>I also tried to dump optimization remarks and was no trace of a function being removed (I only saw a function being inlined).<br><br>Thanks in advance,<br>Gabor</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"><div><br></div>-- <br><div dir="ltr"><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>
</blockquote></div></div>
</blockquote></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr"><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>