IBM Z: Define probe_stack expander
authorAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 14 May 2020 06:16:27 +0000 (08:16 +0200)
committerAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 14 May 2020 06:16:27 +0000 (08:16 +0200)
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.

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/config/s390/s390.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/stack-clash-2.c [new file with mode: 0644]

index 51d3e425ad5c96e2dfcb1604b1f4206c2082cf60..5c2366e36711e0bb5378a41b49d49470403a8b6c 100644 (file)
@@ -1,3 +1,10 @@
+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
index b4897256af5bcd401d3e58bbde4b904bae94e947..4de3129f88ef7c6415c3db9eed75ba428f3e4a4e 100644 (file)
@@ -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.  */
index 908de587e171ce5f3a39f7a3447ba15c87e34cba..cd1c0634b7149669da354f5f763cf48b862c93f4 100644 (file)
 
   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.
index 8ff0bbcc85b4f1cdad08527beb7326cf005ba45b..498ebb7f6786420e5dd09f36f02975bc23b94f3e 100644 (file)
@@ -1,3 +1,7 @@
+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.
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 (file)
index 0000000..e554ad5
--- /dev/null
@@ -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 } } } } */