[clang] [CIR] Implement FlattenCFG for coroutine AwaitOp, CoroBodyOp, and CoReturnOp (PR #203802)

via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 20 19:57:34 PDT 2026


Andres-Salamanca wrote:

> Jumping in to bump this a bit, since the suspend-point discussion has stretched across a few weeks.
> ### On the direction (discussion about the suspend point)
> 
> +1 to landing on the cleanup-style abstraction. The key thing I'd add, since you got stuck on "reference to block defined in another region" when you tried a cir.br to a CodeGen-created block: with the cleanup framing you don't name the destination at all. The await's suspend region should end in a structured terminator (a yield / cir.coro.suspend-style exit), and FlattenCFG wires that exit to the enclosing continuation exactly like it already wires cir.yield out of a scope/cleanup region. This PR already computes that continuation in CIRCoroBodyOpFlattening (for co_return) and already taught CIRCleanupScopeOpFlattening to thread CoReturnOp, so the suspend path should reach that same continuation through the structural nesting. No beacon, no cross-region branch, and the destination falls out of flattening for free. That should remove the wall you hit.
> ### On making progress now
> 
> This is redesign work, so consider splitting the PR. The coro.body/co_return flattening, the intrinsic emission, and the test reorg look largely independent and landable on their own; the await suspend-destination piece is where the redesign lives. That lets you land the uncontroversial 80% while we iterate on the suspend representation.
> 
> Independent of the redesign, three small open items worth closing out regardless:
> 
>     * andykaylor's missing-suspend-point-alloca error handling still needs a response.
> 
>     * his "do you need to flatten nested regions before this?" question is unanswered.
> 
>     * the IR-to-IR test suggestion (checking the pre/post-flatten CIR directly) hasn't been picked up, that'd make this much easier to review than the .cpp-driven test.
> 
> 
> @Andres-Salamanca: Thanks for pushing on this!! Coroutine flattening is gnarly and the structured-CFG constraints make it more so.

@andykaylor @bcardosolopes

Thanks for the summary! Yes, I've also been working on the GRO manager representation in the IR, which needs flattening as well, and looking into the suspend-point redesign. Because of that, I haven't spent much time on this PR yet.

Per Bruno's suggestion, I'll scope this PR down to just the coro.body and co_return flattening, land that part, and reorganize the tests accordingly. The intrinsic emission, GRO manager, and suspend-point redesign will move into separate PRs.

Does this plan sound right to you both?


https://github.com/llvm/llvm-project/pull/203802


More information about the cfe-commits mailing list