IBM Z: Fix mode in probe_stack pattern
authorAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 3 Dec 2020 16:04:11 +0000 (17:04 +0100)
committerAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 3 Dec 2020 16:04:17 +0000 (17:04 +0100)
The probe pattern uses Pmode but the middle-end wants to emit a
word_mode probe check.  This - as usual - breaks on Z with -m31
-mzarch were word_mode doesn't match Pmode.

gcc/ChangeLog:

* config/s390/s390.md ("@probe_stack2<mode>"): Change mode
iterator to W.

gcc/testsuite/ChangeLog:

* gcc.target/s390/stack-clash-4.c: New test.

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

index d4cfbdf..d6d8965 100644 (file)
 
 (define_expand "@probe_stack2<mode>"
   [(set (reg:CCZ CC_REGNUM)
-       (compare:CCZ (reg:P 0)
-                    (match_operand 0 "memory_operand")))
+       (compare:CCZ (reg:W 0)
+                    (match_operand:W 0 "memory_operand")))
    (unspec_volatile [(const_int 0)] UNSPECV_BLOCKAGE)]
   "")
 
   [(match_operand 0 "memory_operand")]
   ""
 {
-  emit_insn (gen_probe_stack2 (Pmode, operands[0]));
+  emit_insn (gen_probe_stack2 (word_mode, operands[0]));
   DONE;
 })
 
diff --git a/gcc/testsuite/gcc.target/s390/stack-clash-4.c b/gcc/testsuite/gcc.target/s390/stack-clash-4.c
new file mode 100644 (file)
index 0000000..619d99d
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -m31 -mzarch -fstack-clash-protection" } */
+
+extern void c(char*);
+
+void
+a() {
+  char *b = __builtin_alloca(3);
+  c(b);
+}