aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1994-12-28 18:39:10 -0800
committerJim Wilson <wilson@gcc.gnu.org>1994-12-28 18:39:10 -0800
commit8c2977e27dc94cd658658ca9bc48875019c434fc (patch)
tree5bf32a1048cb73221b4777734b8a0df423a3872a /gcc
parent40d2032bdfbfe0c8f3c80f69235c91a570ce0967 (diff)
downloadgcc-8c2977e27dc94cd658658ca9bc48875019c434fc.zip
gcc-8c2977e27dc94cd658658ca9bc48875019c434fc.tar.gz
gcc-8c2977e27dc94cd658658ca9bc48875019c434fc.tar.bz2
(fill_simple_delay_slots): For the epilogue case...
(fill_simple_delay_slots): For the epilogue case, set needed to include frame pointer and stack pointer, don't include all of end_of_function_needs. Reject insn if it sets a previously set resource. From-SVN: r8698
Diffstat (limited to 'gcc')
-rw-r--r--gcc/reorg.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/gcc/reorg.c b/gcc/reorg.c
index cd7d652..e4058d7 100644
--- a/gcc/reorg.c
+++ b/gcc/reorg.c
@@ -3146,9 +3146,27 @@ fill_simple_delay_slots (first, non_jumps_p)
return;
slots_filled = 0;
- needed = end_of_function_needs;
CLEAR_RESOURCE (&set);
+ /* The frame pointer and stack pointer are needed at the beginning of
+ the epilogue, so instructions setting them can not be put in the
+ epilogue delay slot. However, everything else needed at function
+ end is safe, so we don't want to use end_of_function_needs here. */
+ CLEAR_RESOURCE (&needed);
+ if (frame_pointer_needed)
+ {
+ SET_HARD_REG_BIT (needed.regs, FRAME_POINTER_REGNUM);
+#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
+ SET_HARD_REG_BIT (needed.regs, HARD_FRAME_POINTER_REGNUM);
+#endif
+#ifdef EXIT_IGNORE_STACK
+ if (! EXIT_IGNORE_STACK)
+#endif
+ SET_HARD_REG_BIT (needed.regs, STACK_POINTER_REGNUM);
+ }
+ else
+ SET_HARD_REG_BIT (needed.regs, STACK_POINTER_REGNUM);
+
for (trial = get_last_insn (); ! stop_search_p (trial, 1);
trial = PREV_INSN (trial))
{
@@ -3160,6 +3178,7 @@ fill_simple_delay_slots (first, non_jumps_p)
if (! insn_references_resource_p (trial, &set, 1)
&& ! insn_sets_resource_p (trial, &needed, 1)
+ && ! insn_sets_resource_p (trial, &set, 1)
#ifdef HAVE_cc0
/* Don't want to mess with cc0 here. */
&& ! reg_mentioned_p (cc0_rtx, pat)