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

    <tr>
        <th>Summary</th>
        <td>
            Statepoint relocations fail on AArch64
        </td>
    </tr>

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

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

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

<pre>
    A simple program with statepoint relocations fails on AArch64 systems including Linux and M1-based Mac OS.

```llvm
target datalayout = "e-p0:64:64-p1:64:64"

%ref = type ptr addrspace(1)
 
define i32 @test(%ref %y) "frame-pointer"="non-leaf" uwtable gc "statepoint-example" personality ptr @foo  {
    %z = addrspacecast %ref %y to ptr
    %q = load i32, ptr %z
    %x = mul nsw i32 %q, 123
    %res = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.0(i64 123, i32 0, ptr elementtype(i32 (i32, %ref)) @process, i32 2, i32 1, i32 %x, %ref %y, i64 0, i64 0) [ "gc-live"(%ref %y) ] to label %ok unwind label %oops
ok:
 %ignored = call %ref @llvm.experimental.gc.relocate(token %res, i32 0, i32 0)
    ret i32 1
oops:
    %foo = landingpad token cleanup
 ret i32 0
}

declare token @llvm.experimental.gc.statepoint.0(i64, i32, ptr, i32, i32, ...)

declare %ref @llvm.experimental.gc.relocate(token, i32, i32)

define i32 @process(i32 %x, %ref %q) "frame-pointer"="non-leaf" uwtable personality ptr @foo {
    ret i32 %x
}

define void @foo() "frame-pointer"="non-leaf"  {
    ret void
}
```

The reported error is:

```text
LLVM ERROR: Cannot select: 0x56149f965260: ch,glue = gc_transition.end 0x56149f9651f0, 0x56149f9651f0:1
  0x56149f9651f0: ch,glue = STATEPOINT<Mem:(volatile load store (s64) on %stack.0)> TargetConstant:i64<123>, TargetConstant:i32<0>, TargetConstant:i32<2>, TargetGlobalAddress:i64<ptr @process> 0, Register:i32 $w0, Register:i64 $x1, TargetConstant:i64<2>, TargetConstant:i64<0>, TargetConstant:i64<2>, TargetConstant:i64<1>, TargetConstant:i64<2>, TargetConstant:i64<0>, TargetConstant:i64<2>, TargetConstant:i64<1>, TargetFrameIndex:i64<0>, TargetConstant:i64<2>, TargetConstant:i64<0>, TargetConstant:i64<2>, TargetConstant:i64<1>, TargetConstant:i64<0>, TargetConstant:i64<0>, RegisterMask:Untyped, 0x56149f965030, 0x56149f965030:1
    0x56149f9650a0: i64 = TargetConstant<123>
 0x56149f965110: i32 = TargetConstant<0>
    0x56149f965180: i32 = TargetConstant<2>
    0x56149f964d90: i64 = TargetGlobalAddress<ptr @process> 0
    0x56149f964bd0: i32 = Register $w0
    0x56149f964cb0: i64 = Register $x1
    0x56149f964770: i64 = TargetConstant<2>
 0x56149f9647e0: i64 = TargetConstant<0>
    0x56149f964770: i64 = TargetConstant<2>
    0x56149f964850: i64 = TargetConstant<1>
 0x56149f964770: i64 = TargetConstant<2>
    0x56149f9647e0: i64 = TargetConstant<0>
    0x56149f964770: i64 = TargetConstant<2>
 0x56149f964850: i64 = TargetConstant<1>
    0x56149f964930: i64 = TargetFrameIndex<0>
    0x56149f964770: i64 = TargetConstant<2>
 0x56149f9647e0: i64 = TargetConstant<0>
    0x56149f964770: i64 = TargetConstant<2>
    0x56149f964850: i64 = TargetConstant<1>
 0x56149f9647e0: i64 = TargetConstant<0>
    0x56149f9647e0: i64 = TargetConstant<0>
    0x56149f964e00: Untyped = RegisterMask
 0x56149f965030: ch,glue = gc_transition.start 0x56149f964d20, 0x56149f964d20:1
      0x56149f964d20: ch,glue = CopyToReg 0x56149f964c40, Register:i64 $x1, 0x56149f964460, 0x56149f964c40:1
        0x56149f964cb0: i64 = Register $x1
        0x56149f964460: i64,ch = CopyFromReg 0x56149f8e58a0, Register:i64 %1
          0x56149f9643f0: i64 = Register %1
        0x56149f964c40: ch,glue = CopyToReg 0x56149f964a80, Register:i32 $w0, 0x56149f964690
          0x56149f964bd0: i32 = Register $w0
          0x56149f964690: i32 = mul nsw 0x56149f9645b0, Constant:i32<123>
            0x56149f9645b0: i32,ch = load<(load (s32) from %ir.z)> 0x56149f8e58a0, 0x56149f964460, undef:i64
 0x56149f964460: i64,ch = CopyFromReg 0x56149f8e58a0, Register:i64 %1
 0x56149f9643f0: i64 = Register %1
              0x56149f964540: i64 = undef
            0x56149f964620: i32 = Constant<123>
In function: test
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-trunk/bin/llc -o /app/output.s --mtriple=aarch64-linux <source>
1.      Running pass 'Function Pass Manager' on module '<source>'.
2.      Running pass 'AArch64 Instruction Selection' on function '@test'
 #0 0x000056149a2e2acf llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-trunk/bin/llc+0x32d3acf)
 #1 0x000056149a2e0544 SignalHandler(int) Signals.cpp:0:0
 #2 0x00007ff5f59a2420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #3 0x00007ff5f546f00b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
 #4 0x00007ff5f544e859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #5 0x0000561497939c3a llvm::UniqueStringSaver::save(llvm::StringRef) (.cold) StringSaver.cpp:0:0
 #6 0x000056149a0cf4d0 llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) (/opt/compiler-explorer/clang-trunk/bin/llc+0x30c04d0)
 #7 0x000056149a0d4812 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/opt/compiler-explorer/clang-trunk/bin/llc+0x30c5812)
 #8 0x0000561497c51a3d (anonymous namespace)::AArch64DAGToDAGISel::Select(llvm::SDNode*) AArch64ISelDAGToDAG.cpp:0:0
 #9 0x000056149a0cd587 llvm::SelectionDAGISel::DoInstructionSelection() (/opt/compiler-explorer/clang-trunk/bin/llc+0x30be587)
#10 0x000056149a0d8fc9 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/opt/compiler-explorer/clang-trunk/bin/llc+0x30c9fc9)
#11 0x000056149a0dbd4e llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x30ccd4e)
#12 0x000056149a0de43f llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.0) SelectionDAGISel.cpp:0:0
#13 0x00005614995d5a00 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#14 0x0000561499ac9440 llvm::FPPassManager::runOnFunction(llvm::Function&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x2aba440)
#15 0x0000561499ac95b9 llvm::FPPassManager::runOnModule(llvm::Module&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x2aba5b9)
#16 0x0000561499aca1a0 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/opt/compiler-explorer/clang-trunk/bin/llc+0x2abb1a0)
#17 0x0000561497a09773 compileModule(char**, llvm::LLVMContext&) llc.cpp:0:0
#18 0x0000561497945a7a main (/opt/compiler-explorer/clang-trunk/bin/llc+0x936a7a)
#19 0x00007ff5f5450083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#20 0x0000561497a013be _start (/opt/compiler-explorer/clang-trunk/bin/llc+0x9f23be)
Compiler returned: 139
```

I take it to mean that statepoint is not supported on AArch64. Unfortunately this is a deal-breaker for my project.

Here is a link to [reproduce the problem in Compiler Explorer](https://godbolt.org/z/8K7zbGTa5).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWlFv2zgS_jXKC2GDIiVZesiDY8fd4pptkWQXuKeAImlbF4pUSSqx--sPpCRbkp00TbMHHNAmDsWZ-TjzzZBDmRhTbCTnl0F8FcTLC1LbrdKXrBRC7dlFrtj-cg5MUVaCg0qrjSYleC7sFhhLLK9UIS3QXChKbKGkAWtSCAOUBPO5ptskAmZvLC8NKCQVNSvkBnwpZL0DRDJwE05yYjgDN4SCr3fTAC4DOG9_JrD5J8RT2QxZojfcAkYsEWSvagsCvAQBQnxSwQDPk8j_mFTh8Y8AoYFWFGu-9nJ2X3FQWQ0IY9pUhPIApWGAsmYmaH4xvi4kBwVGIIig5cYGKO20oHgfoMwhWGtS8ol3B9fOJl4GCEklJ4KTdYAQqJ8tyQUHG-rmH7034TvivOvmVFwbJYko7N4jCyK4VgqAYHbVggLAWf3hF3DATYmxoIcJWOXEByLfvYhQhLm1BGjRGEDxj8G0nZ9W1gJI89ysGsXf3fQQ4cFMzY2fW8gn9ciBVY9cggClhfP5omek91f7azqderdFPrZTvqu4LkouLRHTDZ0efTOFjUJvvJEHsMPOBXcyLoxuloeathYaZ7hYNnYqrSg3ptPRgQFh98Et_SjYRnYBnG3Y-5CBIL5y8dvQiSieXNDO0CFeuggIknPhBtUjqOVzIVlvSFWm8aZ6DPC8YxyKi41UmjPvWUqEOAB6wVdt6jkPdBFwkRk4q_2QHcOnuW2X32BwaA4omvA63nnGEOmStiKsDTEVnMi6aid3mmCbXrNlP9sYp4LoAzneHO-3EeicpV9011j1SGc_9Q8USs_z5fsvV4IXsn2Q7J1_vb3zLvYgn1TBWgWekG-EcmrMKRob6ipx3-79lgPNK6UtZ4BrrTQojiQaCVq-s83Qly9_34Dr29uvtwGegwWRUllguODUugG4i5MwytZZEqPElXRAtwFabETNPRs39MFqIk3hNpspl6wvEa493UcjeB52Kzx5MtJ-dz-_v_729fOf9wFe3PDSLQelT0oQWwjeFE9jladZahxNM7fTBSg2ltDHqU8yfA3u_T61UNJYIt26HKXxwhUxfO0gnk7AKMAL-PpjNHj8SaiciDlj2rGys9HyqCMrvm5KwC3fFMaRwOsCAYqeT8aTyI3vwvMIvHb0IkD_-GX8b5EOf0v6I22vXN58lozvPkj9P-qYnyjvHnehviHGbTl_SbdxslHCQDxOITfSS6FBEkHik8gzBy9PAHSEb0T7yRc2co6J5-TgUWpoMExfF0QvCEYsO4N0lEFnc-ecspwNUHSObbPqnATNB-b7Eruzro1ms9ddi845Nprx16VecuyvmBsKpvFPKHAe53vN_S8W-L7VDc1l-Ixgv6x8NNL_m8i_G-d7BTn0gm29G-SfL4Un1ampeK8ePIwl2g7qCxrVTT8yqJvg9OnIxkJV-3t1yzeD0hG9ulH3ZkbJGIOTHWF4T1kaSUVJJxWgBd0eoK-0KvvgUx6n5Dz4eKR9oB-vX0I1FjtZ6lscStJXT0S9mUkGX4H5xl3gRC7JBnJdq92bEeceycn5b7CdgrPK47xTfoyNO7YGeBGg1B9g3dHVtzpgrVXpe049_dGeXE9jd0qwWjK-bo8XJ_n9keR4FydOXRINRBv0r_kwQYMAvXCe-SzBupbUlQM3218M-QffvlzP766BqfOysICAvN60jRKwCmytbXpttArQalPYbZ1PqSoDtPL3XM2vSaXVf1xLhFaFMbXr51f-wqy5ROPAbjmgmpgtyAl9tJpQ3l6e3blOBLC6rA7NGJwGMPvW3t0RvaldP-xAgACtVOWsUFVWheB6wneVUNp1iysqiNxMrK7lY4BWeSE9OAomysmRqnLSta1qOzVgMimtLirBA7wkxN_8TYS_5wvwwqhaU35wXejw3NZSFnIDKmIMCNBs1ToTfHMDN0SSjUMxcw1WqVgtXNM1GyhDs3bN6JzC7v7xszRW143uO99oupA1irsIetXd7d7scBuDIYA7CCH03CCII0LXwMcJzwM8N3vTfPimC2m95-91c494nKTJ84MyVnNSBijxNw3SNg16-h7_B-gK7jBimNB177IS4XAEFsZRBO6KjSTiDyKZcErT1nYzbKa0cjSB_v9BEWoVzdbreB1nBEUIgocHzX3v-6BtC10UeYBWuzR56II92ci6eVDZreaETY1yXfEV3IVRhOAALx6YiZI1hDnQpDD8Dfqp05x4zRGGMB9ojoaaI57GGSC5ehPynmaE0jgbaI77Pp5lOKOY9Ajxlyy-1_zO6kJu7siTL2qOJ-RpyIlmxq2_oXSQplQJ5uNyFD0fm2QQZEjXEYM9AAeCL-efPt9x0Yw21yz_5rZ5PISy_FMxHqD5b1MSUhixYYhnQ7QsSkP0U7TN6EIxvlBl6XL1PFy3E_mXFwzQLdGAukI9fvIRuQZpnIZosLB0wAMahwT7nZVIJfelqg2QpOTtS4Wsgd4WpOX80706s-CXo9IKOoFO-Dw5shE5WJzOfurupepVyF6BTH_fbzmP09nxUhXhEI4Ika5p9nP6KsY_cTmX7Los7HL-6UPA0WxNswG4cAQuZxF_I1vnQlwRU9AroeijGYTysLG1_Ew-ADplER9ARyPoPMLrn0LXtfwqbwjdFpJ3KAfQT5512KcV0f6yPgNj1afMdPhwH18Ws5jAftkaGXJHgB7Es9heBXVG33lc0QAXoVkU9XGtvjnR7jDyy4jeHWJEchJFcBDieAw1zrM3QL3xZ6dhWNuhD4EZ58MkSkYwSUj6HhV8Q-i-PTUdAX8uqyMp_zGweUiGPh3sTzMCs9kMg1bxwXFuc_GV2O8sR2Rfvvx9s1DSv9to4AlBz9NsuF1kUUxmBJSkkL-1ogwnZEYGC8qGJ58YwhSDhwd3rHnwlxYPPatvPQVFMMV9KwiO3BbinING_-8taI1wfixsi1YcaG5rLTlzLUuIs1feSn0GljxyUPheq-REArsltv9dhcIA_8qprtp3V8evKkzBX3KttK0lsVzsgd0Wxs0ngHEiJrnm5JFrsFYalHvQtmiD7yz8wTVvJEQhHx2GIL7SvNKK1bTp2iqtcsFLUEhwWN915554GaB01CIqlithp0pvArT6EaBV-q_Zj_zTPYkDlE0v2CVmGc7IBb8Mk1mKMpSE6GJ7yVPMKI8TFFEYRyhEeZinGOYM4zjiLLkoLhFEGGKYhgnCGE0hXKcwTymbERomKQ8iyEtSiKl_k6r05sL3opdJiJLowr_KNv5rIwhJ_gz8wwChIF5e6Evfxeb1xgQRFIWx5qjFFlbwy7uXvz7SC8lFrcXl-3tmD_W_AQAA___8zAgo">