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

    <tr>
        <th>Summary</th>
        <td>
            [ARM] Assertion failure in `llvm::SDNode::getValueType()` for `use-soft-float=true` and `target-features=+armv7-a`
        </td>
    </tr>

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

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

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

<pre>
    ```llvm
target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
target triple = "arm-unknown-linux-musleabi"

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i32(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i32, i1 immarg) #0

define arm_aapcscc i64 @__aeabi_lmul() #1 {
Entry:
  call void @llvm.memcpy.p0.p0.i32(ptr null, ptr null, i32 8, i1 false)
  ret i64 0
}

attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "target-features"="+armv7-a" "use-soft-float"="true" }
```

```console
❯ llc --version | head -n2
LLVM (http://llvm.org/):
  LLVM version 19.1.0-rc3
❯ llc --float-abi=soft reduced.ll
llc: /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:8909: llvm::SDValue llvm::SelectionDAG::getLoad(llvm::ISD::MemIndexedMode, llvm::ISD::LoadExtType, llvm::EVT, const llvm::SDLoc&, llvm::SDValue, llvm::SDValue, llvm::SDValue, llvm::EVT, llvm::MachineMemOperand*): Assertion `MemVT.getScalarType().bitsLT(VT.getScalarType()) && "Should only be an extending load, not truncating!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: llc reduced.ll
1.      Running pass 'Function Pass Manager' on module 'reduced.ll'.
2.      Running pass 'ARM Instruction Selection' on function '@__aeabi_lmul'
 #0 0x00007ecb6943dcf2 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/alexrp/Source/llvm-project-19/llvm/lib/Support/Unix/Signals.inc:727:3
 #1 0x00007ecb6943b65f llvm::sys::RunSignalHandlers() /home/alexrp/Source/llvm-project-19/llvm/lib/Support/Signals.cpp:105:20
 #2 0x00007ecb6943b9f6 SignalHandler(int) /home/alexrp/Source/llvm-project-19/llvm/lib/Support/Unix/Signals.inc:413:1
 #3 0x00007ecb67e42990 (/lib/x86_64-linux-gnu/libc.so.6+0x42990)
 #4 0x00007ecb67e99a1b __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007ecb67e99a1b __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007ecb67e99a1b pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007ecb67e428e6 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007ecb67e268b7 abort ./stdlib/abort.c:81:7
 #9 0x00007ecb67e267db _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007ecb67e39206 (/lib/x86_64-linux-gnu/libc.so.6+0x39206)
#11 0x00007ecb69fc586b llvm::SDNode::getValueType(unsigned int) const /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:8909:5
#12 0x00007ecb69fc586b llvm::SDValue::getValueType() const /home/alexrp/Source/llvm-project-19/llvm/include/llvm/CodeGen/SelectionDAGNodes.h:1187:28
#13 0x00007ecb69fc586b llvm::SelectionDAG::getLoad(llvm::ISD::MemIndexedMode, llvm::ISD::LoadExtType, llvm::EVT, llvm::SDLoc const&, llvm::SDValue, llvm::SDValue, llvm::SDValue, llvm::EVT, llvm::MachineMemOperand*) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:8924:14
#14 0x00007ecb69fc59fe llvm::SelectionDAG::getLoad(llvm::ISD::MemIndexedMode, llvm::ISD::LoadExtType, llvm::EVT, llvm::SDLoc const&, llvm::SDValue, llvm::SDValue, llvm::SDValue, llvm::MachinePointerInfo, llvm::EVT, llvm::Align, llvm::MachineMemOperand::Flags, llvm::AAMDNodes const&, llvm::MDNode const*) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:8896:69
#15 0x00007ecb69fe086d llvm::SelectionDAG::getExtLoad(llvm::ISD::LoadExtType, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDValue, llvm::MachinePointerInfo, llvm::EVT, llvm::MaybeAlign, llvm::MachineMemOperand::Flags, llvm::AAMDNodes const&) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:8974:52
#16 0x00007ecb69fff97a getMemcpyLoadsAndStores(llvm::SelectionDAG&, llvm::SDLoc const&, llvm::SDValue, llvm::SDValue, llvm::SDValue, unsigned long, llvm::Align, bool, bool, llvm::MachinePointerInfo, llvm::MachinePointerInfo, llvm::AAMDNodes const&, llvm::AAResults*) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:7941:13
#17 0x00007ecb6a00074c llvm::SelectionDAG::getMemcpy(llvm::SDValue, llvm::SDLoc const&, llvm::SDValue, llvm::SDValue, llvm::SDValue, llvm::Align, bool, bool, llvm::CallInst const*, std::optional<bool>, llvm::MachinePointerInfo, llvm::MachinePointerInfo, llvm::AAMDNodes const&, llvm::AAResults*) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:8272:5
#18 0x00007ecb69faa6ab llvm::SelectionDAGBuilder::updateDAGForMaybeTailCall(llvm::SDValue) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:11913:3
#19 0x00007ecb69faa6ab llvm::SelectionDAGBuilder::visitIntrinsicCall(llvm::CallInst const&, unsigned int) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:6471:30
#20 0x00007ecb69faca30 llvm::Value::getValueID() const /home/alexrp/Source/llvm-project-19/llvm/include/llvm/IR/Value.h:533:12
#21 0x00007ecb69faca30 llvm::Instruction::getOpcode() const /home/alexrp/Source/llvm-project-19/llvm/include/llvm/IR/Instruction.h:274:49
#22 0x00007ecb69faca30 llvm::Instruction::isTerminator() const /home/alexrp/Source/llvm-project-19/llvm/include/llvm/IR/Instruction.h:277:50
#23 0x00007ecb69faca30 llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:1348:22
#24 0x00007ecb6a0335cc llvm::ilist_detail::node_base_prevnext<llvm::ilist_node_base<true, llvm::BasicBlock>, true>::getNext() const /home/alexrp/Source/llvm-project-19/llvm/include/llvm/ADT/ilist_node_base.h:42:38
#25 0x00007ecb6a0335cc llvm::ilist_node_impl<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void, true, llvm::BasicBlock>>::getNext() const /home/alexrp/Source/llvm-project-19/llvm/include/llvm/ADT/ilist_node.h:125:66
#26 0x00007ecb6a0335cc llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void, true, llvm::BasicBlock>, false, true>::operator++() /home/alexrp/Source/llvm-project-19/llvm/include/llvm/ADT/ilist_iterator.h:345:25
#27 0x00007ecb6a0335cc llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void, true, llvm::BasicBlock>, false, true>, llvm::ilist_iterator_w_bits<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void, true, llvm::BasicBlock>, false, true>, bool&) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:836:79
#28 0x00007ecb6a034270 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1864:33
#29 0x00007ecb6a035b4c llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:632:22
#30 0x00007ecb6c86f7a8 (anonymous namespace)::ARMDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project-19/llvm/lib/Target/ARM/ARMISelDAGToDAG.cpp:72:3
#31 0x00007ecb6a021007 llvm::OptLevelChanger::~OptLevelChanger() /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:268:11
#32 0x00007ecb6a021007 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:375:1
#33 0x00007ecb6a021007 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:346:6
#34 0x00007ecb69995b7f llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) /home/alexrp/Source/llvm-project-19/llvm/lib/CodeGen/MachineFunctionPass.cpp:94:33
#35 0x00007ecb6960c6d7 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/alexrp/Source/llvm-project-19/llvm/lib/IR/LegacyPassManager.cpp:1450:7
#36 0x00007ecb6960c911 llvm::ilist_detail::node_base_prevnext<llvm::ilist_node_base<true, void>, true>::getNext() const /home/alexrp/Source/llvm-project-19/llvm/include/llvm/ADT/ilist_node_base.h:42:38
#37 0x00007ecb6960c911 llvm::ilist_node_impl<llvm::ilist_detail::node_options<llvm::Function, true, false, void, false, void>>::getNext() /home/alexrp/Source/llvm-project-19/llvm/include/llvm/ADT/ilist_node.h:117:66
#38 0x00007ecb6960c911 llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Function, true, false, void, false, void>, false, false>::operator++() /home/alexrp/Source/llvm-project-19/llvm/include/llvm/ADT/ilist_iterator.h:187:25
#39 0x00007ecb6960c911 llvm::FPPassManager::runOnModule(llvm::Module&) /home/alexrp/Source/llvm-project-19/llvm/lib/IR/LegacyPassManager.cpp:1485:22
#40 0x00007ecb6960d194 runOnModule /home/alexrp/Source/llvm-project-19/llvm/lib/IR/LegacyPassManager.cpp:1562:7
#41 0x00007ecb6960d194 llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/alexrp/Source/llvm-project-19/llvm/lib/IR/LegacyPassManager.cpp:541:55
#42 0x000057b619381a3c compileModule(char**, llvm::LLVMContext&) /home/alexrp/Source/llvm-project-19/llvm/tools/llc/llc.cpp:742:34
#43 0x000057b619375f77 main /home/alexrp/Source/llvm-project-19/llvm/tools/llc/llc.cpp:409:35
#44 0x00007ecb67e28150 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#45 0x00007ecb67e28209 call_init ./csu/../csu/libc-start.c:128:20
#46 0x00007ecb67e28209 __libc_start_main ./csu/../csu/libc-start.c:347:5
#47 0x000057b619376cf5 _start (/opt/llvm-19/bin/llc+0x13cf5)
```

If you add e.g. `-vfp2` to the `target-features`, there's no assertion failure.

I understand that Clang doesn't hit this because it removes VFP target features when targeting soft float (as in `soft`, not `softfp`). In Zig, we would rather not have to replicate that part of Clang's frontend logic. I would expect this case to just work since `use-soft-float=true` is a policy attribute that should ultimately win over any VFP target features that may happen to be enabled. That seems to be the case for other LLVM targets.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkW11T2z6X_zTiRpOMLb9fcBEI6TJDnjKF7cXeZGRZTvRUljySDORmP_uOZDu2Q4CWFrr_3Q5Dgywdnd950znWCdaabQWl5yC6ANHyDDdmJ9U55vRJ1We5LPbnIPbaH84fKuAtgbcwWG2pgQU2mOO9bAwEwRIChOisAsGCzmoQLALkfs1WLJ2xOATBIg5nDz5K3ScQLHyUzjAIFl47TwRodheHAKHJJkaxmtN-A6yqWSN-CPkoZpyJ5mlWNZpTnLPDuu53cAFXjSCGSQEXxigNggUUkmDOc0x-QCFLRSkUshGPTBTwkXGuqGmUgBWtpNoDlGK1rahFBBXFxaNihgKUtRsUlHCsKHyQrIAgdNKZV7Qi9X5ee_aHBQigtDYKCok5w9ptX5tGUehoScH3AF3C01Pslv0MR-oSMh-yqsJqC1AGAQq8MeKClkxQiFW1wbgmmhDI4tCyttlgK6ENrxoOUNot9iFILtqlV8KoPQg6QhBaIf0csIbzA4LuMwsQTDtuS8z1IDIIFTWOqZ7xZDlGgI1RLG8M1Q5cq_Pk4s9oDR42m27jH7YBCLU2NysptirQ1qaCpf2NLrCqHpIZBgjZiY2mMy1LMyu5xOYwz6iGuhkHYL3zTGyzHyRSaMlpN3qFQLYEixXknMDZ7IEqbY0XJJdwR3EBZ6Kz8Jub72sIULozxjoaQCuAVk5N0prGygp8UKab3RPzs7k_92aKBKc3dXBm1p2CpcUHFS0aQos55-0CzomVLECrnawoQKs2VAC0upONIrTjZFYr-W9KzMzPuhH7H8sBWl3Kgn6hwq6gnDoHXS6-HP05J7WFlmaehQIdgWABgsXd8jvmDR2PjKm4kS01NxIXAKXDrOu7ZfthTatrUdAnWqxlQa2dnphkl189mft9fTTj6vu9HbCKMxOubiQBKJ5O7nh972C31zCwxmTHBF3T6mtNFRYFQItW13ChNVUu1oHYW9Pq-_18S80dwRyrFoV1-3nOjL65Byg9_byNDDFAsbXxu51seAFtDII5hVhA-mSoKJjYQu7kewmFtBG6EQQbJrYA-c5ZElhixmkxb23m9uZqcXcFdZNXzEAM82YLFa2lMtBIaK1YH8x4y8yuyedEViO7GRkUQCumdWN9cwWxKCAThDcFhWZHIVFY76ANFEZhQrvt74yNHEVT1Qev8ObQ_btVcqtwBbHaNhUVRrfGRp6Zvd8t-NYIYfHXWNvokRyOmFs7sMYCb6myApACVrJo7MmFkhE1lHRcoRcoLr6t4bXQRjUt4YN5d1TLfkeAkmexPemc3oVP78nzPC-hJI-zMChIiUa2pPe6_XCrmDBORPdWZhOnUfhxI7VRFFedcTNhWiN5t_vfNbXVPECr_xTsyQ6wrcBcz5mwkSVBiU0HBhz-EY48jspTOL41oqX0H1gUnCp9OOn-AKs9j21U8r0IBAvkDUyiYyazMoYTdgBKP1x2oR9Y7ga2gjFbCQ1RlnnQyaUj-JTGmzjsMqmtaNoHZK7lPAbowntyS4YDHKAgnNLMMuzncLOpzc6etpsfjPMNq2pOrT9hZ6lzgFaiNhyg1Xja3PFsM8EkHuhHP0NfGKoE5q9STlKnqoFyfIryeNmr5NLsiFxyLNyUxnCrnUYcpfYjQKu5-2uvC1rbsFVL7ZSnMNPU0XY2P5JBOiWN4jRPIM5twHSkTNGqzw213PkW8UAhO6aQFDncCL6xgXtTyAqzVi9MOLh2uNJbgltyvp9Yljq1Wy_0pgSDDHnxr5mSW3IwJUtz6tolidI4nxyK_7IndH-kuxOyO6sa4cqWoo9H7Xn8uUlJNABBbwFpT_dTSH6T--70GwZOA7GC1POd02xqNYvSgfvgDe7_Qn51lFm1Evpb-dXn2RVyZXE4qCY8Vk1W_u3U91NU02niVrpIfy1K-QYvC8624i1tuuEVx1t9tHixdqFGvwCmfdo__FSTSLPYHg2joBlNTYJ6aVy8ZRJXT69YxYsKf02_J4zhw3S7xvuc_nEFf6JbJ9atIzToMJ7qsCyzBMMtNWv3lsUqRC9EcWekeweRvqDd5z73h_3xcMpyaWu7k_6WS8nH__-8nt96_pZXLhbfqG640Z_rkkkW2lzLDwZ1TjJBbD-E5C2XbFU9Ve5pdXxYkP0JHV5izm0xOop9l1CbztNkbVFhDoJLtzS4-n9hASlK0DT_S6f-jHGMX8qgLhrGC6raB01dYEOXiy8rqVyUu8eMW5mftouPR9hx19e5fuYqypGpZ-9E-sA0M9fCKCY0I88gHttZPAk_v184vwN8HCbWzw_v2FGAvCPwBAfeCPyJJP96-QEp_vU3gFaOvMvoo8BV_cPxgvzX-Ry9XTpw-7UmLiX8GGZHOzqWkTsRwyGrQegXWWb6nqqKCWyk-jyubeUUjQwieJ3r171hmo2N3vh9Zo5y5PBBmFqgI1sKp2dbEERkfLYxzrTZFNRgxtsRIQu6ybGmm1rRB0GfDAgujxccJoHgsr0zGcf1C6wZueCS_OiOFDcluDpY678s1T-v9cXy3g5POXSqD91d5lAzo-hnxOJosKrmJyTwTGTtYaonU8dm34sBXfa3apfuim784CURfr7o2ncNKLKBNB7EFv-M2Jihyvr15nGTM6P_tvDGayaGKOuWT4Au3M_7Xze_Ks5eHE6kQehePQ-5B0peF-nY2a_vKB-PjnCOY9E_RguT6f8krttE-1MCvNV5n7cGsatfBttJj2wnRMlL59ex7Sw4H6BOi9TDndhnHmQjnH7q2kuCIW1F2RHQKH-xQhuAqkZ8FV2N0mOaAH327LORxq7HZnRcT2_9SBqXCU4hQCkWUuwr2WgocEV17W76sq6M-rZeLr7cy78M_t71Xtjg923d_rbc9Jz11Tea1CPT20HsId_zkpFiv9bmhj5QfrnDYttnX_99PPrbF4W_qjcUu7spf8CBXsdxTOeGbjHZ_1PMNEii4V7Sog3-T6MN4-E2z6KdvsTPsihPyudvQXqGb7HWI6gnMT4Dl85rrMzc-2NQTzDVwcuOYuv0wjaLPRIXY2Wubu3ivjPiV4G9G4qr4FrDGe3fnxBh5A33pRZEfAwi8_2PKXNc6vC_tKyZ3mm_JIbfLmsGLb-SWk0HXixiPrJ88ZNp-TK9l39JPH0K-rnSGY-1H_5mmdJdMg9lyrQh4bnoXooSa9dDNQ3w3dAHR4g0mqZWoXeEoPCzEI6Y_DheohhNolXon2JlkBAfnZcjctfOZTvRfr5II3dvEg02EfZJT5TksZ8FqY8DAomsasbpQfFkh5V7v7-YFlo3N9_Xl1IYFwrez7iRkmv3J2l_94lmGxuHu_gwmHKbRGWSQNdH80c3Dl1zSTAS01HHFUr9yIObDWc52WiDldkQzPnm0NJDdPO86ahrazq1yHmseyM7nOphdLwp8jLXF75hgpnjfdqPlvjMEW-biFyrPxrel4bxKaITJKdAnCQehMnkDiZMjtQTkzKCLdWuT0nWpleIU0TORC__C-_JD0gZDe1Jp_q2r0u4lw3ERQHpfDuHIPZmD2WNQOxBI10HKoi94x7y2HORfEcVBSjRUEiID926JWa8UX2narcNbERBlTZYFNDssIGXHIstLCTVAqDEwB0z0OyYhjkluNEUMgMVreQD1fD76hZ2X53oWYCPOyq6QSa20DV2u05vVxpqyFzbsB3uuBXS9CNl7cayObwW8L-Yuwd-pPDR9QYrbHG56Tv8QK0UFK05I9jQlnWbl0JZthAc_lJZrxUF5HLLyBxed7ToU01Jh4tg7Yj9u9EGPkr1A2omiBPvUed9sHRnZOxBpiGGteSM7OGhxb9lQredzA03rMKG8j18ZALKB6ogFvuTInPrKryHO1zXVnoS5hRSgXNOizm8d2QprXT3xLUfW65LqaB0UnGN9y1dPT8rzoMiCzJ8Rs_9BIVREqEIne3OExwXRYnDKKIxphlKwzhKSeZ7OEW-H_tn7Bx5KPRSFHlp6EVo7uUoiT1KsiDMSYpLEHq0wozPefcVgDPXIX3ue1GWpGcc55Rr9wUfhAR9hO4pQAhEyzN17vwhb7YahJ49yPVAxjDD3TeDbEUeLUdN5p3ZdoYzvqp8sWXPulbsOfG8pkVr8yecKFiOvoIRe2eN4ufvbxzvJPNwjv4nAAD__7WZY9c">