+2007-07-06 Uros Bizjak <ubizjak@gmail.com>
+
+ 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.
+
2007-07-06 Alexandre Oliva <aoliva@redhat.com>
PR debug/23551
/* @@@ 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)
#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
/* 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 ();
--- /dev/null
+/* Contributed by Joost VandeVondele <jv244@cam.ac.uk> */
+
+/* { dg-do run } */
+/* { dg-require-profiling "-pg" } */
+/* { dg-options "-O2 -pg" } */
+/* { dg-options "-O2 -pg -mtune=core2" { target { i?86-*-* x86_64-*-* } } } */
+/* { dg-options "-O2 -pg -static" { target hppa*-*-hpux* } } */
+
+extern void abort (void);
+
+int stack_pointer;
+
+void
+__attribute__((noinline))
+mystop ()
+{
+ abort ();
+}
+
+void
+__attribute__((noinline))
+add ()
+{
+ if (stack_pointer + 1 > 10)
+ mystop ();
+
+ stack_pointer = stack_pointer + 1;
+}
+
+int main ()
+{
+ add ();
+ return stack_pointer - 1;
+}