aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2007-07-06 10:53:15 +0200
committerUros Bizjak <uros@gcc.gnu.org>2007-07-06 10:53:15 +0200
commit56d17681225aa3b26dd0ca0958fe9c4a329b07f4 (patch)
tree4c202a505d41f55e7d51a4801eabc48fc89c16b9 /gcc/function.c
parent042f720de169cce9094e54e01e2f3b4bde4b63b3 (diff)
downloadgcc-56d17681225aa3b26dd0ca0958fe9c4a329b07f4.zip
gcc-56d17681225aa3b26dd0ca0958fe9c4a329b07f4.tar.gz
gcc-56d17681225aa3b26dd0ca0958fe9c4a329b07f4.tar.bz2
re PR rtl-optimization/32450 (-pg causes miscompilation)
PR rtl_optimization/32450 * function.c (thread_prologue_and_epilogue_insns): Emit blockage insn to ensure that instructions are not moved into the prologue when profiling is on. Remove unused prologue_end variable. (expand_function_end): Emit blockage insn instead of ASM_INPUT rtx as a scheduling barrier. testsuite/ChangeLog: PR rtl_optimization/32450 * gcc.dg/pr32450.c: New runtime test. From-SVN: r126403
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/gcc/function.c b/gcc/function.c
index a01bd93..1477b6a 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -4515,11 +4515,9 @@ expand_function_end (void)
/* @@@ This is a kludge. We want to ensure that instructions that
may trap are not moved into the epilogue by scheduling, because
- we don't always emit unwind information for the epilogue.
- However, not all machine descriptions define a blockage insn, so
- emit an ASM_INPUT to act as one. */
+ we don't always emit unwind information for the epilogue. */
if (! USING_SJLJ_EXCEPTIONS && flag_non_call_exceptions)
- emit_insn (gen_rtx_ASM_INPUT (VOIDmode, ""));
+ emit_insn (gen_blockage ());
/* If stack protection is enabled for this function, check the guard. */
if (cfun->stack_protect_guard)
@@ -5045,9 +5043,6 @@ thread_prologue_and_epilogue_insns (void)
#if defined (HAVE_sibcall_epilogue) || defined (HAVE_epilogue) || defined (HAVE_return) || defined (HAVE_prologue)
rtx seq;
#endif
-#ifdef HAVE_prologue
- rtx prologue_end = NULL_RTX;
-#endif
#if defined (HAVE_epilogue) || defined(HAVE_return)
rtx epilogue_end = NULL_RTX;
#endif
@@ -5067,7 +5062,15 @@ thread_prologue_and_epilogue_insns (void)
/* Retain a map of the prologue insns. */
record_insns (seq, &prologue);
- prologue_end = emit_note (NOTE_INSN_PROLOGUE_END);
+ emit_note (NOTE_INSN_PROLOGUE_END);
+
+#ifndef PROFILE_BEFORE_PROLOGUE
+ /* Ensure that instructions are not moved into the prologue when
+ profiling is on. The call to the profiling routine can be
+ emitted within the live range of a call-clobbered register. */
+ if (current_function_profile)
+ emit_insn (gen_blockage ());
+#endif
seq = get_insns ();
end_sequence ();