<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Mar 17, 2015 at 9:44 PM, Dennis Luehring <span dir="ltr"><<a href="mailto:dl.soluz@gmx.net" target="_blank">dl.soluz@gmx.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">tested with <a href="http://gcc.godbolt.org/" target="_blank">http://gcc.godbolt.org/</a> x86 clang 3.7 (experimental)<br>
<br>
this silly throw/catch construct isn't optmized down to return 1<br>
<br>
isn't there any exception-flow analysis in clang/llvm (even detecting this stupid case)<br>
or is there a C++ standard limitation that forbits such optimizations - or does it overall<br>
not make sense trying to optimize try/catch-flow in any way<br>
<br>
int main()<br>
{<br>
  try<br>
  {<br>
    throw 1;<br>
  }<br>
  catch(int e)<br>
  {<br>
    return e;<br>
  }<br>
  return 0;<br>
}<br></blockquote><div><br></div><div>We could actually optimize this example in LLVM if we wanted to, but this we cannot:</div><div><br></div><div>void g();</div><div>void f() {</div><div>  try {</div><div>    throw 42;<br>  } catch (int e) {</div><div>    g();<br>  }<br>}</div><div><br></div><div>g's definition can rethrow, without ever having seen 'e':</div><div>void g() { throw; }</div><div><br></div><div>C++ requires EH schemes to maintain thread-local state, and it's pretty opaque to LLVM. Optimizing it would require whole-program knowledge.</div><div><br></div><div>Even noexcept annotations won't help:</div><div>void g() noexcept {</div><div>  try {</div><div>    throw;<br>  } catch (int e) {</div><div>    // Now I have a copy of the exception object.<br>  }<br>}</div></div></div></div>