diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2007-07-06 10:53:15 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2007-07-06 10:53:15 +0200 |
commit | 56d17681225aa3b26dd0ca0958fe9c4a329b07f4 (patch) | |
tree | 4c202a505d41f55e7d51a4801eabc48fc89c16b9 /gcc/function.c | |
parent | 042f720de169cce9094e54e01e2f3b4bde4b63b3 (diff) | |
download | gcc-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.c | 19 |
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 (); |