aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2002-06-16 18:54:43 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2002-06-16 18:54:43 +0000
commitc134da6b7748136088781e3f19c0f2ced109a4b0 (patch)
treeda9fbd6b307a08f8f2e1193f8f41e1127e4d7848
parent038c79764b247f03fb5dfc2943cc32a8b3e15b6e (diff)
downloadgcc-c134da6b7748136088781e3f19c0f2ced109a4b0.zip
gcc-c134da6b7748136088781e3f19c0f2ced109a4b0.tar.gz
gcc-c134da6b7748136088781e3f19c0f2ced109a4b0.tar.bz2
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/cris/cris.md5
-rw-r--r--gcc/reorg.c11
3 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e648f37..eaa6d06 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2002-06-16 Hans-Peter Nilsson <hp@axis.com>
+
+ 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 <law@redhat.com>
* 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 1e61134..c92ec7f 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 3e3052d..2ccde4f 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. */