From c134da6b7748136088781e3f19c0f2ced109a4b0 Mon Sep 17 00:00:00 2001 From: Hans-Peter Nilsson Date: Sun, 16 Jun 2002 18:54:43 +0000 Subject: [PATCH] re PR target/7042 (cris-elf miscompiles line_hints in ghostscript - "return" delay slot bug) PR target/7042 * reorg.c (make_return_insns) [DELAY_SLOTS_FOR_EPILOGUE]: Exit early if current_function_epilogue_delay_list is non-empty. * config/cris/cris.md ("return"): Add sanity check asserting that current_function_epilogue_delay_list is empty. From-SVN: r54668 --- gcc/ChangeLog | 8 ++++++++ gcc/config/cris/cris.md | 5 +++++ gcc/reorg.c | 11 +++++++++++ 3 files changed, 24 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e648f376895..eaa6d067c81 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2002-06-16 Hans-Peter Nilsson + + PR target/7042 + * reorg.c (make_return_insns) [DELAY_SLOTS_FOR_EPILOGUE]: Exit + early if current_function_epilogue_delay_list is non-empty. + * config/cris/cris.md ("return"): Add sanity check asserting that + current_function_epilogue_delay_list is empty. + 2002-06-16 Jeff Law * toplev.c (rest_of_compilation): Perform a simpler, less costly diff --git a/gcc/config/cris/cris.md b/gcc/config/cris/cris.md index 1e611342e6b..c92ec7fd2a4 100644 --- a/gcc/config/cris/cris.md +++ b/gcc/config/cris/cris.md @@ -3394,6 +3394,11 @@ /* Just needs to hold a 'movem [sp+],rN'. */ char rd[sizeof (\"movem [$sp+],$r99\")]; + /* Try to avoid reorg.c surprises; avoid emitting invalid code, prefer + crashing. This test would have avoided invalid code for target/7042. */ + if (current_function_epilogue_delay_list != NULL) + abort (); + *rd = 0; /* Start from the last call-saved register. We know that we have a diff --git a/gcc/reorg.c b/gcc/reorg.c index 3e3052dff9d..2ccde4fdf36 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -3485,6 +3485,17 @@ make_return_insns (first) rtx real_return_label = end_of_function_label; int slots, i; +#ifdef DELAY_SLOTS_FOR_EPILOGUE + /* If a previous pass filled delay slots in the epilogue, things get a + bit more complicated, as those filler insns would generally (without + data flow analysis) have to be executed after any existing branch + delay slot filler insns. It is also unknown whether such a + transformation would actually be profitable. Note that the existing + code only cares for branches with (some) filled delay slots. */ + if (current_function_epilogue_delay_list != NULL) + return; +#endif + /* See if there is a RETURN insn in the function other than the one we made for END_OF_FUNCTION_LABEL. If so, set up anything we can't change into a RETURN to jump to it. */ -- 2.30.2