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

    <tr>
        <th>Summary</th>
        <td>
            [RISCV] Cannot scavenge register without an emergency spill slot
        </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

For both RISCV32 and RISCV64, some specific value / range for the index argument of the `getelementptr` instruction may lead to crash with "Error while trying to spill X__ from class GPR: Cannot scavenge register without an emergency spill slot" when interacting with other instructions.

## Reproduction 1

In the following minimal case, the crash only seems to occur when the index argument for `getelementptr` is exactly 127.

https://godbolt.org/z/seaPGnsY6

### Code

```ll
define void @f() {
BB:
  %A = alloca <16 x i8>
  %A1 = alloca <16 x i1>
  %L = load <16 x i1>, <16 x i1>* %A1
  %G = getelementptr <16 x i8>, <16 x i8>* %A, i32 127
  %S = select <16 x i1> %L, <16 x i8> zeroinitializer, <16 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
  store <16 x i8> %S, <16 x i8>* %G
  ret void
}
```

### Stack Trace

```
LLVM ERROR: Error while trying to spill X15 from class GPR: Cannot scavenge register without an emergency spill slot!
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=riscv64 crash-reports/riscv64/4.1.ll
1.      Running pass 'Function Pass Manager' on module 'crash-reports/riscv64/4.1.ll'.
2.      Running pass 'Prologue/Epilogue Insertion & Frame Finalization' on function '@f'
 #0 0x0000000003adad2a llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:11
 #1 0x0000000003adaedb PrintStackTraceSignalHandler(void*) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:636:1
 #2 0x0000000003ad9526 llvm::sys::RunSignalHandlers() /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Signals.cpp:103:5
 #3 0x0000000003adb605 SignalHandler(int) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
 #4 0x00007f7ed328c980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
 #5 0x00007f7ed217ce87 raise /build/glibc-uZu3wS/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
 #6 0x00007f7ed217e7f1 abort /build/glibc-uZu3wS/glibc-2.27/stdlib/abort.c:81:0
 #7 0x0000000003a014b4 llvm::report_fatal_error(llvm::Twine const&, bool) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/ErrorHandling.cpp:125:5
 #8 0x0000000002b27da9 llvm::RegScavenger::spill(llvm::Register, llvm::TargetRegisterClass const&, int, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:0:7
 #9 0x0000000002b28cf8 llvm::RegScavenger::scavengeRegisterBackwards(llvm::TargetRegisterClass const&, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, bool, int, bool) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:617:18
#10 0x0000000002b2a235 scavengeVReg(llvm::MachineRegisterInfo&, llvm::RegScavenger&, llvm::Register, bool) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:673:22
#11 0x0000000002b2981d scavengeFrameVirtualRegsInBlock(llvm::MachineRegisterInfo&, llvm::RegScavenger&, llvm::MachineBasicBlock&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:713:25
#12 0x0000000002b2955f llvm::scavengeFrameVirtualRegs(llvm::MachineFunction&, llvm::RegScavenger&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:773:10
#13 0x0000000002a42c65 (anonymous namespace)::PEI::runOnMachineFunction(llvm::MachineFunction&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/PrologEpilogInserter.cpp:273:27
#14 0x0000000002894c85 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:91:8
#15 0x0000000002f797d6 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1430:23
#16 0x0000000002f7e602 llvm::FPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1476:16
#17 0x0000000002f7a0a9 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1545:23
#18 0x0000000002f79c1d llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:535:16
#19 0x0000000002f7e8e1 llvm::legacy::PassManager::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1672:3
#20 0x0000000000d2cdbc compileModule(char**, llvm::LLVMContext&) /home/henry/aflplusplus-isel/llvm-project/llvm/tools/llc/llc.cpp:737:41
#21 0x0000000000d2b162 main /home/henry/aflplusplus-isel/llvm-project/llvm/tools/llc/llc.cpp:418:13
#22 0x00007f7ed215fc87 __libc_start_main /build/glibc-uZu3wS/glibc-2.27/csu/../csu/libc-start.c:344:0
#23 0x0000000000d2a96a _start (./llvm-project/build-debug/bin/llc+0xd2a96a)
```

## Reproduction 2

In the following case, the crashes occur when the index arguments for the two `getelementptr` are greater than some thresholds.

https://godbolt.org/z/j6fK5K5G9

### Code

```ll
define void @f() {
BB:
  %A = alloca <32 x double>
  %A1 = alloca i64
  %G4 = getelementptr i64, i64* %A1, i32 255    ; crashes when index >= 255
  %G6 = getelementptr i64, i64* %G4, i8 194     ; crashes when index >= 194
  %L = load i64, i64* %G4
  %I = insertelement <32 x double> zeroinitializer, double 0.5, i64 %L
  store i64 %L, i64* %G6
  store <32 x double> %I, <32 x double>* %A
  ret void
}
```

### Stack Trace

```
LLVM ERROR: Error while trying to spill X17 from class GPR: Cannot scavenge register without an emergency spill slot!
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=riscv64 crash-reports/riscv64/4.2.ll
1.      Running pass 'Function Pass Manager' on module 'crash-reports/riscv64/4.2.ll'.
2.      Running pass 'Prologue/Epilogue Insertion & Frame Finalization' on function '@f'
 #0 0x0000000003adad2a llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:11
 #1 0x0000000003adaedb PrintStackTraceSignalHandler(void*) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:636:1
 #2 0x0000000003ad9526 llvm::sys::RunSignalHandlers() /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Signals.cpp:103:5
 #3 0x0000000003adb605 SignalHandler(int) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
 #4 0x00007f321f5d1980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
 #5 0x00007f321e4c1e87 raise /build/glibc-uZu3wS/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
 #6 0x00007f321e4c37f1 abort /build/glibc-uZu3wS/glibc-2.27/stdlib/abort.c:81:0
 #7 0x0000000003a014b4 llvm::report_fatal_error(llvm::Twine const&, bool) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/ErrorHandling.cpp:125:5
 #8 0x0000000002b27da9 llvm::RegScavenger::spill(llvm::Register, llvm::TargetRegisterClass const&, int, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:0:7
 #9 0x0000000002b28cf8 llvm::RegScavenger::scavengeRegisterBackwards(llvm::TargetRegisterClass const&, llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>, bool, int, bool) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:617:18
#10 0x0000000002b2a235 scavengeVReg(llvm::MachineRegisterInfo&, llvm::RegScavenger&, llvm::Register, bool) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:673:22
#11 0x0000000002b2981d scavengeFrameVirtualRegsInBlock(llvm::MachineRegisterInfo&, llvm::RegScavenger&, llvm::MachineBasicBlock&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:713:25
#12 0x0000000002b2955f llvm::scavengeFrameVirtualRegs(llvm::MachineFunction&, llvm::RegScavenger&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/RegisterScavenging.cpp:773:10
#13 0x0000000002a42c65 (anonymous namespace)::PEI::runOnMachineFunction(llvm::MachineFunction&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/PrologEpilogInserter.cpp:273:27
#14 0x0000000002894c85 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:91:8
#15 0x0000000002f797d6 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1430:23
#16 0x0000000002f7e602 llvm::FPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1476:16
#17 0x0000000002f7a0a9 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1545:23
#18 0x0000000002f79c1d llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:535:16
#19 0x0000000002f7e8e1 llvm::legacy::PassManager::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1672:3
#20 0x0000000000d2cdbc compileModule(char**, llvm::LLVMContext&) /home/henry/aflplusplus-isel/llvm-project/llvm/tools/llc/llc.cpp:737:41
#21 0x0000000000d2b162 main /home/henry/aflplusplus-isel/llvm-project/llvm/tools/llc/llc.cpp:418:13
#22 0x00007f321e4a4c87 __libc_start_main /build/glibc-uZu3wS/glibc-2.27/csu/../csu/libc-start.c:344:0
#23 0x0000000000d2a96a _start (./llvm-project/build-debug/bin/llc+0xd2a96a)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztW1tv47YS_jXKCxFDou4Pfohzq9EsGiQ9i9O-GJRE2Wxp0hClxNlf3yElWRe7SU6Pk10UDhJbF2rm-2aGw6EGSWT2MrWwC7_oiqq0YJuSSWHZV5Z9UX_eyAIlslyhh_nj5VcXIyKy-jjwLHyJlFxTpDY0ZTlL0RPhFUUWvkEFEUuKcni6XFHEREa3iBTLak1FiWRurlqBvaQl5VRf3JQFnMNIVRZVqmGgNXlBnJIMlRKlBVEr9MwAiYXxdVGA5OcV4xSVxQsTSz1GbRjn6L-LBcoLuUYpJ0qh2_sHy71Al0QIWSKVkieqkRV0yVRJCyNSViXwQoCjWFKRvjSSFJclKAM9VAAwGE0AGOgyMMAo8HgPr5r0DdeY9YFuCpk1hJz-gLkwRsgl5_JZS10zwdaEo5Qoqk2r79a0peCAidK10jRlmlZFDeqAbbXJDxpWIboF_CDJweEA6qosNwqMBH6D36XMEsnLiSyWcPYN_hQl97dC_Rbs89MUL2VGB3cCu_7lvL6Q0ZwJip4ky5Dl2bmFIwvHyApn9f3ZTCs3hwi8618gy71CBOySEji8dAK0RSyy3Ov-IOfgKGc46s4M4hKCaDgE7Du6cFFL7T18ax4eWHIEpy8l6knRNxhMFrB0T96jkadAWloOtRuoe9LQN1pICIqSEc7geH8AnLEIwkqr-x7fna1VKQs6RgeU_85Et-2DBS1NZDSxE16NguhwzD2WJP0T_QoT8nDo1ad3d1-_oOuHh19MCng1aTj-UZNGE0b3d9cXj9dIVcmawWiUVEsQspFFqVWP5h3IrJJJKtdwwvlT-3UOCeQPiBg4ZUpVVOn0qrMwEymvMtrLEwkYpdQ2aaZ3baWsWm92E8yGW_F9IZcFWe-ShgaBJvv6korx7DyjAFufMWGGpOh8XcJSwSmEc8FU-hR4NYDzmptG2FyHI2_iTNpM4GjtD5UQ2vgbbWkLhzeVqNPjvb7whQiy1LEeIr0EQO7kekUJ31SwS2r4kBKgzOWygsR6cw1-0odoLhQtjGYLB-gGLELRDRN6shGzDtYY8hYfnNfpq53UEIk2srd2--OSjGSYIOM9sLh7oV5UfXBfwAJi_FEHLY66QQV5XkhYRigBnwdmconSZEh8s4L1VX9RUbzAN8n5hldK_50zyCT7PmsjhyXw-VhttL3g6D-CbfUFtgR-agKxA4r9IIZPx-noOGM6NEvQCHst4ycIQa79FJnZiy8-A3DgBhpwhxeP8MY-ePKA-SEcBrBVuwYdD3CLNN3o2ebYrjZwh9QdIU0C20djU36S3z07HJrRa8CFeUgzF0dpHNlosSioSesLSFfGXo30bRQsAu-cM1Ftz5eiqm9syhVEcDZRcmJbeGZvHQxSgE6nxu-rwU6Y0iiEShEIoTbb6EQIwtLz6vfKfX7cneIJzDooRQwPOJjodAXuzehGZ4OqpgkXngwaQKZzhBY9MZEOa9WF3SEJRkhomDuIJNIwfR-SMqutYZ4ySqKRknDoctvxEq8XnHUuW-SkJHxB9eI0yAq_PuuiKYW6smyyQiIlP3J4mDXRxB8kyzZ0sT8M3ajPAyc4zEjc4_FAl4_NClk0006vhAMyD83KqWn0KMICRMv23qVZevuEzXToP_CFpCuwylwX3bNKz5q5rsohSKHGODxMC8gh9GlTrx1RWHAUZ-jy-ZbqpbU1RGPNziM2_PXWnHjkjyjNo9f90Zy2CmaQyp9JkalhwL3hjaO6oY7lnYuPFtrvsGbgmOwX7WpKxx4ZlOhU1RrtKwga2Kmh1cqfi1zuWWjggwM3d5PhU4mHek3CuCPujIjHkZPtiJuC6CsryopwkKnmYgZ7rT-Pa4tGwIwoljbiP21ahY6xh9_ZA4_t4ft5v5z4G8scMklb1b5tjk8ia5zv2B3ZQUWCiYfTwNfrPBFSvKxlpZAAmmpjytW4KWOv583iVYlfxB7VN8xwVKZ1RV8X83UlT4uGK64DPey4egOuUeylkb8fhS1YvRHp0TzI7-OIHQDT8Ip1gdHLW_6AVR7GYdavfm_u9bPthuqT-cwf4OOOLkn60kPRlhieq9c02MvvuAQjLjSw8Tu4fDEbxGHkNZc-hUdoNiRBxyMc8SA2id-aVV9-THK-54-cFI0DLoX1ogPHjaQmU3Ty5usN37H6Xmx81x95Kh5HXESdt8l8dyJOEGL46ryCB-WLneE0S1Ko3NaQGukuhNIVKcwu_WK4HOl3ZJdSlHRb_v_wS6hmlDlN68928XF1yeU5HWZnhDlxAozWhImPUO9BsQeG65kMD_d_fp7CTnSx0Bu8hSoJbMtaLO_ZC6ZK74HNlrQ-NDeNHLMxdD2v2xlq9e6IPYkDgmrFOle8_1Wc2WjXz-922q-8Oh22I3B_wF47Yq8NQdXrrQe1a_eUz_JgD4IUFC0LSvQr1HJFRN090u8N1EryTP1PXYk_gvxn_2f_Nt6n-SldCRejLcpklXD6WmeCBV6_peAd6CmwupVmvtouRNNAwL6P4MdyZzsfNN0obXmtF6TBoL6K4D0qbr32JX7sobdVwKjDXZVDgruBczOQ1dVZjWbfdIfaHPVNZE_8RnrdIRk0G3ZXh_qDvZbESJ3G1bQlRj5suzc_WGsiPLUmPqo1gT-6NYFPrYlTa-LUmjhGawKKxtzPnI9uTYAa6qXOD9CaqJG4p9bEqTVxak2cWhOn1sSpNdGzx6k1cWpNnFoTp9bEqTVxak2cWhP_xtaE2f8R79_YmjijUycIPIj0MI7PsqmbxW5MzkpWcjq1_Jn5DxPLv_rH7znPqoJP__lbTD-ycXi2mkZ5FnjUzgNwAw2z2I7z3M9wFIZpGkENdsZJQrnSkAHtGZtiG2M7xiF2bSA38QOaY9tL8jiO8whWFs-m4D4-0Yp1M-OsmBoMYDwFNzmQU91NmGFsKSht5ZMKSBfTn8i3F8C6OjN4pwbsX8jy-vQ">