<div dir="ltr">Yes, in fact, for each pass, at worst, even if the pass had no idea how to clean up unreachable code as it went (and again, most do, because most compiler algorithms are built with the idea that they need to clean up after themselves), your algorithm is what the entirety of "find unreachable code" looks like for gcc.<div><br></div><div>As for compile time, *we already do it* (see simplifycfg) :)<br></div><div>We just don't try to prevent things like jump threading from messing it up.</div><div><br></div><div>and again, the number of places that will mess it up are very small.</div><div><br></div><div>Most algorithms were built to track what dead code they were adding (whether LLVM implemented that part of the algorithm or not).</div><div><br>As an example, look at GVN.cpp's addDeadBlock, SCCP's code to avoid messing up the CFG (IPSCCP knows how to delete dead blocks, SCCP preserves CFG so it just doesn't mess with the terminators, etc), etc</div><div><br></div><div>The hardest pass to make stop generating unreachable code tends to be jump threading, but this is more because "nobody has written it down in a book" than "it is hard to do" :)</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 23, 2015 at 9:52 PM, Sanjoy Das <span dir="ltr"><<a href="mailto:sanjoy@playingwithpointers.com" target="_blank">sanjoy@playingwithpointers.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">> Programmers don't usually write code like this directly, but it is common<br>
> for it to happen as a result of the expansion of macros or inline functions.<br>
> You would not want to require that a compiler front end *not* produce this.<br>
<br>
</span>I meant to say that whatever mechanism we use to track dead blocks<br>
that may exhibit edge-cases of SSA def-use behavior does *not* need to<br>
be clever enough to deal with this example, since the verifier rejects<br>
this snippet (def of %m does not dominate its use).  If all we care<br>
about are blocks that have to follow def-dominates-use in the<br>
intuitive sense then a super simple succ_begin()/succ_end() based DFS<br>
is sufficient.  What I don't know is whether such a thing will be fast<br>
enough.<br>
<br>
In any case, I don't have enough experience with LLVM to have a strong<br>
/ defensible opinion on this, and I'll defer to the decision taken by<br>
people who do.<br>
<div class="HOEnZb"><div class="h5"><br>
-- Sanjoy<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</div></div></blockquote></div><br></div>