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

    <tr>
        <th>Summary</th>
        <td>
            NVPTX: Cannot select: = NVPTXISD::LoadParam<(load (s24), align 4)>
        </td>
    </tr>

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

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

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

<pre>
    I'm currently working on improving nvptx support in rust. The rust compiler produces llvm-ir with struct return values bitcast into integer values. This is fine for most targets, but for the triple `nvptx64-nvidia-cuda` `llc` cannot select for these types. A description going deeper into the rust side of things can be found [here](https://github.com/rust-lang/rust/issues/97174) I will try to keep the rest of this issue focused only on the llvm side.

The problem from the LLVM side of things is that well formed llvm-ir cannot be compiled into ptx. I'm not sure if it is coincidental that clang always uses the actual struct as the return type, or if it is because it is better to work around this bug than to fix it. I do think that it will be a ugly hack in rustc to special case this for the nvptx target, and is thus willing to put a little amount of work into helping out fixing this bug if it is a realistic option. 

I do realize this is only tested on a rather old version of llvm. I looked at your issue tracker and do not believe it is fixed. I apologize if this is a duplicate or have already been fixed.

### Simplified example code
I believe this is a LLVM backend bug, and therefore the most interesting source is perhaps a simplified .ll example. The following is generated with bugpoint:
```
; ModuleID = 'bugpoint-reduced-simplified.bc'
source_filename = "main_rs.99b55f54-cgu.0"
target datalayout = "e-i64:64-i128:128-v16:16-v32:32-n16:32:64"
target triple = "nvptx64-nvidia-cuda"

%Foo.0.1.2.3.4.5 = type { i8, i8, i8 }

declare dso_local i24 @_ZN7main_rs6device17h13d51938dd622c57E(i8) unnamed_addr #0

define void @kernel(i8* %input, %Foo.0.1.2.3.4.5* %output) unnamed_addr #0 {
start:
  %0 = call i24 @_ZN7main_rs6device17h13d51938dd622c57E(i8 undef) #2
  unreachable
}

; Function Attrs: argmemonly nofree nounwind willreturn
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i64, i1 immarg) #1

attributes #0 = { "target-cpu"="sm_30" }
attributes #1 = { argmemonly nofree nounwind willreturn }
attributes #2 = { nounwind }

!llvm.module.flags = !{!0}

!0 = !{i32 7, !"PIC Level", i32 2}
``` 

### Backtrace
When attempting to compile this with `llc-14` from the Ubuntu 22.04 apt repo, the following is returned:
```
LLVM ERROR: Cannot select: 0xbebd58: i32,ch,glue = NVPTXISD::LoadParam<(load (s24), align 4)> 0xbebcf0, Constant:i32<1>, Constant:i32<0>, 0xbebcf0:1
  0xbeba80: i32 = Constant<1>
  0xbeb8e0: i32 = Constant<0>
  0xbebcf0: ch,glue = NVPTXISD::CallArgEnd 0xbebc88, Constant:i32<1>, 0xbebc88:1
    0xbeba80: i32 = Constant<1>
    0xbebc88: ch,glue = NVPTXISD::LastCallArg 0xbebc20, Constant:i32<1>, Constant:i32<0>, 0xbebc20:1
      0xbeba80: i32 = Constant<1>
      0xbeb8e0: i32 = Constant<0>
      0xbebc20: ch,glue = NVPTXISD::CallArgBegin 0xbebbb8, 0xbebbb8:1
        0xbebbb8: ch,glue = NVPTXISD::CallVoid 0xbebb50, 0xbeb740, 0xbebb50:1
          0xbeb740: i64 = NVPTXISD::Wrapper TargetGlobalAddress:i64<i24 (i8)* @_ZN7main_rs6device17h13d51938dd622c57E> 0
            0xbeb670: i64 = TargetGlobalAddress<i24 (i8)* @_ZN7main_rs6device17h13d51938dd622c57E> 0
          0xbebb50: ch,glue = NVPTXISD::PrintCallUni 0xbebae8, Constant:i32<1>, 0xbebae8:1
            0xbeba80: i32 = Constant<1>
            0xbebae8: ch,glue = NVPTXISD::DeclareRet 0xbeba18, Constant:i32<1>, Constant:i32<32>, Constant:i32<0>, 0xbeba18:1
              0xbeba80: i32 = Constant<1>
              0xbeb948: i32 = Constant<32>
              0xbeb8e0: i32 = Constant<0>
              0xbeba18: ch,glue = NVPTXISD::StoreParam<(store (s32))> 0xbeb9b0, Constant:i32<0>, Constant:i32<0>, Constant:i32<0>, 0xbeb9b0:1
                0xbeb8e0: i32 = Constant<0>
                0xbeb8e0: i32 = Constant<0>
                0xbeb8e0: i32 = Constant<0>
                0xbeb9b0: ch,glue = NVPTXISD::DeclareScalarParam 0xbeb878, Constant:i32<0>, Constant:i32<32>, Constant:i32<0>, 0xbeb878:1
                  0xbeb8e0: i32 = Constant<0>
                  0xbeb948: i32 = Constant<32>
                  0xbeb8e0: i32 = Constant<0>
                  0xbeb878: ch,glue = callseq_start 0xbb7bb8, TargetConstant:i64<0>, TargetConstant:i64<0>


In function: kernel
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: llc-14 test.ll
1.      Running pass 'Function Pass Manager' on module 'test.ll'.
2.      Running pass 'NVPTX DAG->DAG Pattern Instruction Selection' on function '@kernel'
 #0 0x00007fce2350ed01 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe3fd01)
 #1 0x00007fce2350ca3e llvm::sys::RunSignalHandlers() (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe3da3e)
 #2 0x00007fce2350f236 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xe40236)
 #3 0x00007fce221b6520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007fce2220aa7c __pthread_kill_implementation ./nptl/./nptl/pthread_kill.c:44:76
 #5 0x00007fce2220aa7c __pthread_kill_internal ./nptl/./nptl/pthread_kill.c:78:10
 #6 0x00007fce2220aa7c pthread_kill ./nptl/./nptl/pthread_kill.c:89:10
 #7 0x00007fce221b6476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007fce2219c7f3 abort ./stdlib/./stdlib/abort.c:81:7
 #9 0x00007fce23449723 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xd7a723)
#10 0x00007fce23d2fe61 (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x1660e61)
#11 0x00007fce23d2f308 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x1660308)
#12 0x00007fce23d27eff llvm::SelectionDAGISel::DoInstructionSelection() (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x1658eff)
#13 0x00007fce23d275c4 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x16585c4)
#14 0x00007fce23d269f8 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x16579f8)
#15 0x00007fce23d24587 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x1655587)
#16 0x00007fce238952be llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0x11c62be)
#17 0x00007fce236493c0 llvm::FPPassManager::runOnFunction(llvm::Function&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xf7a3c0)
#18 0x00007fce236509b3 llvm::FPPassManager::runOnModule(llvm::Module&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xf819b3)
#19 0x00007fce23649f66 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/lib/x86_64-linux-gnu/libLLVM-14.so.1+0xf7af66)
#20 0x0000000000410223 main (/usr/lib/llvm-14/bin/llc+0x410223)
#21 0x00007fce2219dd90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#22 0x00007fce2219de40 call_init ./csu/../csu/libc-start.c:128:20
#23 0x00007fce2219de40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#24 0x000000000040b065 _start (/usr/lib/llvm-14/bin/llc+0x40b065)
Aborted (core dumped)
```

### Meta
My exact version of `llc-14` is:
```
$ llc-14 --version
Ubuntu LLVM version 14.0.0
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzFWVtv2zoS_jXOC2FBd9kPeXAu7QZoe4Kmp2exLwZF0TZPZEkrUbnsr99vSMmWXCdx0y62SGVJ5Mx8c-HMkErL7Pn8ZuInWybaupaFzp_ZY1nfq2LNyoKpbVWXD_RQPFT6iTVtVZW1Zqpgddtoh33bSHPHRLmtVC5rBoKsFbJhef6wnaqaPSq9YY2uW6FZLXVbF-yB5y1mpEoL3hA3XdJFrkFvx4izahj-VqqQbFXWbFtiqub1Wupm4l-ytNXmvQYEXasql2wSuwZnHE6LB5UpPhVtxvGWRvJc0J3gRVFq1shcih2DBiyeKxK7YJlsBNhpBf3XJemeSVkBmYGpe4UblUlWrvACUxpiy1IC2hYZm0QXG1nLSXQ18WcbratmEiwm_gf8rWGNNnVgLjwQo2nOi3V3jx_VNFAfN_PES8KJP2c3sGCeQ8VnBvn3wGJBSICw8slOoIJw0TYyg-PgRaCnaeQFg9WZuFcTd2Gv5DY4Ks3llq3qcmumfvr0_fOhWuCtN1yzRwkIMNYW7HvHdpaE1p3zM2siOMBhNqiMpdtaMrViShM3AYsKyCg0zy1rQQZgPH_kzw0D_saA4UK3mNHFDW86nU34kKsoAuC7Hd9UCg7i3ZPW8BjAUDAzXhu3GFOl7ZrkFjS4Uk8gAFiWlUbjewsJTIzNoRpn7RrW3HBx30e9INKmkkIBIAJYWsZ9LNqVYgOVUHJINmZsG8OVIoqshPDlLFdaI3D5FgCNOw1eY8aNzCuzDCnO1ZMh6xXYqc1hE56rRivBShOzDhs62mhmpvxH9qFi40MjfkysEA8O4DUr84w9yLqhyAcU8jPZJi_Le8yEXZ7Ltu5iTdewCGhIO4iwgZAr-dC7AJBlRuS8KvNyTfLVLlohM2urXAmuJblxw0HHcwDNnsFHFh35UJWJH9g_doe0lKuVAij5xLe08kWZyV7jHsdelonslAADLezXu4W0lvCbNI4zCYbSEC0tMncDdYUkFlj-G14Rq2Yv20GEdPJtIlyVeV4-EiVI1rKQsCvmmQQIqRVCX1MisOrEbvdnH4ML9hmZM5c3V2wS4L-f9DTTWlJKzaZ74U4qMMGSWpjLFVZgwbeyo_a3XBXLunHm8zSKVlE4FevWcTFgqWyAsoxjIfJnCrKOTk5VHAImkqjy_BnucJ0-eDHdxdOHwMdN4E8L88Y8Yf4B2z4hW5bHknJP0Ds3-lCWjut4ju8ETuhEhpZWOpskF0zNyGf9Fa-uhtSZRBKBF7OmXOalwLJUfsgmobv815eks0OcyQclpJdsvCCLvHkwy7LY90WUXCNJE-c5awsyYLbkWVYDd-COhZhS9FCqjFgj-AuZd6QLzI5UgTVNAH9UppsBK5spRySRlp07YcJ9mDCic40xoNd7FIMsQCehkOP3XNsCi01sOEpAp-TYpBSPH9pCmDK40LqmEoZEut7KrckfRbmqJbIdEhdCPjOpzebnsU96e5lsAmJRPTuVq2b2QqHWm7AokaaQ6Qt4sNJUNR5rpSVJ651_bBIljd0cYocfD53LFmA7rb2hZhzKKDQPKDTW8BSjCDFEpA3eqahaCs8A1dtvtsuAFs0-5Mb03o7-JNu8xMbfsdkRHTrE96wJTZJwVjlHebbry6PY8T33Rwp3MENBSGLD04NCtzeX7BPSZE6qks0w7O859NmJHU_BF0imVAK64Plrg5QNjeS20l1963oCm4VNCrQ92NQLie2u6_gzReVrme87bohaQT1iVRIgfZhRrQVl9lIKNVn--uvXP75SqF4O-zx64T6lMs0iSmikLESIDS5rtJvGSl--3377583dFbEPFp9Knt3ymm8nwSUiNMcjDDdrfOrJTP3I1bpg5im4tszFyqWRy7LAGjapnuQElx5mHB1wu4EdNTJsv0DNOz5zO7gG4p6B5TmcOpMvTXUPp1pJ7DX1L5FrFvX6GnFoSWazV1XbTRpo8FM6sCGLV6F9wpahg9fR-L9kdt8dg_5J2D9l_r2e_qkuuJBr9J2GKE1nO9h0fwCbDUfeZP2d8rIliNwd2yTc39P7H0Sw_TxSNw6PsP-r5hVtmL6ZdPoxL1OeL1DoZENFxHQXl6aOdXXXVMeTaxqttkNMHao4GaE6Kv83Sx5Y6lWT39Zo5MjufxaqCzB5wpKiSUd88NMxOiSSb8bHla3dX9HIWRLvdag_DNDlhLVHfI9q9079OrJ5OHuBzOJ6ie70NTxG6b1p0DuNTcagnDT0bOoJFaL5sIjM0-PZzH3Loq-bmti-YOp3a_9_I7TKnBLCd2iaeW0s38lMjofyi1Y8MZSJ74v2_QV93x_Sv0Os1erA0LQPaeS_l2ajQvPSpKtMNuEODWVyfW-o14aHXabdxxds1e0_CEK33TJDt5-uF3fXrGnTraJDFDoRoa4RaOjc5OXzNmqgu59pVZd_U2c4OHKzRzWFyNvMngiImjcbc3Bget3uOOJO02FQ1m6rXSfqOtZot3W5plCDou1WFtpsmmzTaw5cnLxTwesIvmIjSO1txRvaByS7LdctvfjMC76WNd7TOY3t_GlWz8pPOkj-C-zMmmBXi49T2Bg_YEsHYwW7KezJGom6My0y2dnK6c1ODAYb3e60wW6a3CcX_5KVkH4QuTJzPXNcZNde89wMip4x1zezV0AfvZtU88dlCRASOdGPzQ6k0Ha_NiMfqRTXp1m8jMNpror2abouWjtAjT4s6jSlg53MhfskgxUQUBbdQfQOIAoeyGMQYbE7NPI8_wecn0tsc_3Zu1FkEDJC4R-gWPlB_C7WoQvKEetgyNr30jjy3RNYC2IaG6ahH1HnPOAZjnj6LueJYMtlpTe0yV7eYxu7pCMoSbHNTYw4YFtUGvHxYXA7pHAEzBzSiVIS70VFp4iiszi45lQhNgW7eyHxMSFDslM5z-YHnJND64dJzNaNiSTD1N4SW_P03GSyohxTlY16ouN-rhppeGNhBYuBZWZj1nORrALGU8puhpXOrH9HD2bcQvXIEnt281EIhuE8wfb9HSGYJTyhvf98dxTgjdNA5q9k7L2HtRfHLkhHvL1D3oE7G6zfXc5CUrvBw_DtZZnJy3K7pYQ2SDh3V1_okNhfUK5pC3KQzFDaeM0ElaTDkfenI9IHcEf6-Af6JHK1elOfq3KQpwdp-r0ZyoujGeSOgAWHwCIRvgmMTPxRFosiu0YJxtCvYYLIEabwAFM8X53q_EWeX_BGiYu8FPfNKAB2tbVzd_x-xAkAjRBHB4jDaJa8ibhuiz-Kz1xsVCF7cCPEP4z9AuQIiEaQR8kxmM0jPx1WyAPZ1I8MUB-F-xtweiIGjBHOUaoN4nAeCHeA88MtQes7pf85wlXCIX8EcDYGGLnzNDgBoP3aM_Z39-rd4GYeZI_AzQ-tt4rjAbhcrrl47rq1PcwbFPkd1N8LMeFAMITo92XE_gs910eFouOYjn_b1DsppnX3kC0-pKowz8L2MoZqxNY7qKNZNnfRYVAPZLcuS9rILI0gqqWiaX8s111DcIzI2cAc5jjZi_dS_UOpaN3MjgndjNKHguwtcZ8a7qaC249uvrtnGhxjOlLlmBZHmQcJtTLRnnc4tr6bunHEur3dT9jf0O3sv6B2RJoTc0EnHbRZktnePQffPg8-LnyWmtt3n5_pC6vQw8_So88IqtntwQ6Z-uHk0p8suslsOu142OHus4P5ZtAzR5y6jnvA7Sw7D7J5MOdnWulcnpst1eTYB4Zf_Yhw1tb5-ft3r1GUxOHZ5jyWMlyFcyEDN0uymSvFLJj7IsmSOPVcHp7lPJV5cz6JLujTrHy0X_TpM1B0dabOfawkN_LnvhvMosSZy1DGc58H3OeZlD52hBLRljvma1RZr8_qcwMJu_CGvvOpRjf7QeQUaqekEQf-vNWbsj6__1tqleN6z8-M-HMD_7-19rmy">