<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/124710>124710</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
llvm.wasm.throw is inconsistently considered non-unwinding or invocable
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
purplesyringa
</td>
</tr>
</table>
<pre>
1. Miscompiled:
```cpp
void loud();
void throw_and_catch(void *ex) {
try {
__builtin_wasm_throw(0, ex);
} catch (...) {
loud();
}
}
```
The generated IR is
```llvm
define hidden void @throw_and_catch(void*)(ptr noundef %ex) {
entry:
%ex.addr = alloca ptr, align 4
store ptr %ex, ptr %ex.addr, align 4
%0 = load ptr, ptr %ex.addr, align 4
call void @llvm.wasm.throw(i32 0, ptr %0)
ret void
}
```
without a catchpad. This is most likely a frontend bug.
https://godbolt.org/z/Po668Yxaz
2. Broken IR:
```cpp
void loud();
void my_throw(void *ex) {
__builtin_wasm_throw(0, ex);
}
void throw_and_catch(void *ex) {
try {
my_throw(ex);
} catch (...) {
loud();
}
}
```
InlinerPass replaces
```llvm
invoke void @my_throw(void*)(ptr noundef %ex)
to label %try.cont unwind label %catch.dispatch
```
(correct, working) with
```llvm
invoke void @llvm.wasm.throw(i32 0, ptr %ex)
to label %.noexc unwind label %catch.dispatch
```
(broken, `llvm.wasm.throw` cannot be invoked), which halts the backend.
https://godbolt.org/z/rMEd1x79z
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVcFu4zYQ_Rr6MoggjaVYOujgJDWQwwKLxV56MihyLLGmSYGk4jhfX5ByEtfdTYPtCoINijPD9968kbj3qjdELavuWPWw4FMYrGvHyY2a_Mkp0_NFZ-WpLTL4orywh1Fpkmy5Znm6b_P5FuPI8vWTVRK0nSTDmmHDlndzWHoeBmePW27kVvAgBoZ1esxwTc8MG2CrGA0AENzpYhWv7bablA7KbI_cH7apFMM6Z3gPKXs-Koay1QOkA4BhnWXZP0vH6xrgOStCnX9fSc3gvw8EPRlyPJCEx2-g_BV5rZ8OLF9L2ilDMCgpycBMrsx_TJvhOp6P9RgcGDsZSTtgWF1KQSa40yw1zHsZl9IBWz4A19oKDmNwUQKuVW-gTIE-WEdx47Xc_fsi5V8nMKzyVFNbLl8rfpwiuNZvBCP7LLYle22LWiLkF1XySDXmOQop7WdSH1UY7BSAzx0cuczg-6A8KA8H6wNotSd9Ag47Z00gI6Gb-mxOHkIYfZQLNww3vZWd1SGzrme4eWG4-Wpvb-s_n_nLHI4Z3Dm7JwOP337Jz4fTmw9_aORPevYsxG8YkgtA_38mPhiIR6OVIfeVew-ORs0F_WQiAJR5snt688qVZh9OwQU6gGBB84503A3ulAlrAkzmqIx830gUM6n8mLT7F3CGtbDOkQixB0fr9sr0UYvou08y-G-3fww-M5aexa9A75Jb40FneJcwbnMQ3BgboKMzZJmkvYfjoMQAA9fBQxgIOi72ZOQnp8Z9-UMWz6vmZSHbpWyWDV9QW6yWdV7WeYGLoS1EVciqrIumrlZdh1WHlSh3peRls1vRbqFazLHKC6zzVX5bYdZVoiFqcMXLcoc7YmVOB650llhZ1y-U9xO1BZarIl8kkXz6RiEaOkLaZYjxk-XamHTTTb2P3VE--PcyQQVN7ZVW8WWijLDGKx_IBH2CtJDkSIKx5mZujjI9WJfEFLzTtJicbq_kUmGYukzYA8NNcsz8dzM6-1ey2SZh9Qw3ZzJPLf4dAAD__0bEN1A">