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.
(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;
})
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O1 -m31 -mzarch -fstack-clash-protection" } */
+
+extern void c(char*);
+
+void
+a() {
+ char *b = __builtin_alloca(3);
+ c(b);
+}