<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60713>60713</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
error in coroutine intrinsic lowering
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
alperenunal
</td>
</tr>
</table>
<pre>
Hey, i was trying to compile a module similar to one in the coroutine documentation [^](https://llvm.org/docs/Coroutines.html#coroutine-representation).
define ptr @f(i32 %0) {
entry:
%1 = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)
%2 = call i32 @llvm.coro.size.i32()
%3 = call ptr @malloc(i32 %2)
%4 = call ptr @llvm.coro.begin(token %1, ptr %3)
br label %loop
loop: ; preds = %loop, %entry
%5 = phi i32 [ %0, %entry ], [ %6, %loop ]
%6 = add nsw i32 %5, 1
%7 = call i32 (ptr, ...) @printf(ptr @0, i32 %5)
%8 = call i8 @llvm.coro.suspend(token %1, i1 false)
switch i8 %8, label %suspend [
i8 0, label %loop
i8 1, label %cleanup
]
cleanup: ; preds = %loop
%9 = call ptr @llvm.coro.free(token none, ptr %4)
call void @free(ptr %9)
br label %suspend
suspend: ; preds = %cleanup, %loop
%10 = call i1 @llvm.coro.end(ptr %4, i1 false)
ret ptr %4
}
define i32 @main() {
entry:
%0 = call ptr @f(i32 4)
call void @llvm.coro.resume(ptr %0)
call void @llvm.coro.resume(ptr %0)
call void @llvm.coro.destroy(ptr %0)
ret i32 0
}
When I try to compile this with (apt.llvm distribution of clang) `clang-15 coro.ll`. I got the following error.
fatal error: error in backend: Cannot select: intrinsic %llvm.coro.size
clang: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Ubuntu clang version 15.0.7
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
clang: note: diagnostic msg: Error generating preprocessed source(s) - no preprocessable inputs.
Also with `llc-15 coro.ll` I get:
LLVM ERROR: Cannot select: intrinsic %llvm.coro.destroy
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: llc-15 coro.ll
1. Running pass 'Function Pass Manager' on module 'coro.ll'.
2. Running pass 'X86 DAG->DAG Instruction Selection' on function '@main'
#0 0x00007fc925b0ae91 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xf01e91)
#1 0x00007fc925b08bde llvm::sys::RunSignalHandlers() (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xeffbde)
#2 0x00007fc925b0b3bb (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xf023bb)
#3 0x00007fc9246d8520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#4 0x00007fc92472ca7c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x00007fc92472ca7c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#6 0x00007fc92472ca7c pthread_kill ./nptl/pthread_kill.c:89:10
#7 0x00007fc9246d8476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
#8 0x00007fc9246be7f3 abort ./stdlib/abort.c:81:7
#9 0x00007fc925a408d2 llvm::report_fatal_error(llvm::Twine const&, bool) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0xe378d2)
#10 0x00007fc92634d3c4 (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x17443c4)
#11 0x00007fc92634c898 llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x1743898)
#12 0x00007fc9284b3a38 (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x38aaa38)
#13 0x00007fc92634432f llvm::SelectionDAGISel::DoInstructionSelection() (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x173b32f)
#14 0x00007fc926343a04 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x173aa04)
#15 0x00007fc926342df1 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x1739df1)
#16 0x00007fc92634095b llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x173795b)
#17 0x00007fc9284aadbd (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x38a1dbd)
#18 0x00007fc925e9651c llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x128d51c)
#19 0x00007fc925c46fa2 llvm::FPPassManager::runOnFunction(llvm::Function&) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x103dfa2)
#20 0x00007fc925c4e563 llvm::FPPassManager::runOnModule(llvm::Module&) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x1045563)
#21 0x00007fc925c47b46 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-15/bin/../lib/libLLVM-15.so.1+0x103eb46)
#22 0x00005576383a9dff main (/usr/lib/llvm-15/bin/llc+0x10dff)
#23 0x00007fc9246bfd90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#24 0x00007fc9246bfe40 call_init ./csu/../csu/libc-start.c:128:20
#25 0x00007fc9246bfe40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#26 0x00005576383a4dce _start (/usr/lib/llvm-15/bin/llc+0xbdce)
Aborted (core dumped)
So I tried to run coroutine lowering passes manually with `opt-15 --passes=coro-early,coro-split,coro-elide,coro-cleanup coro.ll -S -o coro.ll`. Resulting module looks like this:
define ptr @f(i32 %0) {
entry:
%1 = call i32 @llvm.coro.size.i32()
%2 = call ptr @malloc(i32 %1)
br label %loop
loop: ; preds = %loop, %entry
%3 = phi i32 [ %0, %entry ], [ %4, %loop ]
%4 = add nsw i32 %3, 1
%5 = call i32 (ptr, ...) @printf(ptr @0, i32 %3)
%6 = call i8 @llvm.coro.suspend(token none, i1 false)
switch i8 %6, label %suspend [
i8 0, label %loop
i8 1, label %cleanup
]
cleanup: ; preds = %loop
call void @free(ptr %2)
br label %suspend
suspend: ; preds = %cleanup, %loop
%7 = call i1 @llvm.coro.end(ptr %2, i1 false) #5
ret ptr %2
}
Documentation [says](https://llvm.org/docs/Coroutines.html#id14) llvm.coro.size.i32 should be lowered to a constant, so i guess call to that should not be here.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWVtz4yj2_zTKC2UXAt38kAcnTnq6avo_XZ3-7-6bCwGy2WBQAep09tNvgSTr5qTT05nZPDiSgN-5cs6BQ6wVB8X5dZTeROnuijTuqM01kTU3XDWKyKtSs-fr3_hzhG6BAE_EAmeehToApwHVp1pIDgg4adZIDqw4CUmMH9OKA6GAO3JAtdGNE4oDpmlz4soRJ7QCgehdlO4iVBydq22EtxG6j9C9lN9Oa20OEbpnmtoI3d_2GHZ9dCcZIXxGXRleG2572Aht1hHcRXDb_gLGK0-7dgZECawiVAiMQIRSGKENiPKbbh4AgCtnnj0X5y_AT4xBhHeAEimB049ceZzAoudhLVgHCb2OPBnVSPny82aGjgb0wNgY24r_8LXAKELFciEeFnbCnYiUmg4SouWiZLFooFbyg1ARKjohURr3nHtqM6zSAElKLv2Y1LruxoYp4SPuZr_xL8I3oDac2cBlj4xu_WNrnKk0aZhXH0WruvSms-uwAAT_uu3Hsm7M44ahKV4W8AhjQNkn0Gkx9Wvi2cx8ZjVU1M74iev1OvhVAmsjlKvaEf8e-Bowe21GKC1GYMXMAxpbc8UWVhExqIi0fGYV-yQcPQYUlBZ-4tlIHVLYdqMVwE-Gk5kjcw5T4skUKjlRzWTWRJvDUz8Tb1-w7lSvm1f8szKcnxWhtOIj90xmiggI37RgYdO3C7upm1c8uVf3XJD--8_480LcXhWDC84DDRw5QjwVvnWCQdoXXcBwNyhlkCPfTaIiAH1g7ILOiYS9_9aYCBd26iPrq5YY5DHcNqeRVeBfuoxx64x-fnmd11obxF9S2T-PXIGPPv2Nc587CguehDv6EEBqt_Y0ARPWGVE2Ic_pClBJ1CGoNoPheRWnIS-upYwyuAYfwUG7kC0rLaV-8hmWG6PNem61ijgi2zHvjeHBZ9qS0MfOQ2-JUtoByyWnzn8QyhmhrKDB7ybZZbxRPY89pH8IX0BltHI-cFB9OhHFQEWE5KwVmn8XDlDNOMih10BjOVh98wqy3BcA3zTts_JA6f_LRrmmg__GjfVaitM1XOfdpK_EHHhg_XuR7bNkVdOVFKr5vjqoZgD6ejScMF99cOkn19qK78PwR2UdkZKznQjyROi-sSZC96VQF-RW2nH_nwlyUNo6QcHJhpG7oOQDV9wQ501T-5pDU24tZ8DqxlDvktZbeAWUHo2TUno91I2zE1NupdWd32RQSjp1CO8PQf659X___R-fwN2XL398-RlD997fwnz-_W77cAdsU56EAwSUzQEYXmvjvN2mldhBuGNTrqk-dWVZ929VG_1vTxTdC2sb7ms04J1DKCobxtvCzxB7DI7pDKF8PYjx4Ah9BKw51ZPIAtcR3Hw2-mDICRBzCMWiZwbMNHReEfsVXxqlglWItSBC-X2jaNh5n_2HT0SRAzcRyoFWfaUaobzHQvmIMXQJ719FBnbbD6sI3-22H4Jbmaal8BBUHxw8wFc96Qjl56Caj2IKwhDA7xBCmFd0g9ISEr6JQVAt3kZ4a59t-_DZlw9BUV-99iJUDJMMedpr6wwnpwiFmkYoF-KLj-Cdl0tR9taK087r0b0vT_ohUXp_WsXp2up1HKEb-L2CMd_Ek-0aIRzPeC5Kxi_x_KVRD-KgiPyNKCa5sX1G-VW2eFWVjM_ZQjO2SlyW76EChMtyXKBhPCaUZKxIEewItThdmBpiVBigHjQLoAlKEZzzn0xgc0RJTsF-X7sQ1_aPQsq9ONWSD4cmz7qqnYzQ_XjamkZ4myQR3ubZhET6FhLKcaOIfBU8LyK8jeEEPLsEPl75KmKxWSLmc0UneQYONvhUAGsfeyPaZ8t47YNPG_rRvSHC8gCP8ghvp8oopuglzysMSOkjX0BzrLVm-NTyGHvRJyCbidORBBYMjfZCG0n3IU3v21Q63rlfn3zNRbWyrtu5pdbyffYIzguGFlt3Em8ynDBMk18nFudJgmmyoBbPqNFiU4y0c46Xu-2Hjw8ha5-_3mrGb_Xp5IPpSGMPu__TfutvvbIaFW4sGKBHYno1TkfeKxLGeYKLTbGQcBJ0iqTEBBe_Tg0XhBC8pIZn-kwwqn6oz50e5ahRinqfWBznuMSoWrCazFjFBCY_ZNUb_QNXW8XuTsLtth_ekUtC4NJB0xmXiFXxGx10K-UNsYLeSE0f7cRJzyXHsLPfR4YNq5bZOJvJADdp-UMZTKP-UJ8IPQrFe3YnMizG3k2IfJOWCyHy6T4ihJXsXfZRzEq2oDYJ_SnfZGlMwYuy-8JxpLWL6np3PaGCpTFdcD7NNzTJKjLON_efPbN9kft38wwxq8gi5yA445mnGX4Dz59CcT51yu7Te_GbpGmGF_zGM37zMslG_Ep-IPS5K8sHzj-e6mFv_aVcY14m2YLrPhOlaZ7hApMNqyrgjxxvICkl7bBZtQjlaFbvlhXbQLDf-5J2bx0xbk-JlPtAy_NObbMsybq679Ki9THC2zRUlNMKDSVzyjyB4VJnL5Rwc2Lto6ewChRCzRYjD4ymhSVKLwFPRLokzUUCOPeVazocD1A2s0TCKAct7E_YomR0dMTZ-iKUh5BIteHhtMyHwNb-PuhwJSU482d306hRt0XqJ276cyy34ERUQ6R8Pl876Nr5Q_Vq1U6I8M4vXnFi5HOEbsOLraVw_QuXwldi7Ut3m9mfycHqAaz05FLrC7eNDPcl3albav1ogRSP7b3ZhfuNd23W_Fw7Bf2wnRK_qQXy93ZA8M92QJLLHZBza2jW_MCXmh_przU_5q2kc-PlTR2Q_uJ_ef09aX5k_5vmx59rfLzSrZj38F7sVgyT_p5mRf7GXgWaGSvcSrzQsEAv3r7v5q1jS57tn-0dCxb7gwFYRgZgj7qRDJRd-GzjKmnLeuJPlrfAaiDAoeHW9j1h4I7E9UuVdn75kRs-ufF96feKXWO2wRtyxa_jLM8wzIsNujpesxJnJSpgXkGSZDDnPMEbBMuKVhhBWF2JawQRhijGcQ6TFK0RSQjLIEnLFMINi6ME8hMRct0r5Spc1l5nMI_xVXAjG3r_CCn-BMJghFCU7q7MdchSZXOw3rTCOjugOOEkvz63HoaUM9w_98nnqjHy-s_fKQdO_xsAAP__TTw7vA">