aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Krebbel <krebbel@linux.ibm.com>2020-12-03 17:04:11 +0100
committerAndreas Krebbel <krebbel@linux.ibm.com>2020-12-03 17:04:17 +0100
commit65af6bc9f87bc6b329fb7a16e3f736dd0a042bf5 (patch)
treef40c2b131e94a2569c553d0c3f7745229d8d2a37
parent62fb1b9e0da44a15b0434def20724f989d61e27b (diff)
downloadgcc-65af6bc9f87bc6b329fb7a16e3f736dd0a042bf5.zip
gcc-65af6bc9f87bc6b329fb7a16e3f736dd0a042bf5.tar.gz
gcc-65af6bc9f87bc6b329fb7a16e3f736dd0a042bf5.tar.bz2
IBM Z: Fix mode in probe_stack pattern
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.
-rw-r--r--gcc/config/s390/s390.md6
-rw-r--r--gcc/testsuite/gcc.target/s390/stack-clash-4.c10
2 files changed, 13 insertions, 3 deletions
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md
index d4cfbdf..d6d8965 100644
--- a/gcc/config/s390/s390.md
+++ b/gcc/config/s390/s390.md
@@ -11116,8 +11116,8 @@
(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)]
"")
@@ -11125,7 +11125,7 @@
[(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
index 0000000..619d99d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/stack-clash-4.c
@@ -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);
+}