Allow mode-switching to introduce internal loops [PR113220]
commit4f7d4a2cd26673887f45e994a2f367a5c8fcc691
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 21 Feb 2024 11:12:26 +0000 (21 11:12 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Wed, 21 Feb 2024 11:12:26 +0000 (21 11:12 +0000)
tree65110620c964ac72ee04cfd120b12b2ac318fdf2
parent703d14132e202ed2ab787cfdb37a726fa654455a
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.
gcc/cfgrtl.cc
gcc/config/aarch64/aarch64.cc
gcc/mode-switching.cc
gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_5.c
gcc/testsuite/gcc.target/aarch64/sme/call_sm_switch_5_scp.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/sibcall_6_scp.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/za_state_4.c
gcc/testsuite/gcc.target/aarch64/sme/za_state_4_scp.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/sme/za_state_5.c
gcc/testsuite/gcc.target/aarch64/sme/za_state_5_scp.c [new file with mode: 0644]