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

    <tr>
        <th>Summary</th>
        <td>
            [WASM] v1i8 / v1i16 crashes backend with invalid Bitcast when targeting `bleeding-edge`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    ## Description

When targeting WASM `bleeding-edge`, the following code crashes backend with assertion `VT.getSizeInBits() == Operand.getValueSizeInBits() && "Cannot BITCAST between types of different sizes!"` failed during `WebAssembly Instruction Selection`.

The code can successfully compile when targeting WASM without specifying `-mcpu=bleeding-edge`.

The problem exists for v1i8 / v1i16, but it does not exist for v1i32 / v1i64.

## Minimal Reproduction

https://godbolt.org/z/T44czsqWr

### Code

```ll
define <1 x i16> @f(<1 x i16> %0) {
BB:
  %B2 = srem <1 x i16> %0, %0
  br label %BB1

BB1: ; preds = %BB
  %B = urem <1 x i16> %B2, <i16 3>
 ret <1 x i16> %B
}
```

### Stack Trace

```console
llc: /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:5530: llvm::SDValue llvm::SelectionDAG::getNode(unsigned int, const llvm::SDLoc &, llvm::EVT, llvm::SDValue, const llvm::SDNodeFlags): Assertion `VT.getSizeInBits() == Operand.getValueSizeInBits() && "Cannot BITCAST between types of different sizes!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: ./llvm-project-latest/build-debug/bin/llc -mtriple=wasm64 -mcpu=bleeding-edge ./crash-reports/dagisel-wasm64/bleeding-edge/1.ll
1.      Running pass 'Function Pass Manager' on module './crash-reports/dagisel-wasm64/bleeding-edge/1.ll'.
2.      Running pass 'WebAssembly Instruction Selection' on function '@f'
 #0 0x00007f9e979c0f2a llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/Support/Unix/Signals.inc:567:11
 #1 0x00007f9e979c10db PrintStackTraceSignalHandler(void*) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/Support/Unix/Signals.inc:641:1
 #2 0x00007f9e979bf756 llvm::sys::RunSignalHandlers() /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/Support/Signals.cpp:104:5
 #3 0x00007f9e979c1805 SignalHandler(int) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/Support/Unix/Signals.inc:412:1
 #4 0x00007f9e96155980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
 #5 0x00007f9e95451e87 raise /build/glibc-CVJwZb/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
 #6 0x00007f9e954537f1 abort /build/glibc-CVJwZb/glibc-2.27/stdlib/abort.c:81:0
 #7 0x00007f9e954433fa __assert_fail_base /build/glibc-CVJwZb/glibc-2.27/assert/assert.c:89:0
 #8 0x00007f9e95443472 (/lib/x86_64-linux-gnu/libc.so.6+0x30472)
 #9 0x00007f9e981528d0 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDNodeFlags) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:0:5
#10 0x00007f9e981371fd llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:5149:10
#11 0x00007f9e9813e28a llvm::SelectionDAG::getBitcast(llvm::EVT, llvm::SDValue) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:2229:10
#12 0x00007f9e97e40ab6 (anonymous namespace)::DAGCombiner::visitEXTRACT_SUBVECTOR(llvm::SDNode*) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:22304:22
#13 0x00007f9e97df1045 (anonymous namespace)::DAGCombiner::visit(llvm::SDNode*) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1792:40
#14 0x00007f9e97df0108 (anonymous namespace)::DAGCombiner::combine(llvm::SDNode*) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1828:10
#15 0x00007f9e97def716 (anonymous namespace)::DAGCombiner::Run(llvm::CombineLevel) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1626:18
#16 0x00007f9e97deefff llvm::SelectionDAG::Combine(llvm::CombineLevel, llvm::AAResults*, llvm::CodeGenOpt::Level) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:25586:3
#17 0x00007f9e981c000f llvm::SelectionDAGISel::CodeGenAndEmitDAG() /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:785:3
#18 0x00007f9e981bfbbd llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, bool&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:701:1
#19 0x00007f9e981bf64d llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1641:11
#20 0x00007f9e981bcb27 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:480:3
#21 0x00007f9ea4be15aa (anonymous namespace)::WebAssemblyDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/Target/WebAssembly/WebAssemblyISelDAGToDAG.cpp:61:5
#22 0x00007f9e9b1d51d5 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/CodeGen/MachineFunctionPass.cpp:91:8
#23 0x00007f9e9a31d676 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/IR/LegacyPassManager.cpp:1430:23
#24 0x00007f9e9a3224a2 llvm::FPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/IR/LegacyPassManager.cpp:1476:16
#25 0x00007f9e9a31df49 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/IR/LegacyPassManager.cpp:1545:23
#26 0x00007f9e9a31dabd llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/IR/LegacyPassManager.cpp:535:16
#27 0x00007f9e9a322781 llvm::legacy::PassManager::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/lib/IR/LegacyPassManager.cpp:1672:3
#28 0x0000000000419b16 compileModule(char**, llvm::LLVMContext&) /home/henry/aflplusplus-isel/llvm-project-latest/llvm/tools/llc/llc.cpp:737:41
#29 0x0000000000417eaa main /home/henry/aflplusplus-isel/llvm-project-latest/llvm/tools/llc/llc.cpp:418:13
#30 0x00007f9e95434c87 __libc_start_main /build/glibc-CVJwZb/glibc-2.27/csu/../csu/libc-start.c:344:0
#31 0x00000000004176aa _start (./llvm-project-latest/build-debug/bin/llc+0x4176aa)
```

## Cause

In the following code from method `DAGCombiner::visitEXTRACT_SUBVECTOR`:

In Line 22301, `Src` is `t3: i32 = Constant<0>`.
In Line 22303, `Src` becomes `t4: v8i16 = BUILD_VECTOR Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>`.
In Line 22304, `DAG.getBitcast` is called with 2 types of different size (v1i16 and v8i16), causing the assertion error.

https://github.com/llvm/llvm-project/blob/8ab032fbe5e4e27d44dc9da9c3289f741a3334c9/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp#L22300-L22310

When not specifying `bleeding-edge`, the `DAGCombiner::visitEXTRACT_SUBVECTOR` method is not called.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWl9z4ygS_zTkhbILgf4-5EG249lcJTdTSXbm6l5cSEI2twh8gDLJfPorkBxLGmeTmZrd5LZ2Ygmh7v79umlaADWGbyVj5yBagGh1Rlu7U_r8N_rtcc3N7qxQ1eM5wARgAlfMlJrvLVcSoBVAeff3y45JaKneMsvlFn7Jb68hiFEhGKu43M5YtWUgRgAvod0xWCsh1FfXs1QVg6WmZscMLGj5B5MV_MrtDlJjmHZ6nKDPd_Mts7f8G7uUC24NwCnAGQRkBcgKftwzTWXlunymomXf98MxwDEEGC-plMrCxeXdMr-9gwWzX5kz_XHPDFQ1rHhdM82khYZ_YwbgAGAMYgRrygWrYNVqZzaI0RdW5MawphCP8FIaq9vSW3vLBPNXIEbzIUd3O9bDpRKatiyZMXUrxCMsVbPngsGvJ1h0XKjWQrNnJa8fe-Wzpty3gKymBH-ncK9VIVgD2QM31sBaaXgf8BQCvHYXQexcUrQWcgsrxQx07PjOh74EHzrH4Uh8HxHXXPKGCnjD9lpVHQnDbjtr9waQHOA1wOutqgol7FzpLcDrbwCv78Kw_Gb--0V_L9uJX6qKjZ7EqPtfiK6hYjWXDAKyDOADdIjIBQQhqp3vx404Qj4akkX36mLh7PKX0D1dYBdR0GjWTOX5V5fdb_9CoaGgBRP-zUUwNNLdkhwCsoB7zSrjxfpuQ22-tT2pbIG9NrLkQQwJIBf9e5rZE5171clqQtFpRm8tLf-Ad5qWp4ktlTRK9M-EKD0SvN6phrkfJvUjwGtai71ojfs344YJgNdC3DezvVb_YaWdCWqZsX2r--EFwGvnzQ9MArx-Giar_MPkdl7u94DkUUSQ0-0FkByQ_Hblh_ewZSjFt2yZ_acLGZy20qe1CnJpHZsOlx1Ju1JllxqWg-aLz3fjhl7raRFO11rQrQE4c8bm7yhr4aTPWv2w_XR1kd9eQNMWDbeQwqLdQs32SltoFZyMU253bTEvVTNw4cC_AK-5Ma3TtYZUOpJL0VbMp3efz302ty7KevVd3FVts38adS5fZZ-02mraQKq3bcOkdUbA-bPxVLRcVLOKFa3LIAWXvmcJZ43VfC8YIKuv1DRxCE8mSS_ZGzjrsDsEFd26GJ51Lzqxo7yK18H8kG4CZ_JNK6XLxHtqDAQ4WbeyS_6fXMM1lXTLtONfSdioqhXM9fp5ze5drx2f0v7yTNRZUh-sBDjpEmTSpxWACYLoASGEkjpjWZKVqMZ0EOnm0XQXnzSX1ruyyyA4PXbS9OtGGasZbfph5Yde9svSx227d8QBvP5d8gfXwLeSCjPn0qWpKE4AyYPgiCqYoApQVcAJhE7Gb1RWwjktvVe8Ajj_G-2OQzddDMzGY7OLOoniU864aeXI-mPm-NV2HwzuUnOAQkf30WAy5TlFEZwS-_cGQxjgManh0MY4iKIsRXCz0cxYpdlGW-jZ66U_pPEmDmeCy_ZhtpVt92Bvd5rRam7UHAG8QA8BzlJXVBzVREM1URgFLE2gpty4HNBlL5dfBS_K2fLzP77-u3i6xXOcALw2HgfA67nLGObRVGzvckXbwTSP5t5bI1t360XPffi7KEJHS-KJJSSpA0gL5ZG-zhJbdWz4t7ySdKIkGSsJCakp3Gy66n3j5p9NQV-PvXvv6aJTmY1VplOVYYJf4bvSeS32XiMoTPDIa9lQZhpEOK3QT9YZ0wrDFw0_VGY8V2C8SRmGjiPdJVQ0JookQV29EVFvw0cUhJlPgUdOggknDKf0JU4W3JbUWZK-X6gY4ynU8czEQkQLV6GmVCr52KjWQEkbZva-NMg6FKv8w1I1BZdMdw333HB78a-7m3x5t7n9ffH5Ynn38WZERRf4v3gafhb7wMIn6MTPcRgfsY8nuaoOUBj9HPZ3BTVIMjdThgMvhxOkKEDpDyMtu7v3hTXF6SSiozFWVifBj0f0TStHOPunV-zegXgbqDGOPeIj1HgCldV1_ad5annChWNow2yV5zfMtMJ91-TjJ73ZH_e2u39LXnAUpY4YcuQlGefvEiH0HC-Xt0yMMOWyumi49dp-ae39qkTtzOlxJWk0RpWOURV1UTw3Ux9Rda0Lani5EKr8Y-R6LrixG26ZplZpQJbTRxWzlPeSpKrYRvmVYjPqOvhE9evBuit6aiqMv_DfX-Ri1OY7dW3vzJxCKeFrljf0PBp8PjrPZ1PPx-FrPZ8LcXS-GXn_aZHjWKe9Heag_2Y-osaTyrQoC5y8iFq38qO8puWOS3YAOEL93bM3hR2maDTI8bD0pGHBgojSl2avwXrRKv9wp94TIXd-9wPg9cDI8Z0z9WB2z0ocjL5R8KhILYIqCqoIPovgEzVmgP0k6L_c_Sds6sFlDtxxEsejKpSSoIqT4drQ-pN797AE-TawLm8AXl-xLS0fB8YcRm7ol_XxIIjDMSSMQ4pfAenar6yOg7Nv-jvhJL7Mio9woqmH6jB7aUxev2uMURhNXBZPMdJRcSG8pH7F-Cjvstkf08wbg4pINPFbMg3DJA1exvRe8ARxgsdzw6EA7P4Lg6wI4sNe81NclTuqfb0-Kdmvrj5fL5W07OHXTfVWKWG67Zru76GAIYlfsD2ank1MTxilsKFc_oVWhIH_NDwSON4TiUISlmkCNxvBi3JjLNV2czDpNUubpWkPa7rdpX_o5fhlThKGx3VOpz6YkhBTCjvFLp388BaZX_rsxDytff7JXjFc0taMtogv5anTG7VWDWyY3akKghi9drUnRk_bgE_Sr7hkEGOCAr_9HaNbXYIYQW7cjSWA5NAfSCAruHRVKJUWkCVytfjT4YehHDKWU7BSNawT5siG9yl3X_tkBRe_X16tNp1tA9k5J_igAS__rx6cJCTsCXHF02AVsuO4pEKw_vgNfm532YWePznit309gS6a8BKWtDUuKlyMHE_vMK2Vnv_JiZCXd5oLodxoSmmBCK4LFrGQ4aQKw6rMKpqVBKdZnYQBJYSEZfbTiwOYXDmO0Mz9BOi7A05STc_hPHfA6YfGwWHw8O70TeeF-Vl1TqqMZPSMnQdxEkRJFAXkbHceMUTKIAwYi0KWIlpX2KWoAJMgjOK0OuPnGGEcYPeXBBGZ46SKUlIEcZaWFSEVCBFrKBdzR9Nc6e2Z38s_j7IYR2f-UIs5HAbT594ZRbs1IETus9ocX7PcCn9s7Et-ew2i1eRs0emDXVzeU8Er2Mfe9NTTCVbPWi3Of_58gof1vwAAAP__YTwB6A">