aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/reorg.c46
2 files changed, 42 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 186abc4..0cbe307 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2000-09-07 Herman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
+
+ * reorg.c (find_end_label): If the basic block reorder pass moves the
+ return insn to some other place try to locate it again and put our
+ end_of_function_label there.
+ * reorg.c (relax_delay_slots): Check if find_end_label created a
+ new label that invalidates the current optimazation.
+
2000-09-07 Catherine Moore <clm@redhat.com>
* unroll.c (unroll_loop): Check for unconditional jumps
diff --git a/gcc/reorg.c b/gcc/reorg.c
index 99f24c8..00cafff 100644
--- a/gcc/reorg.c
+++ b/gcc/reorg.c
@@ -375,22 +375,42 @@ find_end_label ()
end_of_function_label = insn;
else
{
- /* Otherwise, make a new label and emit a RETURN and BARRIER,
- if needed. */
end_of_function_label = gen_label_rtx ();
LABEL_NUSES (end_of_function_label) = 0;
- emit_label (end_of_function_label);
-#ifdef HAVE_return
- if (HAVE_return)
+ /* If the basic block reorder pass moves the return insn to
+ some other place try to locate it again and put our
+ end_of_function_label there. */
+ while (insn && ! (GET_CODE (insn) == JUMP_INSN
+ && (GET_CODE (PATTERN (insn)) == RETURN)))
+ insn = PREV_INSN (insn);
+ if (insn)
{
- /* The return we make may have delay slots too. */
- rtx insn = gen_return ();
- insn = emit_jump_insn (insn);
- emit_barrier ();
- if (num_delay_slots (insn) > 0)
- obstack_ptr_grow (&unfilled_slots_obstack, insn);
+ insn = PREV_INSN (insn);
+
+ /* Put the label before an USE insns that may proceed the
+ RETURN insn. */
+ while (GET_CODE (insn) == USE)
+ insn = PREV_INSN (insn);
+
+ emit_label_after (end_of_function_label, insn);
}
+ else
+ {
+ /* Otherwise, make a new label and emit a RETURN and BARRIER,
+ if needed. */
+ emit_label (end_of_function_label);
+#ifdef HAVE_return
+ if (HAVE_return)
+ {
+ /* The return we make may have delay slots too. */
+ rtx insn = gen_return ();
+ insn = emit_jump_insn (insn);
+ emit_barrier ();
+ if (num_delay_slots (insn) > 0)
+ obstack_ptr_grow (&unfilled_slots_obstack, insn);
+ }
#endif
+ }
}
/* Show one additional use for this label so it won't go away until
@@ -3322,7 +3342,9 @@ relax_delay_slots (first)
if (label == 0)
label = find_end_label ();
- if (redirect_with_delay_slots_safe_p (delay_insn, label, insn))
+ /* find_end_label can generate a new label. Check this first. */
+ if (no_labels_between_p (insn, next)
+ && redirect_with_delay_slots_safe_p (delay_insn, label, insn))
{
/* Be careful how we do this to avoid deleting code or labels
that are momentarily dead. See similar optimization in