<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/140933>140933</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            WASM crash when using __funcref
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          glingy
      </td>
    </tr>
</table>

<pre>
    I'm attempting to instantiate a `call_indirect` to a specific table, and I believe this is the correct construct, but I am getting a clang crash.

```
typedef void (*__funcref fn)(void);
extern "C" fn table[1];

void foo() { table[1](); }
```

Reproduction on Godbolt here: https://godbolt.org/z/c3nc59MWz

Backtrace:
```
fatal error: error in backend: Cannot select: 0x19f4fbc8: funcref,ch = load<(load (s0) from `ptr getelementptr inbounds ([1 x ptr addrspace(20)], ptr @table, i32 0, i32 1)`)> 0x19f16670, 0x19f4fa60, undef:i32, example.cpp:4:14
 0x19f4fa60: i32 = add nuw 0x19f4fd30, Constant:i32<1>, example.cpp:4:14
 0x19f4fd30: i32 = WebAssemblyISD::Wrapper TargetGlobalAddress:i32<ptr @table> 0, example.cpp:4:14
      0x19f4fad8: i32 = TargetGlobalAddress<ptr @table> 0, example.cpp:4:14
    0x19f4f9e8: i32 = Constant<1>
  0x19f4fb50: i32 = undef
In function: _Z3foov
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: /opt/compiler-explorer/clang-trunk/bin/clang++ -g -o /app/output.s -fno-verbose-asm -S -target wasm32 -fcolor-diagnostics -fno-crash-diagnostics <source>
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module '<source>'.
4.      Running pass 'WebAssembly Instruction Selection' on function '@_Z3foov'
 #0 0x0000000003c65448 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3c65448)
 #1 0x0000000003c6358c llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3c6358c)
 #2 0x0000000003bb4273 llvm::CrashRecoveryContext::HandleExit(int) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3bb4273)
 #3 0x0000000003c5b09e llvm::sys::Process::Exit(int, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3c5b09e)
 #4 0x0000000000dbd4fb LLVMErrorHandler(void*, char const*, bool) cc1_main.cpp:0:0
 #5 0x0000000003bbe0a3 llvm::report_fatal_error(llvm::Twine const&, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3bbe0a3)
 #6 0x000000000521c288 llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x521c288)
 #7 0x00000000052225f9 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x52225f9)
 #8 0x00000000025cf86f (anonymous namespace)::WebAssemblyDAGToDAGISel::Select(llvm::SDNode*) WebAssemblyISelDAGToDAG.cpp:0:0
 #9 0x0000000005219774 llvm::SelectionDAGISel::DoInstructionSelection() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5219774)
#10 0x0000000005228272 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x5228272)
#11 0x000000000522abea llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x522abea)
#12 0x000000000522cac6 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x522cac6)
#13 0x00000000052192f1 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x52192f1)
#14 0x000000000305c428 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#15 0x00000000035d1d92 llvm::FPPassManager::runOnFunction(llvm::Function&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x35d1d92)
#16 0x00000000035d2021 llvm::FPPassManager::runOnModule(llvm::Module&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x35d2021)
#17 0x00000000035d3989 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x35d3989)
#18 0x0000000003f170cd clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3f170cd)
#19 0x00000000045ae945 clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x45ae945)
#20 0x00000000061fe3ac clang::ParseAST(clang::Sema&, bool, bool) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x61fe3ac)
#21 0x00000000045af4fd clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x45af4fd)
#22 0x00000000048bf53a clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-trunk/bin/clang+++0x48bf53a)
#23 0x000000000483c22b clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x483c22b)
#24 0x00000000049b5293 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x49b5293)
#25 0x0000000000dbf432 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-trunk/bin/clang+++0xdbf432)
#26 0x0000000000db6d8d ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
#27 0x0000000004621c59 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#28 0x0000000003bb4173 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x3bb4173)
#29 0x0000000004621e79 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#30 0x00000000045e4c7d clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x45e4c7d)
#31 0x00000000045e5c41 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-trunk/bin/clang+++0x45e5c41)
#32 0x00000000045f041c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0x45f041c)
#33 0x0000000000dbb981 clang_main(int, char**, llvm::ToolContext const&) (/opt/compiler-explorer/clang-trunk/bin/clang+++0xdbb981)
#34 0x0000000000c3caf4 main (/opt/compiler-explorer/clang-trunk/bin/clang+++0xc3caf4)
#35 0x00007f9bad229d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#36 0x00007f9bad229e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#37 0x0000000000db6825 _start (/opt/compiler-explorer/clang-trunk/bin/clang+++0xdb6825)
clang++: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Compiler returned: 70
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzkml9v47gRwD8N80I4kCjJkh7yoDjJNofd7mKT3qJ9MShy5LArkSpJJc59-oKUbP2J989dfUWBLnI4WySHP84MZ4a0qDFiJwGuUHKNkpsL2tknpa92tZC714tS8dere0TSBlNroWmtkDtsFRbSWCqtoBYwxWgdMFrXWyG50MAsWgeuE8WmBSYqwbClZQ2IbDCVHN_jEmoBz4DtkzBYGGyfADOl3VjMlDRWd8y67mVn8T2mDd6B9XNTzGoqd5hpap4uUVC4v3Uw_AWFfW2BQ4WfleAYkQyRYrutOsk0VLiSiOSIZK7RfYquUVDA3oKWGBGyQYTgSg6wyXWIkpu-DwoKL7BSysvMMUqv5_38YxRdY5TeLJhQUHyGViveMSuUxErid4qXqrb4CTSgqMBP1rYGRQUid4jc7frWS6V3iNz9hsgdiyRL8g9ffuvFXVP21WrK3NjFZBW1tMagtdJOsP-AhcQlZV9BcvdsQ6VUFhuona2iAgf7MK_iqmSZ-zZoC5ENe8IousG1ohxFG0Qy98lp1QROB5VWjbN9a7WzD9TQgLTum5Cl6iQ33gLJdYj32D2mnGvTOmySESfCK27j21AcHJ1ERAQHhw-h67f2vaPbHjVcr1PfPoDTtf_WSQ4VigoREfcV9rRpa7hkbYuiIkZREcYoKKaDosJP4RZJOceyezm08siL3Kje0Qep0SZE0e1PCHfDJ8K_QFkYA01Zv94_3DijRcUXTdsWNH6kegf2Xa1KWhecazDmONtMMW7135va_zssjmfT-U_O8bulD7JzmMkeVdQrx_U9OFQy00Jvn6C4l97H3F5wzdt_RJVSzygoPr2_LR5usenKRlhMcdntsIZWaevCyWKPCPvUlZdMNYjc1fXz4X-rVqt_Or8md8KYDgwidz7qCMnqjkMfa1z08Fui30XOB7XbogyMAY6N6jQ7xitqjGIu1HGsO4kN06K1LvY8WMq-Yt41bb8Pg0sU5J-02mnaYKp3ndsPDhkjcqdax8RU04oa9Ar2ba00aPfMRbSV1Z38ishdKeThGSLXiFzj1Q6vlBNB29YJ6mzb2UuDV5VUq2fQpTKwoqbBqwe8st7U-IWaJiJ4VTFVK73igu6kMlawYZjXwOwxijbDsr0RQ7cWFG1AVc43WqoNaEwtBsmxqnAlakBBQVy3jeKAdyBBU2_UoIjc48-dlC5mt9S4SJDeDUbHn9yDD1TSnVt_6gJio3hXg-s14yCp03N8StpkT-H7IWU44Q8-rDmMXvLB1bzsODh4G0mdpyISBTjYB4d_EVsncZxh71B-m5pX03_4pIW03uKPvc9kYydNX7bKWA20QWTtI5e0Pk24tPDHTY_IdbAfmFwA7InDBXGUZOwU8aYGKrv2o3wQO0lrRLJO-mzPca3cFGfjcwQjH5nxlWVM0mjCt3Gu9xmYegb9ulHSwt72LX-hktdwuxcWkeycGuwZRsJorsGkDHI4bXMfEfovU64NLpWqz6dBTzDyxVO-gJc8rkr8_v2vH25dOu_VpI-FTOF42BPVfe00PDgAMhZuGyrkENED_18_TbIwFAR0aqg-9G59RbHtK4qp0z--CAmHKddn10mPM-pkPYVNSMhINt2nx21_U7y7f4B68DVf6vwdbN8843-4-avi4LV1HuQBakRO58iEJFX-Q-T-qQupG9U0LoydZnb1zrCb39j-2HLGTTTwj6vLpqsjCauydeVmolLJ10Z1BkvawFDv5UPRMwbtm-Ldozqx8m_baFZFQX0QcMKx84Wv5Gka_1DxN2qSRiZZJDujfziQXoMujgcL_8hISn7s0orDO5CF5LeNsDfFu7MSeoaRMFwQ0hLoT3pwUdfX1Ah2XSv21cyseiwExuBxNn5HOPKTBT-jbP1Dft3Jj_IDZU9CwgF1xv-m7ZwLcIjjAqKlJ5Mq_M4C3sOOstf_gWV40HEZs4QWBQmLyTR4L0hcfThZw0n4t9SXLdX20p9MT8hbRAkHNU9_CQ95Pt1-d5_cuEOZ-rtx_vMM2BONSlwveElAwp_g_eBL67nlh0fnZHU0I2u6YI3ybJr66omfTqjvm3bcg386sWMaiWfpLKrCNGC8v2zqCaAR9rq_RPnoT2CIZJPmzcBx70_DDIaSaNbDB-6PrfMTM7RPtrLVQu4--4sX_HbhxULagFIMXjcdci-t7ox4hs9QbaT9ZDWKNmPzczVsrjtRw8OrsdAMlxrG8r6lk-JfHWzbxUh3zGlftLCwPRx2JoM4VLSr7ZZDDRZ-MDC6HeZ8u6SNkqZrnCHPVpkN5hyNPSsQ4oRCHiffQ5kcTx41lab2B92_SbHwguLh8XCiOZ-rDnxHejKrG9ZhBRFlU_pP7rBePDzO2R6gobNC_bwF-8AxUoYLHVdxxU_sh-JwEeSPWMA6C8W5K69h9pFtVhfEWVklEZ2y3WlnxeP2msKdE6ufeMSK5lgRI6TE3wsyJ7X27XWc0Sd7uBF9luHjvExIHk3RB8hxBc-K0bfAb8Po2YLAADUiJ4tTdhVH5HhcnmWfQmv66kJztJmftYYYtjx_Hc_l5yHv0Ubw9QJ8zTOODwrehI9-V09PUQ2t61-BWTVk2BOrWGQjJ2OIZLMqnWvxDPptMUVmCT9ek5Alef8rzCj0cBW31V6V4280uc8HrgujdV1S9nVbSYc5OkY_8eAkm9Cdjanky5150mTHDKV86qX1LDeNefeYk44Dtlu234dh_6V0pxmXv4Rj8iqcdXYPtlZTYc2heSGO1rVzeqUn7a7L5L7G-0yvcD8EkbSmTckpIumoKpIdLvB-UeUJY2TLG7jwJ2_gPnfygVZQv850-X27nfGSLkwn2zNfehSkOf5_9ojFIeek6efX2XECMUv5N7XmTUXfpLiDKmeReTHQdZhd_v1c12JxVXhc2BlyvF_r0X-iRf0BCYvD36uJX1Rpvq2GX1T5Xhg7U8P3ou7R7C0VzuLDVfLPam7wjT9Pf05Do_7mNVJSBXHIvsV6M_k8y_QnUvy39P5f1N-5qkqvk1Fj0SIvl3k2eNyhpDgQ-0hRDPv8x1n3PEWEwxlh578xsIjRKsYO8yyz9fLG2Q61VlrlJeWE5DwPholqUSJyt8_W23W8qoXs9qud7PoGdmnU5dpL9ENGgeulQIgDvN26MVtjqbbbyVp-egqIJ1OkyzIrIwnuhZ_JIk5iP9-07fDahvvQv-1SDWU8ZoNPV1TUwPGLsE8Y9sJ5CwecepV2BvDqGVuFDQAWk0LbTXQosLEG22kJ_o2QNJi-RXLBryKeRzm9gKswjdMsTrMkuXi6qiIakzwss5itQxrGZUXWjPIq4iSBGPiFuCIBSYKEhGEaplFyWSac5lEOJVBWxUGO4gAaKupL5_OXSu8u_I_0V2Ec5FF0UdMSauPfRSJEwgv2rYgQlNxc6Cv_-37Z7QyKg1oYa0YxVtgarr4UDx-GH_dfnkDizgi5w8cXgC46XV_98dcIBsjnK_LvAAAA___wmkql">