https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106973
--- Comment #9 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The trunk branch has been updated by Arsen Arsenovic <ar...@gcc.gnu.org>: https://gcc.gnu.org/g:7b7ad3f4b2455072f42e7884b93fd96ebb920bc8 commit r15-3453-g7b7ad3f4b2455072f42e7884b93fd96ebb920bc8 Author: Arsen ArsenoviÄ <ar...@aarsen.me> Date: Tue Sep 3 17:14:13 2024 +0200 coros: mark .CO_YIELD as LEAF [PR106973] We rely on .CO_YIELD calls being followed by an assignment (optionally) and then a switch/if in the same basic block. This implies that a .CO_YIELD can never end a block. However, since a call to .CO_YIELD is still a call, if the function containing it calls setjmp, GCC thinks that the .CO_YIELD can introduce abnormal control flow, and generates an edge for the call. We know this is not the case; .CO_YIELD calls get removed quite early on and have no effect, and result in no other calls, so .CO_YIELD can be considered a leaf function, preventing generating an edge when calling it. PR c++/106973 - coroutine generator and setjmp PR c++/106973 gcc/ChangeLog: * internal-fn.def (CO_YIELD): Mark as ECF_LEAF. gcc/testsuite/ChangeLog: * g++.dg/coroutines/pr106973.C: New test.