aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-03-29 12:42:51 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-03-29 12:42:51 +0100
commita6240447c4eb5e683cf439fa2f3cff3773f6d6fb (patch)
treef2977d6c6568cfb8342e14782ea3ae4cdf095ae4 /gcc/function.c
parent34f95cbdc5310b9ca88df0a705b615b03b685e65 (diff)
downloadgcc-a6240447c4eb5e683cf439fa2f3cff3773f6d6fb.zip
gcc-a6240447c4eb5e683cf439fa2f3cff3773f6d6fb.tar.gz
gcc-a6240447c4eb5e683cf439fa2f3cff3773f6d6fb.tar.bz2
re PR rtl-optimization/87485 (Compile time hog w/ -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)
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/gcc/function.c b/gcc/function.c
index bf5ba3d..c6e862b 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -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