[Bug d/107592] ICE: gdc segfault on label continue

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Nov 30 17:10:31 GMT 2022


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

--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Iain Buclaw <ibuclaw@gcc.gnu.org>:

https://gcc.gnu.org/g:031d3f095520f0e1ee03e29b7ad5067c2a3f96e0

commit r13-4413-g031d3f095520f0e1ee03e29b7ad5067c2a3f96e0
Author: Iain Buclaw <ibuclaw@gdcproject.org>
Date:   Sat Nov 12 00:54:47 2022 +0100

    d: Fix ICE on named continue label in an unrolled loop [PR107592]

    Continue labels in an unrolled loop require a unique label per
    iteration.  Previously this used the Statement body node for each
    unrolled iteration to generate a new entry in the label hash table.
    This does not work when the continue label has an identifier, as said
    named label is pointing to the outer UnrolledLoopStatement node.

    What would happen is that during the lowering of `continue label', an
    automatic label associated with the unrolled loop would be generated,
    and a jump to that label inserted, but because it was never pushed by
    the visitor for the loop itself, it subsequently never gets emitted.

    To fix, correctly use the UnrolledLoopStatement as the key to look up
    and store the break/continue label pair, but remove the continue label
    from the value entry after every loop to force a new label to be
    generated by the next call to `push_continue_label'

            PR d/107592

    gcc/d/ChangeLog:

            * toir.cc (IRVisitor::push_unrolled_continue_label): New method.
            (IRVisitor::pop_unrolled_continue_label): New method.
            (IRVisitor::visit (UnrolledLoopStatement *)): Use them instead of
            push_continue_label and pop_continue_label.

    gcc/testsuite/ChangeLog:

            * gdc.dg/pr107592.d: New test.


More information about the Gcc-bugs mailing list