[explow] PR target/85173: validize memory before passing it on to target probe_stack
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Tue, 10 Apr 2018 09:58:57 +0000 (09:58 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Tue, 10 Apr 2018 09:58:57 +0000 (09:58 +0000)
In this PR the expansion code emits an invalid memory address for the stack probe, which the backend fails to recognise.
The address is created explicitly in anti_adjust_stack_and_probe_stack_clash in explow.c and passed down to gen_probe_stack
without any validation in emit_stack_probe.

This patch fixes the ICE by calling validize_mem on the memory location before passing it down to the target.
Jakub pointed out that we also want to create valid addresses for the probe_stack_address case, so this patch
creates an expand operand and legitimizes it before passing it down to the probe_stack_address expander.

This patch passes bootstrap and testing on arm-none-linux-gnueabihf and aarch64-none-linux-gnu
and ppc64le-redhat-linux on gcc112 in the compile farm.

PR target/85173
* explow.c (emit_stack_probe): Call validize_mem on memory location
before passing it to gen_probe_stack.  Create address operand and
legitimize it for the probe_stack_address case.

* gcc.target/arm/pr85173.c: New test.

From-SVN: r259266

gcc/ChangeLog
gcc/explow.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr85173.c [new file with mode: 0644]

index 0f5a8b2..805b4b4 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR target/85173
+       * explow.c (emit_stack_probe): Call validize_mem on memory location
+       before passing it to gen_probe_stack.  Create address operand and
+       legitimize it for the probe_stack_address case.
+
 2018-04-09  Jan Hubicka  <jh@suse.cz>
 
        PR lto/85078
index 042e719..fb2b7ff 100644 (file)
@@ -1626,18 +1626,25 @@ void
 emit_stack_probe (rtx address)
 {
   if (targetm.have_probe_stack_address ())
-    emit_insn (targetm.gen_probe_stack_address (address));
+    {
+      struct expand_operand ops[1];
+      insn_code icode = targetm.code_for_probe_stack_address;
+      create_address_operand (ops, address);
+      maybe_legitimize_operands (icode, 0, 1, ops);
+      expand_insn (icode, 1, ops);
+    }
   else
     {
       rtx memref = gen_rtx_MEM (word_mode, address);
 
       MEM_VOLATILE_P (memref) = 1;
+      memref = validize_mem (memref);
 
       /* See if we have an insn to probe the stack.  */
       if (targetm.have_probe_stack ())
-        emit_insn (targetm.gen_probe_stack (memref));
+       emit_insn (targetm.gen_probe_stack (memref));
       else
-        emit_move_insn (memref, const0_rtx);
+       emit_move_insn (memref, const0_rtx);
     }
 }
 
index de04c8b..f7ca834 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR target/85173
+       * gcc.target/arm/pr85173.c: New test.
+
 2018-04-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR lto/85248
diff --git a/gcc/testsuite/gcc.target/arm/pr85173.c b/gcc/testsuite/gcc.target/arm/pr85173.c
new file mode 100644 (file)
index 0000000..36105c9
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR target/85173.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fstack-clash-protection --param stack-clash-protection-probe-interval=14" } */
+/* { dg-require-effective-target arm_thumb2_ok } */
+
+__attribute__((noinline, noclone)) void
+foo (char *p)
+{
+  asm volatile ("" : : "r" (p) : "memory");
+}
+
+/* Nonconstant alloca, small local frame.  */
+__attribute__((noinline, noclone)) void
+f5 (int x)
+{
+  char locals[128];
+  char *vla = __builtin_alloca (x);
+  foo (vla);
+}