S/390: Fix PR84332 ICE with stack clash protection
authorAndreas Krebbel <krebbel@linux.ibm.com>
Thu, 9 Aug 2018 07:06:23 +0000 (07:06 +0000)
committerAndreas Krebbel <krebbel@gcc.gnu.org>
Thu, 9 Aug 2018 07:06:23 +0000 (07:06 +0000)
Our implementation of the stack probe requires the probe interval to
be used as displacement in an address operand.  The maximum probe
interval currently is 64k.  This would exceed short displacements.
Trim that value down to 4k if that happens.  This might result in too
many probes being generated only on the oldest supported machine level
z900.

gcc/ChangeLog:

2018-08-09  Andreas Krebbel  <krebbel@linux.ibm.com>

PR target/84332
* config/s390/s390.c (s390_option_override_internal): Reduce the
stack-clash-protection-probe-interval param if it would be too big
for z900.

gcc/testsuite/ChangeLog:

2018-08-09  Andreas Krebbel  <krebbel@linux.ibm.com>

PR target/84332
* gcc.target/s390/pr84332.c: New testcase.

From-SVN: r263441

gcc/ChangeLog
gcc/config/s390/s390.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/s390/pr84332.c [new file with mode: 0644]

index e8f65c97911d37ac342c1140a84330f64188bffc..e2ae04db139ca2e39bc8843b4962a413e246a29e 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-09  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       PR target/84332
+       * config/s390/s390.c (s390_option_override_internal): Reduce the
+       stack-clash-protection-probe-interval param if it would be too big
+       for z900.
+
 2018-08-08  Andreas Schwab  <schwab@linux-m68k.org>
 
        PR target/46179
index d533a3fcb4e156a233b314c225002c9f4946860f..d5511d01192d8b8aa948b495aa9d3ce74b7af432 100644 (file)
@@ -14983,6 +14983,17 @@ s390_option_override_internal (struct gcc_options *opts,
   else if (opts->x_s390_stack_guard)
     error ("-mstack-guard implies use of -mstack-size");
 
+  /* Our implementation of the stack probe requires the probe interval
+     to be used as displacement in an address operand.  The maximum
+     probe interval currently is 64k.  This would exceed short
+     displacements.  Trim that value down to 4k if that happens.  This
+     might result in too many probes being generated only on the
+     oldest supported machine level z900.  */
+  if (!DISP_IN_RANGE ((1 << PARAM_VALUE (PARAM_STACK_CLASH_PROTECTION_PROBE_INTERVAL))))
+    set_param_value ("stack-clash-protection-probe-interval", 12,
+                    opts->x_param_values,
+                    opts_set->x_param_values);
+
 #ifdef TARGET_DEFAULT_LONG_DOUBLE_128
   if (!TARGET_LONG_DOUBLE_128_P (opts_set->x_target_flags))
     opts->x_target_flags |= MASK_LONG_DOUBLE_128;
index 779b50f98ed31475ee77e7d9f6afdec8cc1ccbe4..592e3ecf2abeb38ce96f36f40fcfdb08903898fc 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-09  Andreas Krebbel  <krebbel@linux.ibm.com>
+
+       PR target/84332
+       * gcc.target/s390/pr84332.c: New testcase.
+
 2018-08-08  Andreas Schwab  <schwab@linux-m68k.org>
 
        PR target/46179
diff --git a/gcc/testsuite/gcc.target/s390/pr84332.c b/gcc/testsuite/gcc.target/s390/pr84332.c
new file mode 100644 (file)
index 0000000..3dec99f
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+/* { dg-options "-march=z900 -fstack-clash-protection --param stack-clash-protection-probe-interval=16" } */
+
+struct b
+{
+  char a[65536];
+};
+
+void c (void) { struct b d; }