<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62961>62961</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Invalid WASM produced for a certain combination of flow and exception handling
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
SingleAccretion
</td>
</tr>
</table>
<pre>
Reproduction (`.ll`-only, the original case is from a custom IR-producing compiler):
```llvm
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
target triple = "wasm32-unknown-emscripten"
declare i32 @__gxx_wasm_personality_v0(...)
declare void @llvm.wasm.rethrow()
declare ptr @llvm.wasm.get.exception(token)
declare i32 @GetReturnCode(i32)
declare void @RhpFallbackFailFast()
define i32 @Test(ptr %0) #2 personality ptr @__gxx_wasm_personality_v0 {
BB00:
%1 = alloca i32, align 4
store i32 0, ptr %1, align 4
%2 = alloca ptr, align 4
store ptr null, ptr %2, align 4
%3 = freeze i32 undef
%4 = alloca i32, align 4
store i32 %3, ptr %4, align 4
%5 = alloca ptr, align 4
store ptr null, ptr %5, align 4
%6 = freeze i32 undef
%7 = alloca i32, align 4
store i32 %6, ptr %7, align 4
%8 = alloca ptr, align 4
store ptr null, ptr %8, align 4
%9 = alloca ptr, align 4
store ptr null, ptr %9, align 4
%10 = alloca ptr, align 4
store ptr %0, ptr %10, align 4
%11 = alloca { { ptr, i32 }, ptr }, align 8
br label %BB01
BB01: ; preds = %BB00
store i32 0, ptr %0, align 4
%12 = getelementptr i8, ptr %0, i32 4
store ptr null, ptr %12, align 4
%13 = getelementptr i8, ptr %0, i32 12
store ptr null, ptr %13, align 4
%14 = getelementptr i8, ptr %0, i32 20
store ptr null, ptr %14, align 4
%15 = getelementptr i8, ptr %0, i32 24
store ptr null, ptr %15, align 4
br label %BB02
BB02: ; preds = %BB01
br label %BB03
BB03: ; preds = %BB02
br label %BB04
BB04: ; preds = %BB03
%16 = getelementptr i8, ptr %0, i32 28
%17 = invoke i32 @GetReturnCode(i32 1)
to label %18 unwind label %BT00
18: ; preds = %BB04
%19 = getelementptr i8, ptr %0, i32 8
store i32 %17, ptr %19, align 4
%20 = getelementptr i8, ptr %0, i32 8
%21 = load i32, ptr %20, align 4
store i32 %21, ptr %0, align 4
br label %BB08
BB08: ; preds = %25, %18
%22 = load i32, ptr %0, align 4
ret i32 %22
BB06: ; preds = %BBDS
%23 = getelementptr i8, ptr %0, i32 28
%24 = invoke i32 @GetReturnCode(i32 2)
to label %25 unwind label %BT01
25: ; preds = %BB06
%26 = getelementptr i8, ptr %0, i32 16
store i32 %24, ptr %26, align 4
%27 = getelementptr i8, ptr %0, i32 16
%28 = load i32, ptr %27, align 4
store i32 %28, ptr %0, align 4
br label %BB08
BT01: ; preds = %49, %40, %BT00, %BB06
%29 = catchswitch within none [label %30] unwind to caller
30: ; preds = %BT01
%31 = catchpad within %29 [ptr null]
%32 = call ptr @llvm.wasm.get.exception(token %31)
store ptr %32, ptr %11, align 4
%33 = getelementptr i8, ptr %11, i32 8
store ptr null, ptr %33, align 4
%34 = getelementptr i8, ptr %0, i32 28
%35 = call i32 @GetReturnCode(i32 0) [ "funclet"(token %31) ]
%36 = icmp eq i32 %35, 0
br i1 %36, label %38, label %37
37: ; preds = %30
catchret from %31 to label %BBDS
38: ; preds = %30
call void @llvm.wasm.rethrow() [ "funclet"(token %31) ]
unreachable
BT00: ; preds = %BB04
%39 = catchswitch within none [label %40] unwind label %BT01
40: ; preds = %BT00
%41 = catchpad within %39 [ptr null]
%42 = call ptr @llvm.wasm.get.exception(token %41)
store ptr %42, ptr %11, align 4
%43 = getelementptr i8, ptr %11, i32 8
store ptr null, ptr %43, align 4
%44 = getelementptr i8, ptr %0, i32 28
%45 = invoke i32 @GetReturnCode(i32 0) [ "funclet"(token %41) ]
to label %46 unwind label %BT01
46: ; preds = %40
%47 = icmp eq i32 %45, 0
br i1 %47, label %49, label %48
48: ; preds = %46
catchret from %41 to label %BBDS
49: ; preds = %46
invoke void @llvm.wasm.rethrow() [ "funclet"(token %41) ]
to label %50 unwind label %BT01
50: ; preds = %49
unreachable
BBDS: ; preds = %48, %37
%51 = phi i32 [ %35, %37 ], [ %45, %48 ]
switch i32 %51, label %BBFF [
i32 1, label %BB06
]
BBFF: ; preds = %BBDS
call void @RhpFallbackFailFast()
unreachable
}
attributes #2 = { noinline optnone "target-features"="+exception-handling,+mutable-globals,+sign-ext" }
```
```
llvm-as repro.ll
emcc -c -fwasm-exceptions -g3 repro.bc -o repro.o
wasm-validate --enable-exceptions repro.o
```
Expected behavior: WASM validates.
Actual behavior:
```
repro.o:00001e0: error: type mismatch in br_table, expected [i32] but got []
repro.o:00001e0: error: br_table labels have inconsistent types: expected [i32], got []
repro.o:00001e0: error: br_table labels have inconsistent types: expected [i32], got []
```
Commit on which this was reproduced is 8b587113b746f31b63fd6473083df78cef30a72e.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWU2P4jzW_TVmYwUltvPBggUUL6-exWy6S5plySSGeNqxM45TVM2vH9lOIKGSBp4uaVA3RYJ97ofPPdcOtGn4STK2BvEWxLsFbU2p9PonlyfBNnmumeFKLg6q-Fz_YLVWRZvbOxCgDCThUgiQhIGS4hOgF2hKBpXmJy6pgDltGOQNPGpVQQrztjGqgn_9CDwKlyeYq6rmgmmAVgBvQLgD4QYkof8nxHvlbxmqT8zAghoq6KdqDQR4BwFCLKgA3rCgBniDkXsLeEIA3iQkkO5OQoKfEcoAQiMso3ktWI9zpk2FUdDKX1KdZcCqJte8Nkxepvn3guWCagY5RhCQ8O3t9PHxZie_1Uw3SlLBzefbewhQtlwubVSjae-KF3aejWxppy01M6VWZ5vM28G10eOxJ2aW7CNntc0_QJlRv6yDq0nX_p-ZH8y0Wr6oggGUcYxm3flR1nsqxIHmv_aUiz1tzNChftKRywv8K3NjnI8oDgFaQYAwgoM09AHMJgmCdOuxt9swvKw_tIiRWxkqhMopdL6_QCr4SULSjWqM6qIN7ZedJ9HXgfY2GsLVRk-M8ngWRrZCDCAnbNvb2EEeNWP_8W60smDHwQByN4RBDBZwYJNM24z_IIx4GjK5F0b6ZBjJwGY6bTO7G8ZsFNk04uoPErOahozCZzB9EVxpGM6AjngN0q3734G7BKa7C4z_6EGyHuSgoaAHJizadhtGwxJ113gDn3kBvIW1ZkXTSWHsavHLwg6Dm4vNF9mJGSZYxaSxw3l2O9Gi3V-UaKbqIvywkQjdt4JnrJCHraDwvpWZao7ix608kLGpAr9hC7phC_oOtkQzxvCNMWyNTQGgGQByA0DmAPAwqcnjSc2G87zOcfmufv2uicLo0hevaTHq6niUwVaeuSwGsbz2JeXfo-zZvE9nfkSm1cNxZ5O6HaVDMs2IIgqft2KnedkTihZ9C-mb65SYjPxC0R3puWFNdsOap3P9JdPIVZZb2mFMaC6mKSc1M5eAbqswmeH17ufQ3OPCN-I1Ig_y-ro9HNEZxVN0HrUdFM8VZjJ05PHCjJIvezwXyZA3yQxB0-etuHnZLEOnNjFjx77AP8PQV9-zv6SPrDrWkbD74GSk-3iTW1_8OTV52Zy5yUt45qbkEkolGQTx9mIfhyDe9UtqFMypsOevgUc4nF7O16vSW5zoarKmRW-vcybeXjpUvBvOQt0sIR4833hbA80d7blGKxXNbP7x3dLxMye0caLP4pk9A35izzAsUBxfU_Kb8vRHrHhrT6vHVuaCGXs2vc0SvMm3LzqeVzVk_76cNJyghQN68siPtvevVMnGl-mIJekkS_AF1THDyp47_nvGDIXlqm8d4Hc0xaF5Ie6dt5_LZys1o3lJD4LdFHD4HduoEZcer2cyrOdZiSZPuzjl5Ov1ZGAtzyoA_o0CkL-lAGRWAcg9BbBjvlUAyIwAkL8pACR-sEPflwByKwH9a1h4JLlPl-Qb6EJGZEmnhIjMCBFJR8rjW-H1ctRAyXfoBklmZYv8XrbIarp7XwC7df0jKXpoXePw7rrG3yED5FKIc4poUzSZlKzbvvStxD_U8jpSl9zTwiWi61FurAvcXvhvSP8NyYYp6XSyY5Z_EDhYtf3ezr_mrzvKjcYM9lQ9bh_Rfn93kz7qOHceqU7lLh2ZpMZofmgNa_yDVWcw3UKpuBRcMqhq45sBQv6RdnBk1LSaNZY8eOcotL2oaVBSWQguTwC9ALStWmNNByehDlQ0_mbDTzJgH5Z98OpO_zh-8tLSOaAN1KzWaimEv8uqPIdBDoOjZXpwcaKBwQl3Yw85DFT3WflpbvA7FbyghsEgYNL5OJg-Gn7jyv991Cw3rIAHVtJ3rrRdsX9ufv4D9pDN0o_c5KalYjhuErA3hjdhGIYRc8XDtPbI5rNmsOJNRR3tJDzoN5dTSyrW-wLirT1OxDt4aA08KQP97yyPWOgBPUUbWNJ3BrnMlWx4Y5g0zofGzfliz3rxPzZ3k84XVVXcQCXhueR5CU3JG3juuVO0OSsgb2B2iLM0ivAhJckRR4cEH4uEpDjMcHFMs5wdcUhTxJaLYo2LFV7RBVtHSRZHJIyzZFGuURytVjEKM4qigmGKUBYe82JFUIgIxtGCr1GIcBijBCGcoHhJ4ygiSUGShFCcRQyQkFWUi6VTa6VPC940LVsnaJVEC58f94MZQpKdofvS1lu8W-i1K4lDe2qs2vPGNFcUw41g67-kI6Tn5iX0o9KQwpxpQ7mEuaoOXFL3S5s6wqNQZ0hlAS-1APt6XrRarEtjarsyAO0B2p-4KdvDMlcVQHv3K5r_E9Ra_YvlBqC9c7kBaO9C-m8AAAD__4gVhzg">