aarch64: Simplify probe of final frame allocation

Previous patches ensured that the final frame allocation only needs
a probe when the size is strictly greater than 1KiB.  It's therefore
safe to use the normal 1024 probe offset in all cases.

The main motivation for doing this is to simplify the code and
remove the number of special cases.

gcc/
	* config/aarch64/aarch64.cc (aarch64_allocate_and_probe_stack_space):
	Always probe the residual allocation at offset 1024, asserting
	that that is in range.

gcc/testsuite/
	* gcc.target/aarch64/stack-check-prologue-17.c: Expect the probe
	to be at offset 1024 rather than offset 0.
	* gcc.target/aarch64/stack-check-prologue-18.c: Likewise.
	* gcc.target/aarch64/stack-check-prologue-19.c: Likewise.
This commit is contained in:
Richard Sandiford 2023-09-12 16:05:11 +01:00
parent fee0a18abf
commit f87028a905
4 changed files with 9 additions and 13 deletions

View file

@ -9887,16 +9887,12 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
are still safe. */
if (residual)
{
HOST_WIDE_INT residual_probe_offset = guard_used_by_caller;
gcc_assert (guard_used_by_caller + byte_sp_alignment <= size);
/* If we're doing final adjustments, and we've done any full page
allocations then any residual needs to be probed. */
if (final_adjustment_p && rounded_size != 0)
min_probe_threshold = 0;
/* If doing a small final adjustment, we always probe at offset 0.
This is done to avoid issues when the final adjustment is smaller
than the probing offset. */
else if (final_adjustment_p && rounded_size == 0)
residual_probe_offset = 0;
aarch64_sub_sp (temp1, temp2, residual, frame_related_p);
if (residual >= min_probe_threshold)
@ -9907,8 +9903,8 @@ aarch64_allocate_and_probe_stack_space (rtx temp1, rtx temp2,
HOST_WIDE_INT_PRINT_DEC " bytes, probing will be required."
"\n", residual);
emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
residual_probe_offset));
emit_stack_probe (plus_constant (Pmode, stack_pointer_rtx,
guard_used_by_caller));
emit_insn (gen_blockage ());
}
}

View file

@ -33,7 +33,7 @@ int test1(int z) {
** ...
** str x30, \[sp\]
** sub sp, sp, #1040
** str xzr, \[sp\]
** str xzr, \[sp, #?1024\]
** cbnz w0, .*
** bl g
** ...

View file

@ -9,7 +9,7 @@ void g();
** ...
** str x30, \[sp\]
** sub sp, sp, #4064
** str xzr, \[sp\]
** str xzr, \[sp, #?1024\]
** cbnz w0, .*
** bl g
** ...
@ -50,7 +50,7 @@ int test1(int z) {
** ...
** str x30, \[sp\]
** sub sp, sp, #1040
** str xzr, \[sp\]
** str xzr, \[sp, #?1024\]
** cbnz w0, .*
** bl g
** ...

View file

@ -9,7 +9,7 @@ void g();
** ...
** str x30, \[sp\]
** sub sp, sp, #4064
** str xzr, \[sp\]
** str xzr, \[sp, #?1024\]
** cbnz w0, .*
** bl g
** ...
@ -50,7 +50,7 @@ int test1(int z) {
** ...
** str x30, \[sp\]
** sub sp, sp, #1040
** str xzr, \[sp\]
** str xzr, \[sp, #?1024\]
** cbnz w0, .*
** bl g
** ...