sh.c (sh_expand_epilogue): Emit a blockage insn before cutting back the stack.

* sh.c (sh_expand_epilogue): Emit a blockage insn before
        cutting back the stack.

From-SVN: r14362
This commit is contained in:
Jeff Law 1997-06-30 14:56:46 -06:00
parent 38c1f2d7e6
commit 07f5b9aa23
1 changed files with 15 additions and 6 deletions

View File

@ -2705,15 +2705,24 @@ sh_expand_epilogue ()
if (frame_pointer_needed)
{
/* We deliberately make the add dependent on the frame_pointer,
to ensure that instruction scheduling won't move the stack pointer
adjust before instructions reading from the frame. This can fail
if there is an interrupt which then writes to the stack. */
output_stack_adjust (get_frame_size (), frame_pointer_rtx, 7);
/* We must avoid moving the stack pointer adjustment past code
which reads from the local frame, else an interrupt could
occur after the SP adjustment and clobber data in the local
frame. */
emit_insn (gen_blockage ());
emit_insn (gen_movsi (stack_pointer_rtx, frame_pointer_rtx));
}
else
output_stack_adjust (get_frame_size (), stack_pointer_rtx, 7);
else if (get_frame_size ())
{
/* We must avoid moving the stack pointer adjustment past code
which reads from the local frame, else an interrupt could
occur after the SP adjustment and clobber data in the local
frame. */
emit_insn (gen_blockage ());
output_stack_adjust (get_frame_size (), stack_pointer_rtx, 7);
}
/* Pop all the registers. */