<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74612>74612</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
ir with large return struct optimized by`RewriteStatepointsForGC` causing segment fault during "X86 DAG->DAG Instruction Selection"
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
Chronostasys
</td>
</tr>
</table>
<pre>
Hi, I'm trying to integrate my custom GC into LLVM using new statepoint api. Everything works just fine on my Mac Book Pro(Aarch64), but not other x84_64 targets.
On linux, here's the minimum ir example:
```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
@_LLVM_StackMaps = external dso_local constant i8, align 4
%st = type { i64,i64,i64,i64}
define %st @ret_struct() local_unnamed_addr gc "statepoint-example" {
alloc:
%a = alloca %st, align 8
%b = load %st, ptr %a, align 8
ret %st %b
}
define i64 @main() local_unnamed_addr gc "statepoint-example" {
alloc:
%statepoint_token14 = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(%st ()) @ret_struct, i32 0, i32 0, i32 0, i32 0)
%callret = call %st @llvm.experimental.gc.result.s_sts(token %statepoint_token14)
%callret.elt = extractvalue %st %callret, 0
%dst = alloca i64, align 8
store i64 %callret.elt, ptr %dst, align 8
ret i64 0
}
declare token @llvm.experimental.gc.statepoint.p0(i64 immarg, i32 immarg, ptr, i32 immarg, i32 immarg, ...)
; Function Attrs: nocallback nofree nosync nounwind willreturn memory(none)
declare %st @llvm.experimental.gc.result.s_sts(token) #3
attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { nounwind }
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(none) }
```
while compiling with following command:
```bash
clang-16 -c test.ll
```
will result in following crash message:
```log
Stack dump:
0. Program arguments: clang-16 -c target/main_27ffb22eaf523535.cp.ll
1. Code generation
2. Running pass 'Function Pass Manager' on module 'target/main_27ffb22eaf523535.cp.ll'.
3. Running pass 'X86 DAG->DAG Instruction Selection' on function '@main'
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0 libLLVM-16.so.1 0x00007f78be6bfc16 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 54
1 libLLVM-16.so.1 0x00007f78be6bddb0 llvm::sys::RunSignalHandlers() + 80
2 libLLVM-16.so.1 0x00007f78be5fe600
3 libc.so.6 0x00007f78bd1e0520
4 libLLVM-16.so.1 0x00007f78bed5d35f
5 libLLVM-16.so.1 0x00007f78bed61ee8
6 libLLVM-16.so.1 0x00007f78bee12cdc
7 libLLVM-16.so.1 0x00007f78bee122bf llvm::ScheduleDAGSDNodes::EmitSchedule(llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>&) + 783
8 libLLVM-16.so.1 0x00007f78beeb02e0 llvm::SelectionDAGISel::CodeGenAndEmitDAG() + 1760
9 libLLVM-16.so.1 0x00007f78beeaf607 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) + 5015
10 libLLVM-16.so.1 0x00007f78beead63f llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) + 1839
11 libLLVM-16.so.1 0x00007f78c103ad0f
12 libLLVM-16.so.1 0x00007f78bea47d6b llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 635
13 libLLVM-16.so.1 0x00007f78be7f5d3d llvm::FPPassManager::runOnFunction(llvm::Function&) + 653
14 libLLVM-16.so.1 0x00007f78be7fb983 llvm::FPPassManager::runOnModule(llvm::Module&) + 51
15 libLLVM-16.so.1 0x00007f78be7f63f5 llvm::legacy::PassManagerImpl::run(llvm::Module&) + 965
16 libclang-cpp.so.16 0x00007f78c67ea50d clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>) + 3629
17 libclang-cpp.so.16 0x00007f78c6b4217b clang::CodeGenAction::ExecuteAction() + 1947
18 libclang-cpp.so.16 0x00007f78c74ed565 clang::FrontendAction::Execute() + 85
19 libclang-cpp.so.16 0x00007f78c746a754 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 724
20 libclang-cpp.so.16 0x00007f78c7565fe4 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 660
21 clang-16 0x000055fae317ef4c cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 2348
22 clang-16 0x000055fae317c1f0
23 libclang-cpp.so.16 0x00007f78c71469a2
24 libLLVM-16.so.1 0x00007f78be5fe39c llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) + 140
25 libclang-cpp.so.16 0x00007f78c71460c3 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const + 355
26 libclang-cpp.so.16 0x00007f78c7111922 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const + 866
27 libclang-cpp.so.16 0x00007f78c7111b7e clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const + 142
28 libclang-cpp.so.16 0x00007f78c712c2fd clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) + 349
29 clang-16 0x000055fae317b8b5 clang_main(int, char**) + 11541
30 libc.so.6 0x00007f78bd1c7d90
31 libc.so.6 0x00007f78bd1c7e40 __libc_start_main + 128
32 clang-16 0x000055fae3178855 _start + 37
clang: error: clang frontend command failed with exit code 139 (use -v to see invocation)
Ubuntu clang version 16.0.6 (++20231112100510+7cbf1a259152-1~exp1~20231112100554.106)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
clang: note: diagnostic msg: Error generating preprocessed source(s) - no preprocessable inputs.
FAIL
```
I've noticed that the problem is probably related to the size of the structure `%st`, when it only has 3 i64 fields, the problem disappears. Replace extractvalue with getelementptr also resolve this issue, however the original `extractvalue` Inst is produced by `RewriteStatepointsForGC` pass and I have no idea how to bypass this issue while still using the pass.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy8WV9v27qS_zTKy8CGSP31Qx6cpMnJRbstmrMXu_tiUNLI5i1Fakkqic_D-ewLUpQtp07cLhYbFK5EDvmb_zOkmDF8KxGvo-wmyu6u2GB3Sl_f7rSSylhm9uaqUs3--g8e0Vt4jGjRgdV7LrdgFXBpcauZRej2UA_Gqg4ebt2wgs-f__kFBuMoJb6Ascxir7i0wHq-hE_PqPd256ZflP5h4F-DsdByiaCk2-4Lq-FGqR_wTauIlmum612eRnTlGKkGC1JZUHaHGl7LdJOnYJneojXLKL6L4vX4-1WC4HJ4dYt2qDGihQG7Q-i45N3QAdeAr6zrBUZJWBPl8fhPiOduHBq3hoZZJtheDRai5A4iSnHRRckaFz0t4ihZJ9T_uFdy-uqe8tT_LPj00JZuEaHlQpbuIZ_W5OniidAyovQE32reC5ywX8t8k6eLvl54ERdbORwWnPym8cZZY_NkWf3jC-uN3wFfLWrJBDRGbYSqmYBaSWOZtMBLpzAm-FZCGnahmRnFtvseISpuwMlBb9_-Fndz8Aa9TcPqNNZoN8bqobaRk28FHnkzSMk6bDasaTRsayfe0WMWk4UodbjjxkwIVR9sBg6Befb8BBsRj1KUM7rK0wnFmiNVb7Xf4swKjXbin2ZVEO6slDxPnYwd4_L_Xrrjio1VP1CSdLQG4wJqJgT4UYhoOdoCeEKDZLO38N9yuXTsRal38iW-9qh5h9IysdzWyyPWso_HHYGWJU1j9xf2gXhSHAp0a51jeLlHXZU-WFdvrT5b--7Daia3k82bILkb5Tz40lnWNZpB2KXZGGsiWk5KOaO-szBLFHYKD81q-8zEgEfzByrHahwWRzRrQmQE1wv6f-NGxiodXOQEbeZ9zTmPdbK7VfFZz5v8rxZM4-QCv2FV3nVMbyfVH9-OXvMuyehDJ8wkN3A_yNpyJWFtrTZRsgbpYkBUrP4BUrUaEaQye1mDVIN84bKBF-61MWgJHXZK7yNaSiXxsP0k3--b3jsgTZI5m8xazavBonFT8ZhPi5uzjH7AIdPbDl36hxfNLXqkyTinEORDiFNdmB7rQTDLKoEfKeY9LDrDClu-Q5n8Ble_xMib8jkffNlxgVCrrufC13xud9AqIdSLe61V1zHZHEvw6U4VM7txqBZMbhckh0UNFo1dCnEW1fELoz8Al3MkzcwOOjSGbfE9PKG244ivmNAMXX8gjZeuI9lq1gHT28F5n_fyE858uY7ovasEG1q0bUUpsjajSZZky7o_sE2WcKsahC1K1MzFzThOl-D_vg9SOrZ7ZpzNikN0fXMDX5hkW9QRLXzTpJrBdQe0-CV8WoROKXkH6z_KHO7WD4so-XS3foBHOWZwh_6EAv1TgG4ntiJaHApg8VaH3uqueTL7rlICXFF0SCVKM2iEvRpgx54RXHQvRiL-F2pnwb0aNHxb__kHKA3G9UI7BJTPXCvpbADPTEOUx2Oj859fbr5-fvyvT983bkmUx65bHbtP17Zal1gOBgUQvHLrFiRfGrUkEL-6Mle0RVlhXrU1yT1LbkmyNnszPnzTXFov3Z-a1a7yHYk0e9koYzWyLqK5z53SjrnoBrLQUpGfkQHegDdNFZ8D_z7IJ76VTPzBZCNQm9BwuP3LEAT04v5Zi3kcqBNPXTu6fE7UEIwzGojSi1s2WZNk7UidXSTOCWIodPnHdkBC66YeSYuLXCChtGpninuqd-jC42798HT3b6rBoMdPHbfT3IkFv7B6xyV6r78ZnI4frQtRpaPk9jyZM3PLhMEo-eStPpqjKEP1KS-zXcUU5_Y-BNrd-uHxCcU46lLGA8q1bBz7d-uHmfFJMeXA1QWFsjaPi4tY4-haiBtmeH0jVP3DnCjqkJL86WEmdxaTLDh6fFFw1uRJe5EZPcivMqh8wj1ntePcgRtSJqGZIORjbmoSJ6yJgw8T-qEWWVo0eQXvcuDy9Iz3s0yf4TZPJtUll1RXtFmTNDMO7r850Kk2_C-ws-CvJL2MXa3K5Bewv6ifAywMHf2FBNif08YpZp602QxT4JbV-5CTj-iPXX_0mo-RV_mk7dznQF_K67734PNkWOcFsixuxmp_zCA3rP6Bsvk62H5wB9vZ9B1nW6mM5bX5JLdcYqgHM5I_kDWon5Dpeve1d9Yws2A6IQ2Rf4HqT1__LxB9ZnJ7jmQWg1Zzuf2O7enwpL71mw2DEtbBn27B2GacGST_7wE37kwxz52uSPa-d95MpXK2qMGWDcJuGhRo8cLC5JPPuaM5k3w6N5Dikj2rlJKiOqPiIMZo4lesB4uTZMdcu0pDk0PKC0BFik2WZ3Oge62kPSpsjjQv5pNrri4i5KzI0lNRXL-N-tFf69R4Xpr3WZrVMBp6FhpfYiPLsxZP2AiAR26eVc1-Bv-JW-dhISVNNY2SY6N9_Bvhs6xlmJAC27SGuiabcA9z9Ju11mzv_Dm5rXdMT26_9r5zC6dj9BaeFW9mXNAkDb0KpZfZqEk7MZ1c0hlJ8xULV3f056z7pmVLVvUsHG_dieY71uoZ9f7W2e_VHntE1qLYnyhh6tU32ivCyThd1hxDiKQT79kv8B7XydzejebPU_a_vSW3x8Pd3MHPmuUQ_cpnJiZO4v6YkEK8z9LFZlO_vhIyvlSuV3G5gTuevLFPiN3AxmrG3dltnH6z3XiVM3Z707wj8X5RKSWCX3h3GbNOFiKVXioiBSFkNbnQGZX5OGA_JYVJjydB82ahI3gv4X9Aug7Uo2Bzqco8D1JdSqVOqqrA35XqH6oy74v0D1V95sa-V6A6JsQ_sbYqVPuj__SMO9P5U9evayEY-R1dkHQK0YvZntCats17uHez55PkeCYrvqfD_0ddhKqahqLqdHIp-VVlFWrdlIUndB-K61lWJSRLQ-eXxLMj6Judw1m0LprVdGAl7x1Y6wLTGDYbN70xlmnruRjhaMjhySyHnzJfllkG47pR8mJ2-RQla0CtXWIIlz7Qhqo5XWNBy7jAZrzkwlfu3LdBIIkTuBwMwuIZrAKDCHxWDIN-_70apB3C3s-ojTtckXwZL_MxUd9E9IbGNCGEUBLHGYkjelPUVUsYzVYkowvyN7725O85UZYuSZwfQMYW0clw7jPSSLLTyBroVOOPX9Arw1_HKV-ihcDmjns9RPR-MDqi9xWXb3QllWve1tAc-mDojJ_55LR4uPmSW-g19lrVaAw2YNSg_aWKcY6yAKlm8_5ylMt-OHzuu18_fv7g_vExosUzOmZ4jQ3YHRtvkHqtKoEdcOMfWSX2oFEw64iUJzH8LwTVjs_-BmzQCG5__-0o998tXnYogVtQUuxhxwwk_s6-5Sga4wjmYA03rO-RabOE79gLVuPp5wbvOFu04btKbzUwYRRoNEo8I9gdN8CNGdB_11Qv-IzaQyjNt1wy4fibbxnlsb_AC4I2g9NCtXdk39F30k-HjwPmXumHW7divAp0Hv04XsxJBbxB5iCdeqq9JziyA-M9r7FciPDx1wvOzGSnq-Y6aVbJil3hNSliUhZlsiJXu2vKaFuVFOOUJowmDAuakIZhyxhjbZ5f8WvvzjTOSZatMrKkqyxLWxKnRezazjpKY-wYF0v_cUDp7ZXn6bpIc0KvBKtQGP-hm1KJL5P-aJTdXelrf-VYDVsTpbHgxprjLpZbgddcj2YRLnAg3IWP_gCuWen4X16lH2u0ZqNWDG79raU_4kAzuEYFIkp_7c6VwtWgxfXO2t5fLtD7iN5vud0N1bJWXUTvfV0Y_1v0Wv0LaxvRey-yiei9V8n_BAAA___iELJ2">