<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">