OSDN Git Service

2009-10-16 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / reorg.c
index e4655d2..4871b0e 100644 (file)
@@ -1,6 +1,7 @@
 /* Perform instruction reorganizations for delay slot filling.
 /* Perform instruction reorganizations for delay slot filling.
-   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+   Free Software Foundation, Inc.
    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu).
    Hacked by Michael Tiemann (tiemann@cygnus.com).
 
    Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu).
    Hacked by Michael Tiemann (tiemann@cygnus.com).
 
@@ -8,7 +9,7 @@ This file is part of GCC.
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
 
 GCC is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -17,9 +18,8 @@ FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 /* Instruction reorganization pass.
 
 
 /* Instruction reorganization pass.
 
@@ -173,8 +173,8 @@ static int max_uid;
 
 static int stop_search_p (rtx, int);
 static int resource_conflicts_p (struct resources *, struct resources *);
 
 static int stop_search_p (rtx, int);
 static int resource_conflicts_p (struct resources *, struct resources *);
-static int insn_references_resource_p (rtx, struct resources *, int);
-static int insn_sets_resource_p (rtx, struct resources *, int);
+static int insn_references_resource_p (rtx, struct resources *, bool);
+static int insn_sets_resource_p (rtx, struct resources *, bool);
 static rtx find_end_label (void);
 static rtx emit_delay_sequence (rtx, rtx, int);
 static rtx add_to_delay_list (rtx, rtx);
 static rtx find_end_label (void);
 static rtx emit_delay_sequence (rtx, rtx, int);
 static rtx add_to_delay_list (rtx, rtx);
@@ -211,7 +211,8 @@ static void update_reg_dead_notes (rtx, rtx);
 static void fix_reg_dead_note (rtx, rtx);
 static void update_reg_unused_notes (rtx, rtx);
 static void fill_simple_delay_slots (int);
 static void fix_reg_dead_note (rtx, rtx);
 static void update_reg_unused_notes (rtx, rtx);
 static void fill_simple_delay_slots (int);
-static rtx fill_slots_from_thread (rtx, rtx, rtx, rtx, int, int, int, int,
+static rtx fill_slots_from_thread (rtx, rtx, rtx, rtx,
+                                  int, int, int, int,
                                   int *, rtx);
 static void fill_eager_delay_slots (void);
 static void relax_delay_slots (rtx);
                                   int *, rtx);
 static void fill_eager_delay_slots (void);
 static void relax_delay_slots (rtx);
@@ -296,7 +297,7 @@ resource_conflicts_p (struct resources *res1, struct resources *res2)
 
 static int
 insn_references_resource_p (rtx insn, struct resources *res,
 
 static int
 insn_references_resource_p (rtx insn, struct resources *res,
-                           int include_delayed_effects)
+                           bool include_delayed_effects)
 {
   struct resources insn_res;
 
 {
   struct resources insn_res;
 
@@ -312,12 +313,15 @@ insn_references_resource_p (rtx insn, struct resources *res,
 
 static int
 insn_sets_resource_p (rtx insn, struct resources *res,
 
 static int
 insn_sets_resource_p (rtx insn, struct resources *res,
-                     int include_delayed_effects)
+                     bool include_delayed_effects)
 {
   struct resources insn_sets;
 
   CLEAR_RESOURCE (&insn_sets);
 {
   struct resources insn_sets;
 
   CLEAR_RESOURCE (&insn_sets);
-  mark_set_resources (insn, &insn_sets, 0, include_delayed_effects);
+  mark_set_resources (insn, &insn_sets, 0,
+                     (include_delayed_effects
+                      ? MARK_SRC_DEST_CALL
+                      : MARK_SRC_DEST));
   return resource_conflicts_p (&insn_sets, res);
 }
 \f
   return resource_conflicts_p (&insn_sets, res);
 }
 \f
@@ -427,7 +431,7 @@ find_end_label (void)
             epilogue has filled delay-slots; we would have to try and
             move the delay-slot fillers to the delay-slots for the new
             return insn or in front of the new return insn.  */
             epilogue has filled delay-slots; we would have to try and
             move the delay-slot fillers to the delay-slots for the new
             return insn or in front of the new return insn.  */
-         if (current_function_epilogue_delay_list == NULL
+         if (crtl->epilogue_delay_list == NULL
              && HAVE_return)
            {
              /* The return we make may have delay slots too.  */
              && HAVE_return)
            {
              /* The return we make may have delay slots too.  */
@@ -511,6 +515,8 @@ emit_delay_sequence (rtx insn, rtx list, int length)
   INSN_DELETED_P (delay_insn) = 0;
   PREV_INSN (delay_insn) = PREV_INSN (seq_insn);
 
   INSN_DELETED_P (delay_insn) = 0;
   PREV_INSN (delay_insn) = PREV_INSN (seq_insn);
 
+  INSN_LOCATOR (seq_insn) = INSN_LOCATOR (delay_insn);
+
   for (li = list; li; li = XEXP (li, 1), i++)
     {
       rtx tem = XEXP (li, 0);
   for (li = list; li; li = XEXP (li, 1), i++)
     {
       rtx tem = XEXP (li, 0);
@@ -540,7 +546,8 @@ emit_delay_sequence (rtx insn, rtx list, int length)
              remove_note (tem, note);
              break;
 
              remove_note (tem, note);
              break;
 
-           case REG_LABEL:
+           case REG_LABEL_OPERAND:
+           case REG_LABEL_TARGET:
              /* Keep the label reference count up to date.  */
              if (LABEL_P (XEXP (note, 0)))
                LABEL_NUSES (XEXP (note, 0)) ++;
              /* Keep the label reference count up to date.  */
              if (LABEL_P (XEXP (note, 0)))
                LABEL_NUSES (XEXP (note, 0)) ++;
@@ -638,7 +645,7 @@ delete_from_delay_slot (rtx insn)
   prev = PREV_INSN (seq_insn);
   trial = XVECEXP (seq, 0, 0);
   delete_related_insns (seq_insn);
   prev = PREV_INSN (seq_insn);
   trial = XVECEXP (seq, 0, 0);
   delete_related_insns (seq_insn);
-  add_insn_after (trial, prev);
+  add_insn_after (trial, prev, NULL);
 
   /* If there was a barrier after the old SEQUENCE, remit it.  */
   if (had_barrier)
 
   /* If there was a barrier after the old SEQUENCE, remit it.  */
   if (had_barrier)
@@ -788,7 +795,7 @@ optimize_skip (rtx insn)
      In both of these cases, inverting the jump and annulling the delay
      slot give the same effect in fewer insns.  */
   if ((next_trial == next_active_insn (JUMP_LABEL (insn))
      In both of these cases, inverting the jump and annulling the delay
      slot give the same effect in fewer insns.  */
   if ((next_trial == next_active_insn (JUMP_LABEL (insn))
-       && ! (next_trial == 0 && current_function_epilogue_delay_list != 0))
+       && ! (next_trial == 0 && crtl->epilogue_delay_list != 0))
       || (next_trial != 0
          && JUMP_P (next_trial)
          && JUMP_LABEL (insn) == JUMP_LABEL (next_trial)
       || (next_trial != 0
          && JUMP_P (next_trial)
          && JUMP_LABEL (insn) == JUMP_LABEL (next_trial)
@@ -1239,7 +1246,7 @@ steal_delay_list_from_target (rtx insn, rtx condition, rtx seq,
       rtx trial = XEXP (temp, 0);
 
       mark_set_resources (trial, &cc_set, 0, MARK_SRC_DEST_CALL);
       rtx trial = XEXP (temp, 0);
 
       mark_set_resources (trial, &cc_set, 0, MARK_SRC_DEST_CALL);
-      if (insn_references_resource_p (XVECEXP (seq , 0, 0), &cc_set, 0))
+      if (insn_references_resource_p (XVECEXP (seq , 0, 0), &cc_set, false))
        return delay_list;
     }
 
        return delay_list;
     }
 
@@ -1261,9 +1268,9 @@ steal_delay_list_from_target (rtx insn, rtx condition, rtx seq,
       rtx trial = XVECEXP (seq, 0, i);
       int flags;
 
       rtx trial = XVECEXP (seq, 0, i);
       int flags;
 
-      if (insn_references_resource_p (trial, sets, 0)
-         || insn_sets_resource_p (trial, needed, 0)
-         || insn_sets_resource_p (trial, sets, 0)
+      if (insn_references_resource_p (trial, sets, false)
+         || insn_sets_resource_p (trial, needed, false)
+         || insn_sets_resource_p (trial, sets, false)
 #ifdef HAVE_cc0
          /* If TRIAL sets CC0, we can't copy it, so we can't steal this
             delay list.  */
 #ifdef HAVE_cc0
          /* If TRIAL sets CC0, we can't copy it, so we can't steal this
             delay list.  */
@@ -1286,7 +1293,7 @@ steal_delay_list_from_target (rtx insn, rtx condition, rtx seq,
 
       if (! must_annul
          && ((condition == const_true_rtx
 
       if (! must_annul
          && ((condition == const_true_rtx
-              || (! insn_sets_resource_p (trial, other_needed, 0)
+              || (! insn_sets_resource_p (trial, other_needed, false)
                   && ! may_trap_or_fault_p (PATTERN (trial)))))
          ? eligible_for_delay (insn, total_slots_filled, trial, flags)
          : (must_annul || (delay_list == NULL && new_delay_list == NULL))
                   && ! may_trap_or_fault_p (PATTERN (trial)))))
          ? eligible_for_delay (insn, total_slots_filled, trial, flags)
          : (must_annul || (delay_list == NULL && new_delay_list == NULL))
@@ -1361,9 +1368,9 @@ steal_delay_list_from_fallthrough (rtx insn, rtx condition, rtx seq,
 
       /* If TRIAL sets CC0, stealing it will move it too far from the use
         of CC0.  */
 
       /* If TRIAL sets CC0, stealing it will move it too far from the use
         of CC0.  */
-      if (insn_references_resource_p (trial, sets, 0)
-         || insn_sets_resource_p (trial, needed, 0)
-         || insn_sets_resource_p (trial, sets, 0)
+      if (insn_references_resource_p (trial, sets, false)
+         || insn_sets_resource_p (trial, needed, false)
+         || insn_sets_resource_p (trial, sets, false)
 #ifdef HAVE_cc0
          || sets_cc0_p (PATTERN (trial))
 #endif
 #ifdef HAVE_cc0
          || sets_cc0_p (PATTERN (trial))
 #endif
@@ -1380,7 +1387,7 @@ steal_delay_list_from_fallthrough (rtx insn, rtx condition, rtx seq,
 
       if (! must_annul
          && ((condition == const_true_rtx
 
       if (! must_annul
          && ((condition == const_true_rtx
-              || (! insn_sets_resource_p (trial, other_needed, 0)
+              || (! insn_sets_resource_p (trial, other_needed, false)
                   && ! may_trap_or_fault_p (PATTERN (trial)))))
          ? eligible_for_delay (insn, *pslots_filled, trial, flags)
          : (must_annul || delay_list == NULL) && (must_annul = 1,
                   && ! may_trap_or_fault_p (PATTERN (trial)))))
          ? eligible_for_delay (insn, *pslots_filled, trial, flags)
          : (must_annul || delay_list == NULL) && (must_annul = 1,
@@ -1441,7 +1448,8 @@ try_merge_delay_insns (rtx insn, rtx thread)
   if (! annul_p)
     for (i = 1 ; i < num_slots; i++)
       if (XVECEXP (PATTERN (insn), 0, i))
   if (! annul_p)
     for (i = 1 ; i < num_slots; i++)
       if (XVECEXP (PATTERN (insn), 0, i))
-       mark_referenced_resources (XVECEXP (PATTERN (insn), 0, i), &needed, 1);
+       mark_referenced_resources (XVECEXP (PATTERN (insn), 0, i), &needed,
+                                  true);
 
   for (trial = thread; !stop_search_p (trial, 1); trial = next_trial)
     {
 
   for (trial = thread; !stop_search_p (trial, 1); trial = next_trial)
     {
@@ -1460,9 +1468,9 @@ try_merge_delay_insns (rtx insn, rtx thread)
          /* We can't share an insn that sets cc0.  */
          && ! sets_cc0_p (pat)
 #endif
          /* We can't share an insn that sets cc0.  */
          && ! sets_cc0_p (pat)
 #endif
-         && ! insn_references_resource_p (trial, &set, 1)
-         && ! insn_sets_resource_p (trial, &set, 1)
-         && ! insn_sets_resource_p (trial, &needed, 1)
+         && ! insn_references_resource_p (trial, &set, true)
+         && ! insn_sets_resource_p (trial, &set, true)
+         && ! insn_sets_resource_p (trial, &needed, true)
          && (trial = try_split (pat, trial, 0)) != 0
          /* Update next_trial, in case try_split succeeded.  */
          && (next_trial = next_nonnote_insn (trial))
          && (trial = try_split (pat, trial, 0)) != 0
          /* Update next_trial, in case try_split succeeded.  */
          && (next_trial = next_nonnote_insn (trial))
@@ -1493,7 +1501,7 @@ try_merge_delay_insns (rtx insn, rtx thread)
        }
 
       mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
        }
 
       mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
-      mark_referenced_resources (trial, &needed, 1);
+      mark_referenced_resources (trial, &needed, true);
     }
 
   /* See if we stopped on a filled insn.  If we did, try to see if its
     }
 
   /* See if we stopped on a filled insn.  If we did, try to see if its
@@ -1508,15 +1516,15 @@ try_merge_delay_insns (rtx insn, rtx thread)
 
       /* Account for resources set/needed by the filled insn.  */
       mark_set_resources (filled_insn, &set, 0, MARK_SRC_DEST_CALL);
 
       /* Account for resources set/needed by the filled insn.  */
       mark_set_resources (filled_insn, &set, 0, MARK_SRC_DEST_CALL);
-      mark_referenced_resources (filled_insn, &needed, 1);
+      mark_referenced_resources (filled_insn, &needed, true);
 
       for (i = 1; i < XVECLEN (pat, 0); i++)
        {
          rtx dtrial = XVECEXP (pat, 0, i);
 
 
       for (i = 1; i < XVECLEN (pat, 0); i++)
        {
          rtx dtrial = XVECEXP (pat, 0, i);
 
-         if (! insn_references_resource_p (dtrial, &set, 1)
-             && ! insn_sets_resource_p (dtrial, &set, 1)
-             && ! insn_sets_resource_p (dtrial, &needed, 1)
+         if (! insn_references_resource_p (dtrial, &set, true)
+             && ! insn_sets_resource_p (dtrial, &set, true)
+             && ! insn_sets_resource_p (dtrial, &needed, true)
 #ifdef HAVE_cc0
              && ! sets_cc0_p (PATTERN (dtrial))
 #endif
 #ifdef HAVE_cc0
              && ! sets_cc0_p (PATTERN (dtrial))
 #endif
@@ -1525,12 +1533,12 @@ try_merge_delay_insns (rtx insn, rtx thread)
            {
              if (! annul_p)
                {
            {
              if (! annul_p)
                {
-                 rtx new;
+                 rtx new_rtx;
 
                  update_block (dtrial, thread);
 
                  update_block (dtrial, thread);
-                 new = delete_from_delay_slot (dtrial);
+                 new_rtx = delete_from_delay_slot (dtrial);
                  if (INSN_DELETED_P (thread))
                  if (INSN_DELETED_P (thread))
-                   thread = new;
+                   thread = new_rtx;
                  INSN_FROM_TARGET_P (next_to_match) = 0;
                }
              else
                  INSN_FROM_TARGET_P (next_to_match) = 0;
                }
              else
@@ -1547,7 +1555,7 @@ try_merge_delay_insns (rtx insn, rtx thread)
              /* Keep track of the set/referenced resources for the delay
                 slots of any trial insns we encounter.  */
              mark_set_resources (dtrial, &set, 0, MARK_SRC_DEST_CALL);
              /* Keep track of the set/referenced resources for the delay
                 slots of any trial insns we encounter.  */
              mark_set_resources (dtrial, &set, 0, MARK_SRC_DEST_CALL);
-             mark_referenced_resources (dtrial, &needed, 1);
+             mark_referenced_resources (dtrial, &needed, true);
            }
        }
     }
            }
        }
     }
@@ -1563,12 +1571,12 @@ try_merge_delay_insns (rtx insn, rtx thread)
        {
          if (GET_MODE (merged_insns) == SImode)
            {
        {
          if (GET_MODE (merged_insns) == SImode)
            {
-             rtx new;
+             rtx new_rtx;
 
              update_block (XEXP (merged_insns, 0), thread);
 
              update_block (XEXP (merged_insns, 0), thread);
-             new = delete_from_delay_slot (XEXP (merged_insns, 0));
+             new_rtx = delete_from_delay_slot (XEXP (merged_insns, 0));
              if (INSN_DELETED_P (thread))
              if (INSN_DELETED_P (thread))
-               thread = new;
+               thread = new_rtx;
            }
          else
            {
            }
          else
            {
@@ -1622,13 +1630,14 @@ redundant_insn (rtx insn, rtx target, rtx delay_list)
   for (trial = PREV_INSN (target),
         insns_to_search = MAX_DELAY_SLOT_INSN_SEARCH;
        trial && insns_to_search > 0;
   for (trial = PREV_INSN (target),
         insns_to_search = MAX_DELAY_SLOT_INSN_SEARCH;
        trial && insns_to_search > 0;
-       trial = PREV_INSN (trial), --insns_to_search)
+       trial = PREV_INSN (trial))
     {
       if (LABEL_P (trial))
        return 0;
 
     {
       if (LABEL_P (trial))
        return 0;
 
-      if (! INSN_P (trial))
+      if (!NONDEBUG_INSN_P (trial))
        continue;
        continue;
+      --insns_to_search;
 
       pat = PATTERN (trial);
       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
 
       pat = PATTERN (trial);
       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
@@ -1683,7 +1692,7 @@ redundant_insn (rtx insn, rtx target, rtx delay_list)
   CLEAR_RESOURCE (&needed);
   CLEAR_RESOURCE (&set);
   mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
   CLEAR_RESOURCE (&needed);
   CLEAR_RESOURCE (&set);
   mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
-  mark_referenced_resources (insn, &needed, 1);
+  mark_referenced_resources (insn, &needed, true);
 
   /* If TARGET is a SEQUENCE, get the main insn.  */
   if (NONJUMP_INSN_P (target) && GET_CODE (PATTERN (target)) == SEQUENCE)
 
   /* If TARGET is a SEQUENCE, get the main insn.  */
   if (NONJUMP_INSN_P (target) && GET_CODE (PATTERN (target)) == SEQUENCE)
@@ -1695,8 +1704,8 @@ redundant_insn (rtx insn, rtx target, rtx delay_list)
 #endif
       /* The insn requiring the delay may not set anything needed or set by
         INSN.  */
 #endif
       /* The insn requiring the delay may not set anything needed or set by
         INSN.  */
-      || insn_sets_resource_p (target_main, &needed, 1)
-      || insn_sets_resource_p (target_main, &set, 1))
+      || insn_sets_resource_p (target_main, &needed, true)
+      || insn_sets_resource_p (target_main, &set, true))
     return 0;
 
   /* Insns we pass may not set either NEEDED or SET, so merge them for
     return 0;
 
   /* Insns we pass may not set either NEEDED or SET, so merge them for
@@ -1710,14 +1719,15 @@ redundant_insn (rtx insn, rtx target, rtx delay_list)
 
   while (delay_list)
     {
 
   while (delay_list)
     {
-      if (insn_sets_resource_p (XEXP (delay_list, 0), &needed, 1))
+      if (insn_sets_resource_p (XEXP (delay_list, 0), &needed, true))
        return 0;
       delay_list = XEXP (delay_list, 1);
     }
 
   if (NONJUMP_INSN_P (target) && GET_CODE (PATTERN (target)) == SEQUENCE)
     for (i = 1; i < XVECLEN (PATTERN (target), 0); i++)
        return 0;
       delay_list = XEXP (delay_list, 1);
     }
 
   if (NONJUMP_INSN_P (target) && GET_CODE (PATTERN (target)) == SEQUENCE)
     for (i = 1; i < XVECLEN (PATTERN (target), 0); i++)
-      if (insn_sets_resource_p (XVECEXP (PATTERN (target), 0, i), &needed, 1))
+      if (insn_sets_resource_p (XVECEXP (PATTERN (target), 0, i), &needed,
+                               true))
        return 0;
 
   /* Scan backwards until we reach a label or an insn that uses something
        return 0;
 
   /* Scan backwards until we reach a label or an insn that uses something
@@ -1726,10 +1736,11 @@ redundant_insn (rtx insn, rtx target, rtx delay_list)
   for (trial = PREV_INSN (target),
         insns_to_search = MAX_DELAY_SLOT_INSN_SEARCH;
        trial && !LABEL_P (trial) && insns_to_search > 0;
   for (trial = PREV_INSN (target),
         insns_to_search = MAX_DELAY_SLOT_INSN_SEARCH;
        trial && !LABEL_P (trial) && insns_to_search > 0;
-       trial = PREV_INSN (trial), --insns_to_search)
+       trial = PREV_INSN (trial))
     {
     {
-      if (!INSN_P (trial))
+      if (!NONDEBUG_INSN_P (trial))
        continue;
        continue;
+      --insns_to_search;
 
       pat = PATTERN (trial);
       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
 
       pat = PATTERN (trial);
       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
@@ -1776,13 +1787,13 @@ redundant_insn (rtx insn, rtx target, rtx delay_list)
                 we must stop if it sets anything needed or set by INSN.  */
              if ((! INSN_ANNULLED_BRANCH_P (XVECEXP (pat, 0, 0))
                   || ! INSN_FROM_TARGET_P (candidate))
                 we must stop if it sets anything needed or set by INSN.  */
              if ((! INSN_ANNULLED_BRANCH_P (XVECEXP (pat, 0, 0))
                   || ! INSN_FROM_TARGET_P (candidate))
-                 && insn_sets_resource_p (candidate, &needed, 1))
+                 && insn_sets_resource_p (candidate, &needed, true))
                return 0;
            }
 
          /* If the insn requiring the delay slot conflicts with INSN, we
             must stop.  */
                return 0;
            }
 
          /* If the insn requiring the delay slot conflicts with INSN, we
             must stop.  */
-         if (insn_sets_resource_p (XVECEXP (pat, 0, 0), &needed, 1))
+         if (insn_sets_resource_p (XVECEXP (pat, 0, 0), &needed, true))
            return 0;
        }
       else
            return 0;
        }
       else
@@ -1793,7 +1804,7 @@ redundant_insn (rtx insn, rtx target, rtx delay_list)
            return trial;
 
          /* Can't go any further if TRIAL conflicts with INSN.  */
            return trial;
 
          /* Can't go any further if TRIAL conflicts with INSN.  */
-         if (insn_sets_resource_p (trial, &needed, 1))
+         if (insn_sets_resource_p (trial, &needed, true))
            return 0;
        }
     }
            return 0;
        }
     }
@@ -2131,7 +2142,7 @@ fill_simple_delay_slots (int non_jumps_p)
          CLEAR_RESOURCE (&needed);
          CLEAR_RESOURCE (&set);
          mark_set_resources (insn, &set, 0, MARK_SRC_DEST);
          CLEAR_RESOURCE (&needed);
          CLEAR_RESOURCE (&set);
          mark_set_resources (insn, &set, 0, MARK_SRC_DEST);
-         mark_referenced_resources (insn, &needed, 0);
+         mark_referenced_resources (insn, &needed, false);
 
          for (trial = prev_nonnote_insn (insn); ! stop_search_p (trial, 1);
               trial = next_trial)
 
          for (trial = prev_nonnote_insn (insn); ! stop_search_p (trial, 1);
               trial = next_trial)
@@ -2147,9 +2158,9 @@ fill_simple_delay_slots (int non_jumps_p)
 
              /* Check for resource conflict first, to avoid unnecessary
                 splitting.  */
 
              /* Check for resource conflict first, to avoid unnecessary
                 splitting.  */
-             if (! insn_references_resource_p (trial, &set, 1)
-                 && ! insn_sets_resource_p (trial, &set, 1)
-                 && ! insn_sets_resource_p (trial, &needed, 1)
+             if (! insn_references_resource_p (trial, &set, true)
+                 && ! insn_sets_resource_p (trial, &set, true)
+                 && ! insn_sets_resource_p (trial, &needed, true)
 #ifdef HAVE_cc0
                  /* Can't separate set of cc0 from its use.  */
                  && ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
 #ifdef HAVE_cc0
                  /* Can't separate set of cc0 from its use.  */
                  && ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
@@ -2177,7 +2188,7 @@ fill_simple_delay_slots (int non_jumps_p)
                }
 
              mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
                }
 
              mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
-             mark_referenced_resources (trial, &needed, 1);
+             mark_referenced_resources (trial, &needed, true);
            }
        }
 
            }
        }
 
@@ -2248,13 +2259,13 @@ fill_simple_delay_slots (int non_jumps_p)
          if (CALL_P (insn))
            {
              mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
          if (CALL_P (insn))
            {
              mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
-             mark_referenced_resources (insn, &needed, 1);
+             mark_referenced_resources (insn, &needed, true);
              maybe_never = 1;
            }
          else
            {
              mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
              maybe_never = 1;
            }
          else
            {
              mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
-             mark_referenced_resources (insn, &needed, 1);
+             mark_referenced_resources (insn, &needed, true);
              if (JUMP_P (insn))
                target = JUMP_LABEL (insn);
            }
              if (JUMP_P (insn))
                target = JUMP_LABEL (insn);
            }
@@ -2289,9 +2300,9 @@ fill_simple_delay_slots (int non_jumps_p)
                /* See if we have a resource problem before we try to
                   split.  */
                if (GET_CODE (pat) != SEQUENCE
                /* See if we have a resource problem before we try to
                   split.  */
                if (GET_CODE (pat) != SEQUENCE
-                   && ! insn_references_resource_p (trial, &set, 1)
-                   && ! insn_sets_resource_p (trial, &set, 1)
-                   && ! insn_sets_resource_p (trial, &needed, 1)
+                   && ! insn_references_resource_p (trial, &set, true)
+                   && ! insn_sets_resource_p (trial, &set, true)
+                   && ! insn_sets_resource_p (trial, &needed, true)
 #ifdef HAVE_cc0
                    && ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
 #endif
 #ifdef HAVE_cc0
                    && ! (reg_mentioned_p (cc0_rtx, pat) && ! sets_cc0_p (pat))
 #endif
@@ -2315,7 +2326,7 @@ fill_simple_delay_slots (int non_jumps_p)
                  }
 
                mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
                  }
 
                mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
-               mark_referenced_resources (trial, &needed, 1);
+               mark_referenced_resources (trial, &needed, true);
 
                /* Ensure we don't put insns between the setting of cc and the
                   comparison by moving a setting of cc into an earlier delay
 
                /* Ensure we don't put insns between the setting of cc and the
                   comparison by moving a setting of cc into an earlier delay
@@ -2342,9 +2353,9 @@ fill_simple_delay_slots (int non_jumps_p)
              && ! (NONJUMP_INSN_P (next_trial)
                    && GET_CODE (PATTERN (next_trial)) == SEQUENCE)
              && !JUMP_P (next_trial)
              && ! (NONJUMP_INSN_P (next_trial)
                    && GET_CODE (PATTERN (next_trial)) == SEQUENCE)
              && !JUMP_P (next_trial)
-             && ! insn_references_resource_p (next_trial, &set, 1)
-             && ! insn_sets_resource_p (next_trial, &set, 1)
-             && ! insn_sets_resource_p (next_trial, &needed, 1)
+             && ! insn_references_resource_p (next_trial, &set, true)
+             && ! insn_sets_resource_p (next_trial, &set, true)
+             && ! insn_sets_resource_p (next_trial, &needed, true)
 #ifdef HAVE_cc0
              && ! reg_mentioned_p (cc0_rtx, PATTERN (next_trial))
 #endif
 #ifdef HAVE_cc0
              && ! reg_mentioned_p (cc0_rtx, PATTERN (next_trial))
 #endif
@@ -2406,7 +2417,7 @@ fill_simple_delay_slots (int non_jumps_p)
      The only thing we can do is scan backwards from the end of the
      function.  If we did this in a previous pass, it is incorrect to do it
      again.  */
      The only thing we can do is scan backwards from the end of the
      function.  If we did this in a previous pass, it is incorrect to do it
      again.  */
-  if (current_function_epilogue_delay_list)
+  if (crtl->epilogue_delay_list)
     return;
 
   slots_to_fill = DELAY_SLOTS_FOR_EPILOGUE;
     return;
 
   slots_to_fill = DELAY_SLOTS_FOR_EPILOGUE;
@@ -2451,9 +2462,9 @@ fill_simple_delay_slots (int non_jumps_p)
       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
        continue;
 
       if (GET_CODE (pat) == USE || GET_CODE (pat) == CLOBBER)
        continue;
 
-      if (! insn_references_resource_p (trial, &set, 1)
-         && ! insn_sets_resource_p (trial, &needed, 1)
-         && ! insn_sets_resource_p (trial, &set, 1)
+      if (! insn_references_resource_p (trial, &set, true)
+         && ! insn_sets_resource_p (trial, &needed, true)
+         && ! insn_sets_resource_p (trial, &set, true)
 #ifdef HAVE_cc0
          /* Don't want to mess with cc0 here.  */
          && ! reg_mentioned_p (cc0_rtx, pat)
 #ifdef HAVE_cc0
          /* Don't want to mess with cc0 here.  */
          && ! reg_mentioned_p (cc0_rtx, pat)
@@ -2466,10 +2477,10 @@ fill_simple_delay_slots (int non_jumps_p)
              /* Here as well we are searching backward, so put the
                 insns we find on the head of the list.  */
 
              /* Here as well we are searching backward, so put the
                 insns we find on the head of the list.  */
 
-             current_function_epilogue_delay_list
+             crtl->epilogue_delay_list
                = gen_rtx_INSN_LIST (VOIDmode, trial,
                = gen_rtx_INSN_LIST (VOIDmode, trial,
-                                    current_function_epilogue_delay_list);
-             mark_end_of_function_resources (trial, 1);
+                                    crtl->epilogue_delay_list);
+             mark_end_of_function_resources (trial, true);
              update_block (trial, trial);
              delete_related_insns (trial);
 
              update_block (trial, trial);
              delete_related_insns (trial);
 
@@ -2483,7 +2494,7 @@ fill_simple_delay_slots (int non_jumps_p)
        }
 
       mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
        }
 
       mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
-      mark_referenced_resources (trial, &needed, 1);
+      mark_referenced_resources (trial, &needed, true);
     }
 
   note_delay_statistics (slots_filled, 0);
     }
 
   note_delay_statistics (slots_filled, 0);
@@ -2628,9 +2639,9 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread,
 
       /* If TRIAL conflicts with the insns ahead of it, we lose.  Also,
         don't separate or copy insns that set and use CC0.  */
 
       /* If TRIAL conflicts with the insns ahead of it, we lose.  Also,
         don't separate or copy insns that set and use CC0.  */
-      if (! insn_references_resource_p (trial, &set, 1)
-         && ! insn_sets_resource_p (trial, &set, 1)
-         && ! insn_sets_resource_p (trial, &needed, 1)
+      if (! insn_references_resource_p (trial, &set, true)
+         && ! insn_sets_resource_p (trial, &set, true)
+         && ! insn_sets_resource_p (trial, &needed, true)
 #ifdef HAVE_cc0
          && ! (reg_mentioned_p (cc0_rtx, pat)
                && (! own_thread || ! sets_cc0_p (pat)))
 #ifdef HAVE_cc0
          && ! (reg_mentioned_p (cc0_rtx, pat)
                && (! own_thread || ! sets_cc0_p (pat)))
@@ -2671,7 +2682,7 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread,
             go into an annulled delay slot.  */
          if (!must_annul
              && (condition == const_true_rtx
             go into an annulled delay slot.  */
          if (!must_annul
              && (condition == const_true_rtx
-                 || (! insn_sets_resource_p (trial, &opposite_needed, 1)
+                 || (! insn_sets_resource_p (trial, &opposite_needed, true)
                      && ! may_trap_or_fault_p (pat))))
            {
              old_trial = trial;
                      && ! may_trap_or_fault_p (pat))))
            {
              old_trial = trial;
@@ -2735,15 +2746,41 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread,
                      /* We are moving this insn, not deleting it.  We must
                         temporarily increment the use count on any referenced
                         label lest it be deleted by delete_related_insns.  */
                      /* We are moving this insn, not deleting it.  We must
                         temporarily increment the use count on any referenced
                         label lest it be deleted by delete_related_insns.  */
-                     note = find_reg_note (trial, REG_LABEL, 0);
-                     /* REG_LABEL could be NOTE_INSN_DELETED_LABEL too.  */
-                     if (note && LABEL_P (XEXP (note, 0)))
-                       LABEL_NUSES (XEXP (note, 0))++;
+                     for (note = REG_NOTES (trial);
+                          note != NULL_RTX;
+                          note = XEXP (note, 1))
+                       if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
+                           || REG_NOTE_KIND (note) == REG_LABEL_TARGET)
+                         {
+                           /* REG_LABEL_OPERAND could be
+                              NOTE_INSN_DELETED_LABEL too.  */
+                           if (LABEL_P (XEXP (note, 0)))
+                             LABEL_NUSES (XEXP (note, 0))++;
+                           else
+                             gcc_assert (REG_NOTE_KIND (note)
+                                         == REG_LABEL_OPERAND);
+                         }
+                     if (JUMP_P (trial) && JUMP_LABEL (trial))
+                       LABEL_NUSES (JUMP_LABEL (trial))++;
 
                      delete_related_insns (trial);
 
 
                      delete_related_insns (trial);
 
-                     if (note && LABEL_P (XEXP (note, 0)))
-                       LABEL_NUSES (XEXP (note, 0))--;
+                     for (note = REG_NOTES (trial);
+                          note != NULL_RTX;
+                          note = XEXP (note, 1))
+                       if (REG_NOTE_KIND (note) == REG_LABEL_OPERAND
+                           || REG_NOTE_KIND (note) == REG_LABEL_TARGET)
+                         {
+                           /* REG_LABEL_OPERAND could be
+                              NOTE_INSN_DELETED_LABEL too.  */
+                           if (LABEL_P (XEXP (note, 0)))
+                             LABEL_NUSES (XEXP (note, 0))--;
+                           else
+                             gcc_assert (REG_NOTE_KIND (note)
+                                         == REG_LABEL_OPERAND);
+                         }
+                     if (JUMP_P (trial) && JUMP_LABEL (trial))
+                       LABEL_NUSES (JUMP_LABEL (trial))--;
                    }
                  else
                    new_thread = next_active_insn (trial);
                    }
                  else
                    new_thread = next_active_insn (trial);
@@ -2760,10 +2797,11 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread,
                         may be branching to a location that has a
                         redundant insn.  Skip any if so.  */
                      while (new_thread && ! own_thread
                         may be branching to a location that has a
                         redundant insn.  Skip any if so.  */
                      while (new_thread && ! own_thread
-                            && ! insn_sets_resource_p (new_thread, &set, 1)
-                            && ! insn_sets_resource_p (new_thread, &needed, 1)
+                            && ! insn_sets_resource_p (new_thread, &set, true)
+                            && ! insn_sets_resource_p (new_thread, &needed,
+                                                       true)
                             && ! insn_references_resource_p (new_thread,
                             && ! insn_references_resource_p (new_thread,
-                                                             &set, 1)
+                                                             &set, true)
                             && (prior_insn
                                 = redundant_insn (new_thread, insn,
                                                   delay_list)))
                             && (prior_insn
                                 = redundant_insn (new_thread, insn,
                                                   delay_list)))
@@ -2785,7 +2823,7 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread,
       /* This insn can't go into a delay slot.  */
       lose = 1;
       mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
       /* This insn can't go into a delay slot.  */
       lose = 1;
       mark_set_resources (trial, &set, 0, MARK_SRC_DEST_CALL);
-      mark_referenced_resources (trial, &needed, 1);
+      mark_referenced_resources (trial, &needed, true);
 
       /* Ensure we don't put insns between the setting of cc and the comparison
         by moving a setting of cc into an earlier delay slot since these insns
 
       /* Ensure we don't put insns between the setting of cc and the comparison
         by moving a setting of cc into an earlier delay slot since these insns
@@ -2895,7 +2933,7 @@ fill_slots_from_thread (rtx insn, rtx condition, rtx thread,
          /* If this is a constant adjustment, use the same code with
             the negated constant.  Otherwise, reverse the sense of the
             arithmetic.  */
          /* If this is a constant adjustment, use the same code with
             the negated constant.  Otherwise, reverse the sense of the
             arithmetic.  */
-         if (GET_CODE (other) == CONST_INT)
+         if (CONST_INT_P (other))
            new_arith = gen_rtx_fmt_ee (GET_CODE (src), GET_MODE (src), dest,
                                        negate_rtx (GET_MODE (src), other));
          else
            new_arith = gen_rtx_fmt_ee (GET_CODE (src), GET_MODE (src), dest,
                                        negate_rtx (GET_MODE (src), other));
          else
@@ -3125,7 +3163,7 @@ delete_prior_computation (rtx note, rtx insn)
       /* If we reach a CALL which is not calling a const function
         or the callee pops the arguments, then give up.  */
       if (CALL_P (our_prev)
       /* If we reach a CALL which is not calling a const function
         or the callee pops the arguments, then give up.  */
       if (CALL_P (our_prev)
-         && (! CONST_OR_PURE_CALL_P (our_prev)
+         && (! RTL_CONST_CALL_P (our_prev)
              || GET_CODE (pat) != SET || GET_CODE (SET_SRC (pat)) != CALL))
        break;
 
              || GET_CODE (pat) != SET || GET_CODE (SET_SRC (pat)) != CALL))
        break;
 
@@ -3170,16 +3208,9 @@ delete_prior_computation (rtx note, rtx insn)
                   && REG_P (SET_DEST (pat)))
            {
              int dest_regno = REGNO (SET_DEST (pat));
                   && REG_P (SET_DEST (pat)))
            {
              int dest_regno = REGNO (SET_DEST (pat));
-             int dest_endregno
-               = (dest_regno
-                  + (dest_regno < FIRST_PSEUDO_REGISTER
-                     ? hard_regno_nregs[dest_regno]
-                                       [GET_MODE (SET_DEST (pat))] : 1));
+             int dest_endregno = END_REGNO (SET_DEST (pat));
              int regno = REGNO (reg);
              int regno = REGNO (reg);
-             int endregno
-               = (regno
-                  + (regno < FIRST_PSEUDO_REGISTER
-                     ? hard_regno_nregs[regno][GET_MODE (reg)] : 1));
+             int endregno = END_REGNO (reg);
 
              if (dest_regno >= regno
                  && dest_endregno <= endregno)
 
              if (dest_regno >= regno
                  && dest_endregno <= endregno)
@@ -3194,9 +3225,7 @@ delete_prior_computation (rtx note, rtx insn)
                {
                  int i;
 
                {
                  int i;
 
-                 REG_NOTES (our_prev)
-                   = gen_rtx_EXPR_LIST (REG_UNUSED, reg,
-                                        REG_NOTES (our_prev));
+                 add_reg_note (our_prev, REG_UNUSED, reg);
 
                  for (i = dest_regno; i < dest_endregno; i++)
                    if (! find_regno_note (our_prev, REG_UNUSED, i))
 
                  for (i = dest_regno; i < dest_endregno; i++)
                    if (! find_regno_note (our_prev, REG_UNUSED, i))
@@ -3258,8 +3287,7 @@ delete_computation (rtx insn)
            delete_computation (prev);
          else
            /* Otherwise, show that cc0 won't be used.  */
            delete_computation (prev);
          else
            /* Otherwise, show that cc0 won't be used.  */
-           REG_NOTES (prev) = gen_rtx_EXPR_LIST (REG_UNUSED,
-                                                 cc0_rtx, REG_NOTES (prev));
+           add_reg_note (prev, REG_UNUSED, cc0_rtx);
        }
     }
 #endif
        }
     }
 #endif
@@ -3419,7 +3447,7 @@ relax_delay_slots (rtx first)
 
         Only do so if optimizing for size since this results in slower, but
         smaller code.  */
 
         Only do so if optimizing for size since this results in slower, but
         smaller code.  */
-      if (optimize_size
+      if (optimize_function_for_size_p (cfun)
          && GET_CODE (PATTERN (delay_insn)) == RETURN
          && next
          && JUMP_P (next)
          && GET_CODE (PATTERN (delay_insn)) == RETURN
          && next
          && JUMP_P (next)
@@ -3447,7 +3475,7 @@ relax_delay_slots (rtx first)
          for (i = 0; i < XVECLEN (pat, 0); i++)
            {
              rtx this_insn = XVECEXP (pat, 0, i);
          for (i = 0; i < XVECLEN (pat, 0); i++)
            {
              rtx this_insn = XVECEXP (pat, 0, i);
-             add_insn_after (this_insn, after);
+             add_insn_after (this_insn, after, NULL);
              after = this_insn;
            }
          delete_scheduled_jump (delay_insn);
              after = this_insn;
            }
          delete_scheduled_jump (delay_insn);
@@ -3565,7 +3593,7 @@ relax_delay_slots (rtx first)
          for (i = 0; i < XVECLEN (pat, 0); i++)
            {
              rtx this_insn = XVECEXP (pat, 0, i);
          for (i = 0; i < XVECLEN (pat, 0); i++)
            {
              rtx this_insn = XVECEXP (pat, 0, i);
-             add_insn_after (this_insn, after);
+             add_insn_after (this_insn, after, NULL);
              after = this_insn;
            }
          delete_scheduled_jump (delay_insn);
              after = this_insn;
            }
          delete_scheduled_jump (delay_insn);
@@ -3672,7 +3700,7 @@ make_return_insns (rtx first)
      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.  */
      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)
+  if (crtl->epilogue_delay_list != NULL)
     return;
 #endif
 
     return;
 #endif
 
@@ -3807,11 +3835,11 @@ dbr_schedule (rtx first)
       if (INSN_UID (insn) > max_uid)
        max_uid = INSN_UID (insn);
       if (NOTE_P (insn)
       if (INSN_UID (insn) > max_uid)
        max_uid = INSN_UID (insn);
       if (NOTE_P (insn)
-         && NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
+         && NOTE_KIND (insn) == NOTE_INSN_EPILOGUE_BEG)
        epilogue_insn = insn;
     }
 
        epilogue_insn = insn;
     }
 
-  uid_to_ruid = xmalloc ((max_uid + 1) * sizeof (int));
+  uid_to_ruid = XNEWVEC (int, max_uid + 1);
   for (i = 0, insn = first; insn; i++, insn = NEXT_INSN (insn))
     uid_to_ruid[INSN_UID (insn)] = i;
 
   for (i = 0, insn = first; insn; i++, insn = NEXT_INSN (insn))
     uid_to_ruid[INSN_UID (insn)] = i;
 
@@ -3819,7 +3847,7 @@ dbr_schedule (rtx first)
   if (unfilled_firstobj == 0)
     {
       gcc_obstack_init (&unfilled_slots_obstack);
   if (unfilled_firstobj == 0)
     {
       gcc_obstack_init (&unfilled_slots_obstack);
-      unfilled_firstobj = obstack_alloc (&unfilled_slots_obstack, 0);
+      unfilled_firstobj = XOBNEWVAR (&unfilled_slots_obstack, rtx, 0);
     }
 
   for (insn = next_active_insn (first); insn; insn = next_active_insn (insn))
     }
 
   for (insn = next_active_insn (first); insn; insn = next_active_insn (insn))
@@ -3830,9 +3858,7 @@ dbr_schedule (rtx first)
       INSN_FROM_TARGET_P (insn) = 0;
 
       /* Skip vector tables.  We can't get attributes for them.  */
       INSN_FROM_TARGET_P (insn) = 0;
 
       /* Skip vector tables.  We can't get attributes for them.  */
-      if (JUMP_P (insn)
-         && (GET_CODE (PATTERN (insn)) == ADDR_VEC
-             || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC))
+      if (JUMP_TABLE_DATA_P (insn))
        continue;
 
       if (num_delay_slots (insn) > 0)
        continue;
 
       if (num_delay_slots (insn) > 0)
@@ -3869,17 +3895,6 @@ dbr_schedule (rtx first)
       relax_delay_slots (first);
     }
 
       relax_delay_slots (first);
     }
 
-  /* Delete any USE insns made by update_block; subsequent passes don't need
-     them or know how to deal with them.  */
-  for (insn = first; insn; insn = next)
-    {
-      next = NEXT_INSN (insn);
-
-      if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
-         && INSN_P (XEXP (PATTERN (insn), 0)))
-       next = delete_related_insns (insn);
-    }
-
   /* If we made an end of function label, indicate that it is now
      safe to delete it by undoing our prior adjustment to LABEL_NUSES.
      If it is now unused, delete it.  */
   /* If we made an end of function label, indicate that it is now
      safe to delete it by undoing our prior adjustment to LABEL_NUSES.
      If it is now unused, delete it.  */
@@ -3891,10 +3906,21 @@ dbr_schedule (rtx first)
     make_return_insns (first);
 #endif
 
     make_return_insns (first);
 #endif
 
+  /* Delete any USE insns made by update_block; subsequent passes don't need
+     them or know how to deal with them.  */
+  for (insn = first; insn; insn = next)
+    {
+      next = NEXT_INSN (insn);
+
+      if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
+         && INSN_P (XEXP (PATTERN (insn), 0)))
+       next = delete_related_insns (insn);
+    }
+
   obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
 
   /* It is not clear why the line below is needed, but it does seem to be.  */
   obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
 
   /* It is not clear why the line below is needed, but it does seem to be.  */
-  unfilled_firstobj = obstack_alloc (&unfilled_slots_obstack, 0);
+  unfilled_firstobj = XOBNEWVAR (&unfilled_slots_obstack, rtx, 0);
 
   if (dump_file)
     {
 
   if (dump_file)
     {
@@ -4001,9 +4027,7 @@ dbr_schedule (rtx first)
        continue;
 
       pred_flags = get_jump_flags (insn, JUMP_LABEL (insn));
        continue;
 
       pred_flags = get_jump_flags (insn, JUMP_LABEL (insn));
-      REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_BR_PRED,
-                                           GEN_INT (pred_flags),
-                                           REG_NOTES (insn));
+      add_reg_note (insn, REG_BR_PRED, GEN_INT (pred_flags));
     }
   free_resource_info ();
   free (uid_to_ruid);
     }
   free_resource_info ();
   free (uid_to_ruid);
@@ -4013,12 +4037,14 @@ dbr_schedule (rtx first)
   {
     rtx link;
 
   {
     rtx link;
 
-    for (link = current_function_epilogue_delay_list;
+    for (link = crtl->epilogue_delay_list;
          link;
          link = XEXP (link, 1))
       INSN_LOCATOR (XEXP (link, 0)) = 0;
   }
          link;
          link = XEXP (link, 1))
       INSN_LOCATOR (XEXP (link, 0)) = 0;
   }
+
 #endif
 #endif
+  crtl->dbr_scheduled_p = true;
 }
 #endif /* DELAY_SLOTS */
 \f
 }
 #endif /* DELAY_SLOTS */
 \f
@@ -4026,8 +4052,9 @@ static bool
 gate_handle_delay_slots (void)
 {
 #ifdef DELAY_SLOTS
 gate_handle_delay_slots (void)
 {
 #ifdef DELAY_SLOTS
-  return flag_delayed_branch;
-#else 
+  /* At -O0 dataflow info isn't updated after RA.  */
+  return optimize > 0 && flag_delayed_branch && !crtl->dbr_scheduled_p;
+#else
   return 0;
 #endif
 }
   return 0;
 #endif
 }
@@ -4040,10 +4067,12 @@ rest_of_handle_delay_slots (void)
   dbr_schedule (get_insns ());
 #endif
   return 0;
   dbr_schedule (get_insns ());
 #endif
   return 0;
-}   
+}
 
 
-struct tree_opt_pass pass_delay_slots =
+struct rtl_opt_pass pass_delay_slots =
 {
 {
+ {
+  RTL_PASS,
   "dbr",                                /* name */
   gate_handle_delay_slots,              /* gate */
   rest_of_handle_delay_slots,           /* execute */
   "dbr",                                /* name */
   gate_handle_delay_slots,              /* gate */
   rest_of_handle_delay_slots,           /* execute */
@@ -4056,8 +4085,8 @@ struct tree_opt_pass pass_delay_slots =
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
   TODO_dump_func |
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
   TODO_dump_func |
-  TODO_ggc_collect,                     /* todo_flags_finish */
-  'd'                                   /* letter */
+  TODO_ggc_collect                      /* todo_flags_finish */
+ }
 };
 
 /* Machine dependent reorg pass.  */
 };
 
 /* Machine dependent reorg pass.  */
@@ -4075,8 +4104,10 @@ rest_of_handle_machine_reorg (void)
   return 0;
 }
 
   return 0;
 }
 
-struct tree_opt_pass pass_machine_reorg =
+struct rtl_opt_pass pass_machine_reorg =
 {
 {
+ {
+  RTL_PASS,
   "mach",                               /* name */
   gate_handle_machine_reorg,            /* gate */
   rest_of_handle_machine_reorg,         /* execute */
   "mach",                               /* name */
   gate_handle_machine_reorg,            /* gate */
   rest_of_handle_machine_reorg,         /* execute */
@@ -4089,7 +4120,6 @@ struct tree_opt_pass pass_machine_reorg =
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
   TODO_dump_func |
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
   TODO_dump_func |
-  TODO_ggc_collect,                     /* todo_flags_finish */
-  'M'                                   /* letter */
+  TODO_ggc_collect                      /* todo_flags_finish */
+ }
 };
 };
-