From: Herman A.J. ten Brugge Date: Thu, 7 Sep 2000 15:18:46 +0000 (+0200) Subject: reorg.c (find_end_label): If the basic block reorder pass moves the return insn to... X-Git-Tag: prereleases/libstdc++-2.92~4186 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bf6302f0e771555388849d8f525a63231cec79f5;p=thirdparty%2Fgcc.git reorg.c (find_end_label): If the basic block reorder pass moves the return insn to some other place try... * 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. From-SVN: r36237 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 186abc4e9cd9..0cbe30760bdc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2000-09-07 Herman A.J. ten Brugge + + * 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 * unroll.c (unroll_loop): Check for unconditional jumps diff --git a/gcc/reorg.c b/gcc/reorg.c index 99f24c8bca4d..00cafffe8647 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