]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
reorg.c (find_end_label): If the basic block reorder pass moves the return insn to...
authorHerman A.J. ten Brugge <Haj.Ten.Brugge@net.HCC.nl>
Thu, 7 Sep 2000 15:18:46 +0000 (17:18 +0200)
committerJeff Law <law@gcc.gnu.org>
Thu, 7 Sep 2000 15:18:46 +0000 (09:18 -0600)
* 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

gcc/ChangeLog
gcc/reorg.c

index 186abc4e9cd93d5e1294c39657bf095303bb6f5b..0cbe30760bdc487b94abff3eb6012fd8212af2db 100644 (file)
@@ -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
index 99f24c8bca4d3c08b08fea5989943b7a2f9f3431..00cafffe8647a8abf7fada2020290853afebb6e7 100644 (file)
@@ -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