<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/208304>208304</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
CoroSplit incorrectly assumed poison after splitting retcon coroutines with zero suspensions
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dingxiangfei2009
</td>
</tr>
</table>
<pre>
As of `cefd20c496`, `CoroSplit` would incorrectly assert that the detached frame buffer to be poisoned for `retcon` coroutines with no suspensions.
Currently I am using this IR.
```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr)
declare ptr @llvm.coro.begin(token, ptr)
declare void @llvm.coro.end(ptr, i1, token)
declare noalias ptr @malloc(i64)
declare void @free(ptr)
define ptr @prototype(ptr dereferenceable(8) %buf, i1 %unwind) {
ret ptr null
}
define ptr @f(ptr dereferenceable(8) %buf) {
entry:
; We can set size to 0 and align to 1 because this coroutine has 0 suspends,
; meaning it will always be elided and requires no frame storage.
%id = call token @llvm.coro.id.retcon(i32 0, i32 1, ptr %buf, ptr @prototype, ptr @malloc, ptr @free)
%hdl = call ptr @llvm.coro.begin(token %id, ptr %buf)
; Access the frame (buffer) via handle.
; %hdl is equivalent to %buf (dereferenceable(8)).
; GEP offset is 1 (4 bytes for i32), so we access bytes 4-7, which is within the 8-byte buffer.
%val_ptr = getelementptr inbounds i32, ptr %hdl, i64 1
store i32 42, ptr %val_ptr, align 4
call void @llvm.coro.end(ptr %hdl, i1 false, token none)
ret ptr null
}
```
I ran `CoroEarly` and `CoroSplit` on it and I spotted a problem.
```sh
opt -passes='coro-early,coro-split' -S repro.ll -o repro_split.ll
```
The problem is with the `poison`
```llvm
define ptr @f(ptr dereferenceable(8) %buf) {
entry:
; We can set size to 0 and align to 1 because this coroutine has 0 suspends,
; meaning it will always be elided and requires no frame storage.
%id = call token @llvm.coro.id.retcon(i32 0, i32 1, ptr %buf, ptr @prototype, ptr @malloc, ptr @free)
br label %AllocaSpillBB
AllocaSpillBB: ; preds = %entry
br label %PostSpill
PostSpill: ; preds = %AllocaSpillBB
; BUG: %hdl replaced by poison instead of %buf,
; but %buf should have been used because it has enough frame storage and
; it is dereferenceable for 8 bytes.
%val_ptr = getelementptr inbounds i32, ptr poison, i64 1
store i32 42, ptr %val_ptr, align 4
br label %CoroEnd
CoroEnd: ; preds = %PostSpill
ret ptr null
}
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsVkGP4ygT_TXkUnJEsOPYhxzS3dOjvo2-_lZ7HGFTjtkh4AXcmcyvXwG2O53pnR3tSntaKXIMpl4V9aoecOfkUSPuyfaObB9WfPS9sXsh9fGr5PrYoWSU1qvGiMv-4MB0QEraYicYbYu6JCUl7D7M3RtrngclPSkpnM2oBEjdGmux9eoC3Dm0HnzPwwNBoOdtjwI6y08Izdh1aMEbaBAGI53R4ZuxAdqib40OuK2xZvRSo4Oz9D1oA250A2onjXZrQg-EHu5Ha1EHp0_ATzA6qY_ge-ng6X9xSUnTT6mXE6EHz-0RPQjuueIXM3og-QMQxjA7kfyA2cB2lOSHnMVHGG7eDsNbWcRHJpeXDatIftiwKusqOr3pOFXO5mWRPYdljL3G4a0cFM4xfK3Kz2WRjfqLNmedKanHr9lRj8lEYKu4RfDmC2ogRdzSOmRpLcV6yhurZM4CS9Pf4O2f_NVXkIO3bwEbPMoAFn29a_JipHhrg1oQVk0u5CY8J_NrO224ktzNLk9cKdOGsMvifQedRZxx0_dO6iXkwRpv_GWYloBAix1a1C3yRoXZirAaCNs2Y5cCC4NRn2UItwayuyP0AGDRR0w9KhXqZvfwna_u53zMmKi9vZD8EOFJfge_IrRcg0MPTn4LRAIFrgVwJY86DDfQYMtHh6mElw6AnjugU_kLR9j9AnpCrkPNSw9nqRRwdeYXFzoLlRQoogOLv4_Sogs9lHrQeWP5EdcJh21DrvMHaLlSP1FgQKcSg81UHFcZ_p6Z-1u2l4lEbj1H0Qv1GsaPizIFfet9QpqTc2hbdC5qUNo2YVVSn0DTi-TQcy3UnIb8bg5COggpe-EKtQ_MJAfB_n32CatfQT5--ASm6wLR0kEouKqA5uLRRZWLrVmH0J2BMwJPUaYFRbYLX869bPtgHaRP6riFKgtLJvlcmHvh6nNMQf4AR_So8ITahxmpGzNq4a60YNpfZK8sYBNBQi1gZLO4XjcBh5lUoMWS3MjPDxTg2s0GOq4cLnIA2uiF83e7btHsJPFPYLmeT50P3KpLOB1CWd-eREaHNghfnsANxvtQ_jBY0yg8TQfGAu56Qg9m8JAN4bxyJH8gbBf2kWF0wu7jwEV0toPsGSwO1qyVgsyk98_x6zoF_zbs__c4u555jCySkqYzb1l5e0b9pzr_ouo0FhRvUAWoQ1jHnwep1N1d4ubtVH6Iux8sCjcd2tuU8FuoT8b5aJVgXofvQdz6TTm---VjXJ0UyeKgeIsCmst0ZwKpnUcu4j1tzsNi3YSrTRIt18cbWs9fEBpEDaMLOBPn0keeUZvx2L_lKbC4AMooZjdVGPWsStL1NxVpaoZ_oEjXeY8aEaMOl8Np8F7Orwn6Kx1aiX0u6rzmK9xvdlW-LWi13a36fbnJGWe7GrdV25SMi6be0rYWW7YpN7yoV3LPKCvpjlaMUrrN16IuN5uGsbqhFadtQwqKJy7VOla9sceVdG7EPaNVTotV3JebL-x2H1ZlzXh0oU-k8-7VzkuvcL_o4e2FfDyhmAuHdx4tROnyoYtTk3134f6G9s2VezVate-9H1zQF_ZI2ONR-n5s1q05EfYY5Sv9ZYM1v2HrCXuM-3GEPU5betmzPwIAAP__ZrrpGA">