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

    <tr>
        <th>Summary</th>
        <td>
            [Statepoint] Asserion failure with fast-isel and non-opts.
        </td>
    </tr>

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

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

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

<pre>
    # Description
Here is a modificated test from [llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll](https://github.com/llvm/llvm-project/blob/main/llvm/test/Transforms/CodeGenPrepare/X86/statepoint-relocate.ll). The modification replaces `ret i32 %ret` by the `ret i32 0`.
```llvm
target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

declare zeroext i1 @return_i1()

define i32 @test_sor_basic(i32 addrspace(1)* %base) gc "statepoint-example" {
entry:
       %tok = call token (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* elementtype(i1 ()) @return_i1, i32 0, i32 0, i32 0, i32 0) ["gc-live"(i32 addrspace(1)* %base)]
       %base-new = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %tok, i32 0, i32 0)
       %ret = load i32, i32 addrspace(1)* %base-new
       ret i32 0
}

declare token @llvm.experimental.gc.statepoint.p0f_i1f(i64, i32, i1 ()*, i32, i32, ...)
declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32)
```
During `llc` compilation with `--fast-isel=true -O0` we fall down by the assertion:
```bash
$> llc t.ll --fast-isel=true -O0 -o t.asm

llc: /root/llvm-project/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp:106: void llvm::StatepointLoweringState::clear(): Assertion `PendingGCRelocateCalls.empty() && "cleared before statepoint sequence completed"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /opt/compiler-explorer/clang-assertions-trunk/bin/llc -o /app/output.s -x86-asm-syntax=intel --fast-isel=true -O0 <source>
1.      Running pass 'Function Pass Manager' on module '<source>'.
2.      Running pass 'X86 DAG->DAG Instruction Selection' on function '@test_sor_basic'
 #0 0x00005559d32f011f PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x00005559d32edb4c SignalHandler(int) Signals.cpp:0:0
 #2 0x00007f11cca6a3c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x143c0)
 #3 0x00007f11cc53703b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4303b)
 #4 0x00007f11cc516859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #5 0x00007f11cc516729 (/lib/x86_64-linux-gnu/libc.so.6+0x22729)
 #6 0x00007f11cc528006 (/lib/x86_64-linux-gnu/libc.so.6+0x34006)
 #7 0x00005559d30f8e03 (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x30f8e03)
 #8 0x00005559d30ecb8d llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Instruction, true, false, void>, false, true>, bool&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x30ecb8d)
 #9 0x00005559d30edf73 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x30edf73)
#10 0x00005559d30efd92 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.1063) SelectionDAGISel.cpp:0:0
#11 0x00005559d1c2d7a5 (anonymous namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) X86ISelDAGToDAG.cpp:0:0
#12 0x00005559d25fee16 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x25fee16)
#13 0x00005559d2ac6146 llvm::FPPassManager::runOnFunction(llvm::Function&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x2ac6146)
#14 0x00005559d2ac6499 llvm::FPPassManager::runOnModule(llvm::Module&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x2ac6499)
#15 0x00005559d2ac6df9 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x2ac6df9)
#16 0x00005559d0ba85d6 compileModule(char**, llvm::LLVMContext&) llc.cpp:0:0
#17 0x00005559d0b00917 main (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0xb00917)
#18 0x00007f11cc5180b3 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x240b3)
#19 0x00005559d0b9ef9a _start (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0xb9ef9a)
Compiler returned: 139
```

# Explanation

Brief investigation shows that llvm does not actually visit `gc.relocate`, because `isFoldedOrDeadInstruction` for `load` and `gc.reloacte` returns `true` and these instructions are not lowered by FastISel.
https://github.com/llvm/llvm-project/blob/939c57097ecd7ba7760d5c011a5034df17b5a943/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp#L1496-L1505

At the same time `%base-new` has uses, so we will remember them and later fall by the assertion.
https://github.com/llvm/llvm-project/blob/3f8e4169c1c390fd086658c1e51983ee61bff9bc/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.h#L63-L70
https://github.com/llvm/llvm-project/blob/3f8e4169c1c390fd086658c1e51983ee61bff9bc/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp#L102-L107

# Possible solution

There is an obvious solution, described in the patch below. But we're not sure that such approach is proper: `gc.relocate` will lower to instructions that read pointers from stack and it might generate reduntant code in final assembler, we dont have an example though. The example from description section does not contain a redundant stack manipulation, even if `gc.relocate` has been processed.

```patch
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 2b63359c2b1b..39e8bf408688 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -1323,6 +1323,7 @@ static bool isFoldedOrDeadInstruction(const Instruction *I,
   return !I->mayWriteToMemory() && // Side-effecting instructions aren't folded.
          !I->isTerminator() &&     // Terminators aren't folded.
          !isa<DbgInfoIntrinsic>(I) && // Debug instructions aren't folded.
+         !isa<GCRelocateInst>(I) &&   // gc.relocate instructions are't folded.
          !I->isEHPad() &&             // EH pad instructions aren't folded.
          !FuncInfo.isExportedInst(I); // Exported instrs must be computed.
 }
 ```

We appreciate if you have any ideas for a propper fix such problem.  CC @preames 

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNWVlz2zgS_jXyC4osHuL14AdfSVzlbFwT186-uUASlLAhCS5B2tb--v0aoA5Kzo4zdu1OypEoEOz-0Hc3c1VuzhdByK6FLnrZDVK1C-964V18Eb1gUjPOGlXKShZ8ECUbhB5Y1auGLaLLun5qFsEnWsPXQ89bXam-0fhxpUrxWbT3veh4L7DwjzTGpx5ApVOyHZxe1IpounW9iK4XQboehk4vwgtsw99KDusxdwtFHCZG9OV0vfqnKIhhXqscXw2X7X7P-8EEmcse1mJ_bIiE4dGaF0KzRez1YmAyDNgiiHCJBZZv2IAnDu55uHatIHFl_wxCszTwfoWNJR94zTdqHNgivAa9QDgyXkIG8dKpUg8XfpA6bUoXMT7CwN77jmXsnhEboL1abAm9pPEjNnaFU8t2fHFW7bh7wH6WoqghDfZv0SvxAtQ-WywJ_9i3j9JfEIds_kAlW2FPvvRIzo9a9Y8517LAblrnZdnrDnLCb58eDy5IStiClYytCoJ2IHbxwhuAxiJbJJeWjWiHfkNmYH4x-w9EBvXDHK7gdc3wQ7SMuEJcwRWBMl8-m3AHF4fL9st1XUIB8KQJV7x0opcN-PHaXRXuHpfbeRVEUFn60KWlMV0c8GCiFkRg2HR05INb2ZEwDwn87CIjn4IsVqS0J5LKm8RK3nMkK7rjtOJ5L7CfkvmJMHYO0flGeulW4qSHV8EfYyBPIPa14uWBIv7bYQjyjMzem6wdJtevWfAE7RfV-otmM2f5MeI85pUdBQz783rsZbtiJoAUFG0QEztZ27j0jDBJtxyn4npwpBY1hD70o2DON6LBngWryAJK9dxuAxXXWvQm1G_9bMcTelhPSwEi0Q0DUzYgLrLXWTBH4TbXzaFmCGhIav3UKzWcRu5tPJf5Pjrj6jvcqSBY1xef6edOc3fqWZAQ3KLrKBZ6FAzZk5IlM6RwivDidLtZsTeLWvB-UjIevdgKgGR3L9oSuz9f_TZp6Qry0q5oumFjH8FJkDBiil6GEBJhLpBdBNtbF9PiX6NoC2H0UwtkS-PBCcQva1FO2eD-7ubi-w3TY97IAck1H1eUXFSPCK7YL-dAqfUoKMcx3sLN2qIeS2F0XPTQJMt58WPoYaQTe4ik-MHKsel2qqc8ld33atXzhiGXjGS2etKf6oiLtTjRI2B3NY7d01rN25WzsyTtwCLaH5SWp3RckGngikNnIDQO3Ti4mjlITXiscfQG3vECU4LwxE_NaxFeaTX28LLwxuL1Ce9vY9uSV3QAACbJp7E1lsPuaeErb_mKUCYMS0jkI2XGIJkRC5JJJsFrBFEiMJihg534YretBiTLYmemE_1qy5s4nGbGZAppqLI85r14-BdFUVaGQeX5fsXuYaqD0csDKeq7XLW8_gJ11nSClKzcxKWM2Vt68gLP_N_R9ue0RZkvC3ZMDJz-kFAwEUoq3y8KHvOw8NjjY49jQfWPMFTjFJP3ToXGQZVBN7ph3Qteulq5yA2X3ou_BJV9lgCbcMYmChMvzFnPof830C-IcmwoL0M8OKO8nFP24zTKGM_Vm5AfUA4CPDijHB1TTkxs-CWaSTCnGc9pBqnnxb9GM1zikRnNZGYLXpUKL5xovsehLTdLbsYvnfMTRZ7OIvNBXL_9Tv69X70kJ7lE3AWndP-IrCW8SA6i57A6-O3xrVIMCKt2pUUGeVSmd9GzrQdeS0mWggp9Ix9qc2F8i0LBwZrZZNf-YnBypWqTiLKP06VR1UyX2ZEuyyoJ36hL5P29OvVMn7v4XADN8OGnIJD7-gnB0Ds6RVVmwR-eAtS_tV95sUafswU8O8XJve0xXDSWg4u6JDTh9Yj6aZwliLOA7RdBmfCIaPFWtZtGjZq1vBFThZlZAMhKoPmgPgI2aBGNLb3XQQaHIIOoEsKP2U8pU_I9wPQqmFPhfYQNTNBmNhDOsPMi9peH2D_dE9xtqfD_QW1BzVAvj1Evs-wNqL-aImeu9mnpoxED0AxxdIy4rA4R12LFi429PsB-iyJ5h_9_ghuwZrjjQ9xofNKojKfmSuzEWaypb7iYOsM9yLu7v3-9UqhcX7bRDKxe96FkzsfzMizR1OqjDmdJzs6WHlUqqZeHKOKocHhEz9IPjwcA3lq7LEFkxiWbnywTVcaZpf9hZzNEd1yvJkrMzlbQY6FP8cPXO-cdUHYDvjC7_XTTfl72UlTomp5Q28qV7aj1Wj1rdFB8MNpG3ywQiRV6tWIY0Rhu2JPUaN3A5aCxJ56UokXBR20mgVJ_UnUpym_9NSrhw9SPphy9o2noFS_pJ_Vue3pgRPSmI5qRo6kCpo1o7sBB7glqRiMJglhT40vN6YZ9QjNlco896Z8drmZhVkSJlyWiKJOcJ0nslVGBvoVHXrgsKz_JI54tw7c39a_lxiC885dZ7Nz5kRcdKuhiML2sRiJkg2yMYA-HRRDJmmsGkWsSv1Y07niWdQ3hNaLJYSh4vjFyq6Gm3s5Cjscg7xRSiIp46cdZ4Rdh5lWll8ZxlBa-iPwsDYWI_byqsrx4z-RjTUKKQ-cu8f76YLc69QKo1EuOvfFeaS1ztORa1eOxTz6sty8eWqbyJ0mF0G4fdFyaFxW5oGmH0WLHh2INz4Pxu-xyHGACaLonj9AjDQjJmfWIXbyDPFCzEH1cdSaFnrqyNSHjTTSVmfmaIUbNLTNnFr2270O0mayYKczAGrlaD2wlWmoYBLaXYzvwdkB6Kcl3WSXRgBsDbHLTml-R5ZZIKDDoJ0GHn4bjYKjG1dq-k9iuGY7l_pUN01Yj-2iFOnugCM8t85KYW4gNb2U32vkh8RVPomWyekUK5Fq5wF2IqhDAuh1iHUVbo4FpQCqrijnOimZb74oJLH9fSDFoZFuKFxbkcRhGWRHkfu66YSbSvFrC7NOU-eicl0u72XGcd2LeWvil_fuQIyyWHv6Y44cBguwVjQYup-uETTdpCCkL0x-yn6cd1DLUe81GWShrbkFpN3S3KQfL_i1Nvhq--b1H1_ugvopG9SfTUIo87LsshSOqig7Qrk4SE03JBiQ8AuXOpvvmPYFlJPWD6Bv4BHXXMyZ2l2G03_ImwlJzdN_X-eq2rdRtOyAy0TyOeun09vQY14JGsW9AT5o9YbMfHpN4T5nsDnHgYifM3iapmy_3qBpOhLTfaPjcfEFgLH9ZG9TnkLxc8HmhqbQwNjSdZhFe7uhPdy0HzZoRppXb4fc47Inv3tmwV4uz34WJyaKQRiAV26hxGwE3DJaFEETFEjfhuqMELl9sLMcCQmfjMnZ1RZ4AKtQvM0v4rDwPS1Qv_GyQQy3OF9HlPlEtomv7CoB8gMbzlCXMq5TdDNpEcnTiDipY7Z6NfX3-54fzUexH6dn6PAniUsRlGKV-yfMizONomSQBD32vzEXon9UceUyf2_eA9ALPkKD3CNH1mTwPvCDw4iDwvTCLYrcoSxRmNDoIPAQ0igUCZX3tmndQql-d9ecGEixb06spqXGW3U1kH7lqhZEN0ecjUk1__jdRrEt-ZjifG-T_AZmj3Kw">