aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.ibm.com>2020-05-14 08:16:27 +0200
committerAndreas Krebbel <krebbel@linux.ibm.com>2020-05-14 08:16:27 +0200
commit0473885be8b2a7aa0d5064a16c004116162f473f (patch)
tree622f63b224d544c7b07834cab5bfe023336c5214
parent868d351e232371eec4b40e83014a617d0d46f985 (diff)
downloadgcc-0473885be8b2a7aa0d5064a16c004116162f473f.zip
gcc-0473885be8b2a7aa0d5064a16c004116162f473f.tar.gz
gcc-0473885be8b2a7aa0d5064a16c004116162f473f.tar.bz2
IBM Z: Define probe_stack expander
Probes emitted by the common code routines still use a store. Define the "probe_stack" pattern to use a compare instead. gcc/ChangeLog: 2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com> * config/s390/s390.c (s390_emit_stack_probe): Call the probe_stack expander. * config/s390/s390.md ("@probe_stack2<mode>", "probe_stack"): New expanders. gcc/testsuite/ChangeLog: 2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com> * gcc.target/s390/stack-clash-2.c: New test.
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/s390/s390.c7
-rw-r--r--gcc/config/s390/s390.md16
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/s390/stack-clash-2.c17
5 files changed, 46 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 51d3e42..5c2366e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com>
+ * config/s390/s390.c (s390_emit_stack_probe): Call the probe_stack
+ expander.
+ * config/s390/s390.md ("@probe_stack2<mode>", "probe_stack"): New
+ expanders.
+
+2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com>
+
* config/s390/s390.c (allocate_stack_space): Add missing updates
of last_probe_offset.
diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index b489725..4de3129 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -10946,10 +10946,9 @@ s390_prologue_plus_offset (rtx target, rtx reg, rtx offset, bool frame_related_p
static void
s390_emit_stack_probe (rtx addr)
{
- rtx tmp = gen_rtx_MEM (Pmode, addr);
- MEM_VOLATILE_P (tmp) = 1;
- s390_emit_compare (EQ, gen_rtx_REG (Pmode, 0), tmp);
- emit_insn (gen_blockage ());
+ rtx mem = gen_rtx_MEM (Pmode, addr);
+ MEM_VOLATILE_P (mem) = 1;
+ emit_insn (gen_probe_stack (mem));
}
/* Use a runtime loop if we have to emit more probes than this. */
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index 908de58..cd1c063 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -11017,8 +11017,22 @@
emit_move_insn (operands[0], virtual_stack_dynamic_rtx);
DONE;
-})
+ })
+
+(define_expand "@probe_stack2<mode>"
+ [(set (reg:CCZ CC_REGNUM)
+ (compare:CCZ (reg:P 0)
+ (match_operand 0 "memory_operand")))
+ (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
+ "")
+(define_expand "probe_stack"
+ [(match_operand 0 "memory_operand")]
+ ""
+{
+ emit_insn (gen_probe_stack2 (Pmode, operands[0]));
+ DONE;
+})
;
; setjmp instruction pattern.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8ff0bbc..498ebb7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2020-05-14 Andreas Krebbel <krebbel@linux.ibm.com>
+ * gcc.target/s390/stack-clash-2.c: New test.
+
+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>
diff --git a/gcc/testsuite/gcc.target/s390/stack-clash-2.c b/gcc/testsuite/gcc.target/s390/stack-clash-2.c
new file mode 100644
index 0000000..e554ad5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/stack-clash-2.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=z900 -fstack-clash-protection" } */
+
+extern void bar (char *);
+
+void
+foo ()
+{
+ char * mem = __builtin_alloca (20000);
+ bar (mem);
+}
+
+/* For alloca a common code routine emits the probes. Make sure the
+ "probe_stack" expander is used in that case. We want to use mem
+ compares instead of stores. */
+/* { dg-final { scan-assembler-times "cg\t" 5 { target lp64 } } } */
+/* { dg-final { scan-assembler-times "c\t" 5 { target { ! lp64 } } } } */