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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64] Passing a v1f32 arg through memory crashes backend with "Invalid TRUNCATE!" assertion error
        </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

Passing a v1f32 arg through memory crashes backend with assertion `VT.isInteger() && Operand.getValueType().isInteger() && "Invalid TRUNCATE!"` failed during `AArch64 Instruction Selection` pass when targeting AArch64.

The problem only occurs when the v1f32 is passed through memory. In the reproduction below, we use a v16i64 to occupy all 8 registers used for passing arguments so that v1f32 has to be passed through memory.

## Minimal Reproduction

https://godbolt.org/z/rz863x8dr

### Code

```ll
define <1 x float> @f(<16 x i64> %0, <1 x float> %1) {
BB:
  ret <1 x float> %1
}
```

### Stack Trace

```
llc: /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:5372: llvm::SDValue llvm::SelectionDAG::getNode(unsigned int, const llvm::SDLoc &, llvm::EVT, llvm::SDValue, const llvm::SDNodeFlags): Assertion `VT.isInteger() && Operand.getValueType().isInteger() && "Invalid TRUNCATE!"' 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/build-debug/bin/llc -mtriple=aarch64 ./crash-reports/dagisel-aarch64/4.ll
1.      Running pass 'Function Pass Manager' on module './crash-reports/dagisel-aarch64/4.ll'.
2.      Running pass 'AArch64 Instruction Selection' on function '@f'
 #0 0x000000000479068a llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:11
 #1 0x000000000479083b PrintStackTraceSignalHandler(void*) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:636:1
 #2 0x000000000478ee86 llvm::sys::RunSignalHandlers() /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Signals.cpp:104:5
 #3 0x0000000004790f65 SignalHandler(int) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
 #4 0x00007f65e46d9980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
 #5 0x00007f65e35c9e87 raise /build/glibc-CVJwZb/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
 #6 0x00007f65e35cb7f1 abort /build/glibc-CVJwZb/glibc-2.27/stdlib/abort.c:81:0
 #7 0x00007f65e35bb3fa __assert_fail_base /build/glibc-CVJwZb/glibc-2.27/assert/assert.c:89:0
 #8 0x00007f65e35bb472 (/lib/x86_64-linux-gnu/libc.so.6+0x30472)
 #9 0x00000000044929ce llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDNodeFlags) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:5373:5
#10 0x00000000044789fd llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:5054:10
#11 0x00000000044790da llvm::SelectionDAG::getAnyExtOrTrunc(llvm::SDValue, llvm::SDLoc const&, llvm::EVT) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1410:5
#12 0x000000000444df8d getCopyFromPartsVector(llvm::SelectionDAG&, llvm::SDLoc const&, llvm::SDValue const*, unsigned int, llvm::MVT, llvm::EVT, llvm::Value const*, llvm::Optional<unsigned int>) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:421:16
#13 0x00000000043faddc getCopyFromParts(llvm::SelectionDAG&, llvm::SDLoc const&, llvm::SDValue const*, unsigned int, llvm::MVT, llvm::EVT, llvm::Value const*, llvm::Optional<unsigned int>, llvm::Optional<llvm::ISD::NodeType>) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:171:12
#14 0x00000000044496a2 llvm::SelectionDAGISel::LowerArguments(llvm::Function const&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:10713:29
#15 0x00000000044f2cfa llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1370:3
#16 0x00000000044f1776 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:467:3
#17 0x000000000117b625 (anonymous namespace)::AArch64DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp:55:5
#18 0x0000000003566e65 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:91:8
#19 0x0000000003c3c3a6 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1430:23
#20 0x0000000003c411d2 llvm::FPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1476:16
#21 0x0000000003c3cc79 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1545:23
#22 0x0000000003c3c7ed llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:535:16
#23 0x0000000003c414b1 llvm::legacy::PassManager::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1672:3
#24 0x0000000000d3f74c compileModule(char**, llvm::LLVMContext&) /home/henry/aflplusplus-isel/llvm-project/llvm/tools/llc/llc.cpp:737:41
#25 0x0000000000d3daf2 main /home/henry/aflplusplus-isel/llvm-project/llvm/tools/llc/llc.cpp:418:13
#26 0x00007f65e35acc87 __libc_start_main /build/glibc-CVJwZb/glibc-2.27/csu/../csu/libc-start.c:344:0
#27 0x0000000000d3d2fa _start (./llvm-project/build-debug/bin/llc+0xd3d2fa)
```

## Cause

We need to copy parts of a v2i32 into a v1f32 vector. However, the following code does not handle cases where both the element type and the vector length are different.

https://github.com/llvm/llvm-project/blob/2098e2f472578f793c565b669500dca454b4a608/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp#L396-L422

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdWVtzo7gS_jXOi8ouECDgwQ-Ok-zkVLKTmnhzqvbFJYSwOSsjl4Aknl9_ugU2hsQ7mdndZGpnHBsE6v6-vumW6HQ3HVEPPuRClsLk2yrXxci5GDmz5vuOl2VerAgnj27mUcLNilRro-vVmmzkRpsdEYaXa1mShIs_ZJGSp7xaE-gmDQojI-Y8LCZ5eV1UciXNiEYjGpMRZfAhn7fS8CKdrGT1wFUtF7utbN441WNE6XXxyFWeksWX336dzxaXI-pCK-ghGc-VTElaG8QMLbOZEWvmk-uirEwtLKB7qaS9wh5bAEqe1rIgFVCTFfZrO02O7bBYS7I1OlFyQ3ShdkQLUZt9V3jYmCcvrUTA0DfSBBDY14wEKWmLJJFKP43onDxJUpfSGpnlALfSVv52R7hSJIJeq7ysJOirUXamjVVjHWNW9UYWVUlKDRp41SJZ8xLFJPIEoGNybQjc5kW-4Yp8OcJ4_Nq6qrblyIPXr-Cz0mmiVTXRZgV3X-HPfI2Y9xyl5qVsFD_Xqew9YU7zUappSGWWF5KMvLlLnkmmNK9G3iUZ-U6GMQDNDNrBPraVBg6a7sXbNHBtuITnjdTzc4RsLwkYsnq9R4MovBhAe53JfQWhThaGi9cJNbdKCdAM4q_WeiPxRxZmB788U1tVl_g3zkupoEmpx80YrP4_iMz2Fn_yBL7Rbr_IAq4OkXsx-2VwOxHbLWgLvJCiUisAaHuz-wubWMctx1JsC8T9r-gcGtVFma8KiJa8qNC6QkPi9KTdaNGk4vyo-fJh0W9otb4uAnVdKb4qwU8Idvb-tYKGba1o8-Du5nJ2f0nKOtnkFeRhUq8wVbWpMIkGgQ_1rU4mQm-OPNX3X16WtQR6VwQAgy2FqlNp898WS1sqKwyfVn0TUGm92R5i1YFH8Z3RK8M3XZKjuSYv9SV1rtJxKgE23uWFfUWQ8aaCmq7kyLvgvKmE2NuCGDf8EGXKVxiH4_YdaPEn-6R0EceXuiiw2NhqCca7qoumguHwQG55wa3tQyiNZAOlQ0l86ztU4ctWHX1N3Z9X8UZttocE903FCNukh4x1iPPs7P_5YeywiB-FZLkrm4s7GDcq64wmuWnUvWT401KDfsk3bfzbHIn_eoLf11s0D1z9VuTP2AA5yFU5gcDBnGaYJa7b0XGHdCIvIQPsjYxPEH_KpsWjztMRnb0HYOYxBNzhpX28kZQRe8384Pce7PKQzn8b4D3Sply6jo8G7pB6Q8tmLCBDU76T330n7JvRb8GFAEr6LI3jyCHLpZFlpY1cQq2y9mqlP0dsyfyxyov6ebwq6ubBFqYBkqeTUk9g-Dx3nl0KUrAQH9QEx2q8QMQyConhQIjsSw1WQRAmxvOH_zz9nhxu6QSyjl6VlgdcTLAEgHtTucXkrxua0PBo0QAynDag6ImNdBe-nA4JGyBJwswlPNGW6duQVGljDdvLKokGSsK-kiTxMg5WbSawSxwllgl_O_em3-GiURn3VUZDlX5I3-A7gV5j1mseBCfteS3uRa4f01j86KA_HO7tCP5dY_6p0f7dJ0Nel95YN_vjAFSiOEs_yEjvbQsn8G3B64zhDowROyn_ljFmxe7yufpsFgaG297weML73zDNO1vB9cEAvYjoD02-n2ZRSoDoXG93V0Zv7jjMWx5AjjZ9uj1d7O209_Px9ukMn56Ordth_LwIqJfSumef7XIeKrE376nwLt_P8udYM6VpHeBTrL4u6xzQH3Gh9qapeOGAf5fpT7zXNV7fXzQXWHvsMufjPOaG1mO085g_SJmYcXqiblzDTdN6o5-kmR2WMcf-PCwmOq99EFUndHHA2A-rSDbok82oyE4VyY5s0zpT6pyXuThXWvzx01BGlHu-XojV0OvYsgFbNwzZN9nCUPC5uOVinRdyT6zH9sWzj6Hrs7DPNjxm67phwmiA0zBe6GK30XVJCr6R5dauBOOGS7sUBckL_VNYYWG3LeGiRdZdIbY9zv0sIOiPftGxBbyAMQnLnZOQcbF_RPZVlv-ck18B07KKsUJFHaveVNgT8J8fR_HVHfbdb1q8M5_rL_B1I1dc7I5QHKYnHiYk7WKUOn0uvuum9A1cbu0mTD_-2qZ34RGy_jBP3aFPRBh_K9duf05ygR8MnESH5EJ5vKxQVlJzfSTverPtasdHsQm8YOApbxhxfuJ-m8yHE3GZ3fk-8kpvnuKkXhb6ODPcbHMlDyEk1tzYydtg_nZz83A710Uln_-G4bnSWpX2VjTfLebQwxHJdzvMwQBzyjNKNjwv_gn1vhvZWUCnfrDhwoWIQrJc4t7DsqxgJr7cY3nLVogocePC7gE1l_ahlWO3RTwfl6TdipSGQ_YUt2JsB6wVb9_4tnskTf_DJsmfnOmQOa_L3lHOfyUpJB6aaYiY7Y5scRVCdIZHdDTHg74CHu0PRR_t-nBCPsEk9xG3COd2rz_TSukn3MgWMIqRVEuocroia7uTSAQvpT1ANJIkulrbPjB1wRkyqWDWbw8P7NmilU-ULFZ4tArvp3mWQb-i6p3jffc5RaI0eo06cSRp5oc0CKMsjD0RsCBhLA7AC4L7gZ_4nDnRX55jU-_Gi9n4xqfteuJMTl3GWOgHgeedpVMvjb2Yn1V5peR0FJzvJzXBBfnRk-iTh0BHZ9TSGG3OaqOmP37UE0TMDc7WU-lHmfCZn4aJH4s05E7KRUipk0Q0ciN6pngiVYnsgNZZPqUOpa5DmeME1PUmUeLTOBAsDANXZLEY-Y6ErFMTVIynrWdmajFAzJfwUOVlVXYP0Uqw2pR7-byu1tpMP_GvO8C6PrN4pxbs_wED0t7b">