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

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Richard Sandiford <rsand...@gcc.gnu.org>:

https://gcc.gnu.org/g:4f7d4a2cd26673887f45e994a2f367a5c8fcc691

commit r14-9097-g4f7d4a2cd26673887f45e994a2f367a5c8fcc691
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Wed Feb 21 11:12:26 2024 +0000

    Allow mode-switching to introduce internal loops [PR113220]

    In this PR, the SME mode-switching code needs to insert a stack-probe
    loop for an alloca.  This patch allows the target to do that.

    There are two parts to it: allowing loops for insertions in blocks,
    and allowing them for insertions on edges.  The former can be handled
    entirely within mode-switching itself, by recording which blocks have
    had new branches inserted.  The latter requires an extension to
    commit_one_edge_insertion.

    I think the extension to commit_one_edge_insertion makes logical sense,
    since it already explicitly allows internal loops during RTL expansion.
    The single-block find_sub_basic_blocks is a relatively recent addition,
    so wouldn't have been available when the code was originally written.

    The patch also has a small and obvious fix to make the aarch64 emit
    hook cope with labels.

    I've added specific -fstack-clash-protection versions of all
    aarch64-sme.exp tests that previously failed because of this bug.
    I've also added -fno-stack-clash-protection to the original versions
    of these tests if they contain scans that assume no protection.

    gcc/
            PR target/113220
            * cfgrtl.cc (commit_one_edge_insertion): Handle sequences that
            contain jumps even if called after initial RTL expansion.
            * mode-switching.cc: Include cfgbuild.h.
            (optimize_mode_switching): Allow the sequence returned by the
            emit hook to contain internal jumps.  Record which blocks
            contain such jumps and split the blocks at the end.
            * config/aarch64/aarch64.cc (aarch64_mode_emit): Check for
            non-debug insns when scanning the sequence.

    gcc/testsuite/
            PR target/113220
            * gcc.target/aarch64/sme/call_sm_switch_5.c: Add
            -fno-stack-clash-protection.
            * gcc.target/aarch64/sme/call_sm_switch_5_scp.c: New test.
            * gcc.target/aarch64/sme/sibcall_6_scp.c: New test.
            * gcc.target/aarch64/sme/za_state_4.c: Add
            -fno-stack-clash-protection.
            * gcc.target/aarch64/sme/za_state_4_scp.c: New test.
            * gcc.target/aarch64/sme/za_state_5.c: Add
            -fno-stack-clash-protection.
            * gcc.target/aarch64/sme/za_state_5_scp.c: New test.

Reply via email to