https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106973

--- Comment #11 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Iain D Sandoe
<ia...@gcc.gnu.org>:

https://gcc.gnu.org/g:74cfbedd24cfc4bb26b33bdb0b7c55a9139cd757

commit r14-11732-g74cfbedd24cfc4bb26b33bdb0b7c55a9139cd757
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.

    (cherry picked from commit 7b7ad3f4b2455072f42e7884b93fd96ebb920bc8)
  • [Bug c++/106973] coroutine gene... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to