IBM Z: stack clash prot: add missing updates of last_probe_offset
After emitting probes in a loop last_probe_offset needs to be updated. Not doing this usually assumes a too low distance to the last access when emitting the remainder leading to stack probes being omitted. gcc/ChangeLog: 2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com> * config/s390/s390.c (allocate_stack_space): Add missing updates of last_probe_offset. gcc/testsuite/ChangeLog: 2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com> * gcc.target/s390/stack-clash-1.c: New test.
This commit is contained in:
parent
d3e5bae174
commit
868d351e23
4 changed files with 29 additions and 0 deletions
|
@ -1,3 +1,8 @@
|
|||
2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||
|
||||
* config/s390/s390.c (allocate_stack_space): Add missing updates
|
||||
of last_probe_offset.
|
||||
|
||||
2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||
|
||||
* config/s390/s390.md ("allocate_stack"): Call
|
||||
|
|
|
@ -10996,6 +10996,8 @@ allocate_stack_space (rtx size, HOST_WIDE_INT last_probe_offset,
|
|||
stack_pointer_rtx,
|
||||
offset));
|
||||
}
|
||||
if (num_probes > 0)
|
||||
last_probe_offset = INTVAL (offset);
|
||||
dump_stack_clash_frame_info (PROBE_INLINE, residual != 0);
|
||||
}
|
||||
else
|
||||
|
@ -11029,6 +11031,7 @@ allocate_stack_space (rtx size, HOST_WIDE_INT last_probe_offset,
|
|||
s390_prologue_plus_offset (stack_pointer_rtx, temp_reg,
|
||||
const0_rtx, true);
|
||||
temp_reg_clobbered_p = true;
|
||||
last_probe_offset = INTVAL (offset);
|
||||
dump_stack_clash_frame_info (PROBE_LOOP, residual != 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||
|
||||
* gcc.target/s390/stack-clash-1.c: New test.
|
||||
|
||||
2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com>
|
||||
|
||||
* gcc.target/s390/stack-clash-3.c: New test.
|
||||
|
|
17
gcc/testsuite/gcc.target/s390/stack-clash-1.c
Normal file
17
gcc/testsuite/gcc.target/s390/stack-clash-1.c
Normal file
|
@ -0,0 +1,17 @@
|
|||
/* Make sure a stack probe is emitted also for the remaining bytes
|
||||
after the loop probing the large chunk. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -march=z9-ec -fstack-clash-protection" } */
|
||||
|
||||
void large_stack() {
|
||||
volatile int stack[8000];
|
||||
int i;
|
||||
for (i = 0; i < sizeof(stack) / sizeof(int); ++i)
|
||||
stack[i] = i;
|
||||
}
|
||||
|
||||
/* We use a compare for the stack probe. There needs to be one inside
|
||||
a loop and another for the remaining bytes. */
|
||||
/* { dg-final { scan-assembler-times "cg\t" 2 { target lp64 } } } */
|
||||
/* { dg-final { scan-assembler-times "c\t" 2 { target { ! lp64 } } } } */
|
Loading…
Add table
Reference in a new issue