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

    <tr>
        <th>Summary</th>
        <td>
            [RISC-V] LLVM ERROR: unable to legalize instruction with `-fglobal-isel -finstrument-functions -flto -fuse-ld=lld`
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          patrick-rivos
      </td>
    </tr>
</table>

<pre>
    Testcase:
```c
int main() {}
```

Backtrace:
```
> /scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/clang -fglobal-isel -finstrument-functions -flto -fuse-ld=lld red.c -o rv64gcv.out
clang: warning: -fglobal-isel support for the 'riscv64' architecture is incomplete [-Wglobal-isel]
LLVM ERROR: unable to legalize instruction: %2:_(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0 (in function: main)
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld --sysroot=/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot -z relro --hash-style=gnu --eh-frame-hdr -m elf64lriscv -X -pie -dynamic-linker /lib/ld-linux-riscv64-lp64d.so.1 -o rv64gcv.out /scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/usr/lib64/lp64d/Scrt1.o /scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/lib/gcc/riscv64-unknown-linux-gnu/14.0.1/lib64/lp64d/crti.o /scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/lib/gcc/riscv64-unknown-linux-gnu/14.0.1/lib64/lp64d/crtbeginS.o -L/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../lib/riscv64-unknown-linux-gnu -L/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/lib/clang/19/lib/riscv64-unknown-linux-gnu -L/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/lib/gcc/riscv64-unknown-linux-gnu/14.0.1/lib64/lp64d -L/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/lib/../lib64 -L/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/lib64/lp64d -L/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/usr/lib64/lp64d -L/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/lib -plugin-opt=mcpu=generic-rv64 -plugin-opt=-global-isel=1 /scratch/tmp/red-42c349.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/lib/gcc/riscv64-unknown-linux-gnu/14.0.1/lib64/lp64d/crtendS.o /scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/../sysroot/lib/gcc/riscv64-unknown-linux-gnu/14.0.1/lib64/lp64d/crtn.o
1. Running pass 'Function Pass Manager' on module 'ld-temp.o'.
2. Running pass 'Legalizer' on function '@main'
 #0 0x00005a56a3adf630 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x6a7630)
 #1 0x00005a56a3adca3f llvm::sys::RunSignalHandlers() (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x6a4a3f)
 #2 0x00005a56a3adcb95 SignalHandler(int) Signals.cpp:0:0
 #3 0x00007ef751842520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007ef7518969fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007ef7518969fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007ef7518969fc pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007ef751842476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007ef7518287f3 abort ./stdlib/abort.c:81:7
 #9 0x00005a56a399e63c llvm::UniqueStringSaver::save(llvm::StringRef) (.cold) StringSaver.cpp:0:0
#10 0x00005a56a4343f22 reportGISelDiagnostic(llvm::DiagnosticSeverity, llvm::MachineFunction&, llvm::TargetPassConfig const&, llvm::MachineOptimizationRemarkEmitter&, llvm::MachineOptimizationRemarkMissed&) Utils.cpp:0:0
#11 0x00005a56a4345ee0 llvm::reportGISelFailure(llvm::MachineFunction&, llvm::TargetPassConfig const&, llvm::MachineOptimizationRemarkEmitter&, char const*, llvm::StringRef, llvm::MachineInstr const&) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0xf0dee0)
#12 0x00005a56a42cb7fa llvm::Legalizer::runOnMachineFunction(llvm::MachineFunction&) (.part.0) Legalizer.cpp:0:0
#13 0x00005a56a4a02007 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#14 0x00005a56a6613fc6 llvm::FPPassManager::runOnFunction(llvm::Function&) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x31dbfc6)
#15 0x00005a56a6614219 llvm::FPPassManager::runOnModule(llvm::Module&) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x31dc219)
#16 0x00005a56a6614b85 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x31dcb85)
#17 0x00005a56a473ec2a codegen(llvm::lto::Config const&, llvm::TargetMachine*, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex const&) LTOBackend.cpp:0:0
#18 0x00005a56a47409d9 llvm::lto::backend(llvm::lto::Config const&, std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, unsigned int, llvm::Module&, llvm::ModuleSummaryIndex&) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x13089d9)
#19 0x00005a56a4731b0e llvm::lto::LTO::runRegularLTO(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x12f9b0e)
#20 0x00005a56a4732063 llvm::lto::LTO::run(std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>, std::function<llvm::Expected<std::function<llvm::Expected<std::unique_ptr<llvm::CachedFileStream, std::default_delete<llvm::CachedFileStream>>> (unsigned int, llvm::Twine const&)>> (unsigned int, llvm::StringRef, llvm::Twine const&)>) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x12fa063)
#21 0x00005a56a3cbff60 lld::elf::BitcodeCompiler::compile() (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x887f60)
#22 0x00005a56a3c16c27 void lld::elf::LinkerDriver::compileBitcodeFiles<llvm::object::ELFType<(llvm::endianness)1, true>>(bool) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x7dec27)
#23 0x00005a56a3c32161 void lld::elf::LinkerDriver::link<llvm::object::ELFType<(llvm::endianness)1, true>>(llvm::opt::InputArgList&) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x7fa161)
#24 0x00005a56a3c381c5 lld::elf::LinkerDriver::linkerMain(llvm::ArrayRef<char const*>) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x8001c5)
#25 0x00005a56a3c3953a lld::elf::link(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, bool, bool) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x80153a)
#26 0x00005a56a3b17a6e lld::unsafeLldMain(llvm::ArrayRef<char const*>, llvm::raw_ostream&, llvm::raw_ostream&, llvm::ArrayRef<lld::DriverDef>, bool) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x6dfa6e)
#27 0x00005a56a3a53aa6 lld_main(int, char**, llvm::ToolContext const&) (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x61baa6)
#28 0x00005a56a39a6ebb main (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x56eebb)
#29 0x00007ef751829d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#30 0x00007ef751829e40 call_init ./csu/../csu/libc-start.c:128:20
#31 0x00007ef751829e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#32 0x00005a56a3a53305 _start (/scratch/tc-testing/tc-apr-4/build-rv64gcv/build-llvm-linux/bin/ld.lld+0x61b305)
clang: error: unable to execute command: Aborted (core dumped)
clang: error: linker command failed due to signal (use -v to see invocation)
```

Godbolt: https://godbolt.org/z/s83eaxrW4
Works in LLVM 17.

Found via fuzzer

X86 also has an issue with these flags, filing that separately since it triggers a different assert/backtrace.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWl9T3DgS_zTmReUpW_7_wMMEmD2qyCYF7J-3KVlqe3RoJJ8kE8inv5JsZuxhwrKpwN5uXYqALUu_7v51q92SRYzhrQQ4DbIPQXZ-Qnq7Ufq0I1Zzehdqfq_MSa3Y4-ktGEuJgSBZBtF5EC2DPBp-6HDPpUVbwmWAywBXKCg-BMX5Qdfx1v_-QOid1YQeQRxvkwsU4JWhmli6CfDK0tCCsVy2ww3pdJgGeFX3XLBQ3-dpS-9390Lcb0PBZf_gmpxeKyqIbFHYtELVRITcgEBhw6Wxut-CtGHTS2q5kgaFjbAKhU1vIBQsSM6FYEgDW1AUKjTKWqjeDrp65CBZoi9ESz5czuWYvuuUtqhRGtkNoAAXmht6n6cBLhDRdMMtUNtrQNwgLqnadgIsoCD7EP42QQqykdWrq18_oovr60_XTlovSS0AWYUEtETwr4AGw7xBrkeAMxwky3WAyy7yLkrO0U_ry59vry9_vrk8Q1xazaXh1LkwjRyBCw2215IwpsGYAFcBPkMRCnDJJXpiy4EPnq8GzT5fXSxvLpDp6y23iKC6b5EGb75VaGNtZ5zT8SrAq5bbTV8vqNoGeOVEjn_CTqt_A7UBXnFjejABXiEimaNG9Aw8iVQTs0H1UyQtBvE3ltA7xPpttwutaIH8v89atZpsEdGt97gZiPmRQSbYwsVKGJpHo5WyQXL-YwUsFg5vAEfhV6RBaIXCcEPMJjT2UUCQnLeyR2EIm7DRZAvhhmkUbhGIJk-FjzsU_o7CjgMK2aMkW06dlDvQjg3Ba2_IIDgc4zQUXZ6yhVGL-GAO_GAGpwYGeNUbPejkpsrKKxHg1Q3VNl6otxU9ENFSGuDVEwu9vJPqixy5aWUf4FWcLqJFfERLqi3_OyhZQ8vlzUKh8OoNdB00_KZuP1DoIGnIxngVV-8q_A288z7aPTkpT99B3vsZdyRxvIN9KOxE33IZqs7l_i3tepePQYLm1EMe9AinL_fkPD7IFtvORQ6wMMU0SSs3R0VLKQpDYkIJwIANLWuDwlCqWTN9fef_4Vkw5CiQ7ObvkEvlQg1FR7xA17105SDqiDGu5FuNJRP67Bo-Ekla0K4AVBJtFeuFLwwFCy1su4UKcDHWNPg51tVY5z2NfyrH3LMgjYaKrBiGowAnEYoeoiiKMpLlJCGsyZMI-YorWQbJ0jya4eKz5tL6GurWl-e43HfS5MtaGauBbAOcu2KQS-trSVf1__gyKsAfooecFHkS7apLZ0t8YAslSXPMlute3vBWEvEvIpkAbZ5WJ2-qbkqSZqYuPlS3rjI0U8xX1J7JodksaOfK18j_3wElI1ABTZHFZYozHI3GDKH7UOZrV6pNYlXwmrqqLffa-SEz5dI5ZpVXDUXrdWc3Gghb33Eh1twtRlzBTHyEuUkjOysCvJp2W9AgWaZpkCyLfI-fvQZfWtCSiBeRizJIlvGEjfwY8nTYi3BldQBXHJKbFjlqjfeHRxouJ1mDQefWJZ0y3IWCJtyAx8ZFkCwnHJRzaFwWTYJI7VZEHsqywX2-adAudhbvEapZCFUV5AmdRPwvkv-nhxu3gGtvyD3ocSKQ-_kEHnpcQzPOggVVLmwrNBn6PPTcjJuljzRJkwbjcVX30-UNiHNOWqmM9cvHvcB98w3cg-b20WWN_fOPhG64hKfEOGaV_fNboluwLl2eKdnwFlEljX3WbYT51Fm-5V99lF7Dlui7iy231s2v1w74yI0B5vtX6BfLj01Fx0d8wEcGME2nE2ZWhItez_3wvmbTDdFPCMs5wiQgjgBfSmP1RPbbZs4mYgD75ORYnmXOFNO6aMhEzf07cCC9l5_kM2r_gPZhHnRE24XfFtlhHvd7MtOIRDiKim_Hs_PgRLejSr2ozRG843qlU73yPE4amk_0Wn12Q58qjj-t0Zv5PIlZ3dB85vTswJQUx9UrTPnoC6i5v8em9zCDYrfenJiRH5pRl9nEDAEtoY9jzbU36HLbiZ1Rf50xdZnNjClmYV8kQDFBVDFoYa6lsGq4eDFxDfltDO4xKRnLhof7jcWz_YiLhw6oBRYkZ7uOvX_rrTurZ13PCN0AW3HhXoi-VJ2AM2hIL-yagQALL49LLoYfx3Yv_VY5GyremS1fuIRpknSD8Bn69oiJJ5833_TbLdGPl5LBwyz1Xt1--kDoHUh2PAOUcxelUcWm02bnmHoAebXX_u-XZ355h0kYJ1FZsXlGqQ4mYVxHcMzDV7efdinkGtpeEO2acPnPcuUbOwA3VR3B1AE4OnAAjvLkjxzwj6P9ezLCP8HwPxr0jVL6L4pdEuXJLHbneya0bprcLVhGDkE0w8UHbt1r_UxtOy6e6is63L3D7klZFk0-WwPg-e4JjXOKC3SvODui_ZX_iHWu-f2B6qNZLhLMLEJU7T8zDgF5tbp97FwEzV6OIBknUg5fQGPnXat7GEMJl7VS4q1pKRhQXMxoSea0JDjO49fTIri8-8E8TLC6EehSdr1d6vaKv8sCsmhInMczltIDlsqYZq8mCPTH4UTD3rSl1uTRzfHkbL6qfvtJXUZRTGdVOc4OrKuyhByxzjv71VZMk9fzDd-Xng0z4envW7MRZwmZsTFbcCV1XJAc9mz00pAGrgT7cz79fjaOCtipM8TauWu8eC_OctaQfF7RFPOt6SwhJHecrcezPONbzvHil2kH20e3SokzJS082HfbJsrjmpDZjgEu57ujJIe69mdS3lSRLAeo65ki1cFGb8WqCK3Xgtd0bSzRdk2JEJ5cv_NLTf98P3ncsT42aLEJkmXmN8LzndTdp52dVEgj5Mdwye2hoOHSoYce3e83x9iB4v1ycveNZQY6M-WYFUfBk6Jyau-x8WHUJVGGBtS3Dp0k2qfQ3bEt0Frp-TEqeADaW1e4bbdEukmLlrXS1n8qLanS4I8YAXsBbTxSM0KghnABDLHeCxg_LLiS0gAK730bAOLyXlEybL9VLxyg-0mxWgn3oj08UjU8WCjtGPvqyCwTIA_6t3QY-ZvSdwZxifwRsvjpG-Pwe6V6ydA9J6jpv34FPX32e5kjIoxCG2IQkcifzEJfuN0guwEDqBGkNS5DNFxw2SK7IRYZ6IgmFsQjMlxSQNwiq3nbgjaIIMabBjRIi4gxoK3z2-5E1wk7TViVVOQETuMixnmcZGl-sjklWVFBw1iekIZGUNdN0UQkjQnJa0YicsJPcYTTKI1KHGdVlC9IFTdFVhdxFTOSlVmQRrAlXCz8QTel2xNvzmlZRllxIkgNwvhzkRj78MFBdn6iT32A1X1rgjQS3FizH2-5Ff4o5fXlzVn4a5Cdoz9zSG8gMsij7z6hGOTRSa_F6fcfsfPG_zcAAP__8NMhNQ">