re PR rtl-optimization/87485 (Compile time hog w/ -O2 -fschedule-insns -fno-guess...
authorJakub Jelinek <jakub@redhat.com>
Fri, 29 Mar 2019 11:42:51 +0000 (12:42 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 29 Mar 2019 11:42:51 +0000 (12:42 +0100)
PR rtl-optimization/87485
* function.c (expand_function_end): Move stack_protect_epilogue
before loading of return value into hard register(s).

* gcc.dg/pr87485.c: New test.

From-SVN: r270013

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr87485.c [new file with mode: 0644]

index 167c37e737293fe79f22dee7af46d90d97d14378..155d208961b1f69cddce69831e9b3987c0bdd476 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/87485
+       * function.c (expand_function_end): Move stack_protect_epilogue
+       before loading of return value into hard register(s).
+
 2019-03-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/89621
index bf5ba3d7b73e3f3869a9961f3cc91be8fa4d8f50..c6e862b3369c78d0561574109a845b895ebfd4df 100644 (file)
@@ -5330,6 +5330,12 @@ expand_function_end (void)
      communicate between __builtin_eh_return and the epilogue.  */
   expand_eh_return ();
 
+  /* If stack protection is enabled for this function, check the guard.  */
+  if (crtl->stack_protect_guard
+      && targetm.stack_protect_runtime_enabled_p ()
+      && naked_return_label == NULL_RTX)
+    stack_protect_epilogue ();
+
   /* If scalar return value was computed in a pseudo-reg, or was a named
      return value that got dumped to the stack, copy that to the hard
      return register.  */
@@ -5476,7 +5482,9 @@ expand_function_end (void)
     emit_insn (gen_blockage ());
 
   /* If stack protection is enabled for this function, check the guard.  */
-  if (crtl->stack_protect_guard && targetm.stack_protect_runtime_enabled_p ())
+  if (crtl->stack_protect_guard
+      && targetm.stack_protect_runtime_enabled_p ()
+      && naked_return_label)
     stack_protect_epilogue ();
 
   /* If we had calls to alloca, and this machine needs
index 1c483614208741c10b3df2543758482efab0024c..07274c620c854db6287e3843ba76f7050323ffd3 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/87485
+       * gcc.dg/pr87485.c: New test.
+
 2019-03-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/89621
diff --git a/gcc/testsuite/gcc.dg/pr87485.c b/gcc/testsuite/gcc.dg/pr87485.c
new file mode 100644 (file)
index 0000000..7e09173
--- /dev/null
@@ -0,0 +1,29 @@
+/* PR rtl-optimization/87485 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O2 -fschedule-insns -fno-guess-branch-probability -fno-isolate-erroneous-paths-dereference -fno-omit-frame-pointer -fno-split-wide-types -fno-tree-ccp -fno-tree-sra" } */
+/* { dg-additional-options "-fstack-protector-strong" { target fstack_protector } } */
+
+int *a;
+
+int
+foo (__int128 x, int y, int z)
+{
+  __int128 b;
+  *a = ((!!y ? y : x) * y | x) * 2;
+  if (z == 0)
+    {
+      unsigned int c = 1;
+      __int128 *d = &b;
+      for (*a = 0; *a < 1; *a += y)
+       ;
+      *a += b < (c / 0);       /* { dg-warning "division by zero" } */
+      goto l;
+ m:
+      while (b < 1)
+       ;
+      ++*a;
+    }
+  goto m;
+ l:
+  return 0;
+}