From 07f5b9aa23b577dd5e3de82b71e7d66e148a3888 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 30 Jun 1997 14:56:46 -0600 Subject: [PATCH] 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 --- gcc/config/sh/sh.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index fb723ba5b34..30406f66acb 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -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. */ -- 2.30.2