<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/126670>126670</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`try` block prevents LLVM from identifying a throwing path is unreachable
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jeremy-rifkin
</td>
</tr>
</table>
<pre>
For the following code LLVM inlines `std::vector::at` and optimizes away the bounds check
```cpp
std::vector<int> without_try_catch() {
std::vector<int> v(10'000);
for(int i = 0; i < 10'000; ++i) {
v.at(i) = i;
}
return v;
}
```
However, for the following, the presence of a `try`/`catch` precludes LLVM from proving away the bounds check and the subsequent throwing path.
```cpp
std::vector<int> with_try_catch() {
std::vector<int> v(10'000);
for(int i = 0; i < 10'000; ++i) {
try {
v.at(i) = i;
} catch(...) {}
}
return v;
}
```
As a result this dead-code `try`/`catch` results in far worse codegen.
CE link: https://godbolt.org/z/e3sT1z4bd
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJy8lEGP6yYQxz_N-DJaCw-Jkxx8SDbP6uH1VvX6hPE45i2BFLCj7KevcLLb7mu30rsUWTIahj_w_w2oGM3JMTewPsD6WKgpjT403znw-fYUzPBiXNH5_ta0PmAaGQdvrb8ad0Lte8avX3__FY2zxnFEqEVMPcg9yP3MOvlw76sEtUDlevSXZM7mlSOqq7otgp2fXB9Rj6xfQOyhFvdPXy4g9v_QezYugfyCV5NGP6VvKdy-aZX0CLQF2iFsDiD2iIifTp2BtpUA2gghgHYg32YMPgBtjUtoEOQRBcjD0n3G93x5QKAD0MF8XC23uVQpCywj8ojmIQ2b4yMrcJqCw_k-cI-_nzj3xf4Xf-WZA9Bz3s9Hz3MwBy6BIzvN6AdU2fYUblmA2mzc4kYtcpa2U8_xTmkI_oyX4OcM71_tXxDlYJy6yH9M7BKmMdxxX1Qay58E9Bmd_xFNCrcfKP0XqUeDzRHftl2W5ZvcO8afArqPqDBwnGx200TsWfVPy-35jNw9O6JxOKiAVx8iL_ftxK68qz5_QWvcC8g9jildYvaTWqD25PvO21T6cAJqX4FalvG36nXV9UXfyH4nd6rgptrIHa1ptVsVYzP0K6UqLYeOd7WiYUtcyVoLJeS222kuTEOC1oKqSqxXlVyVTJuqq7fVsBHDlqmGleCzMra0dj7ntQsT48RNRXW9EYVVHdu4vDJEjq-4jAJRfnRCkyc9ddMpwkpYE1P8SyaZZLl5Nwo76_VLLu2ZXfp7ZZueXTLDbanuj2WLJuLkAis9qs5yMQXb_GCaSePUldqfgdq89uP3dAn-O-sE1C47jkDt40hzQ38GAAD__2jAjAQ">