Daily bump.
[gcc.git] / gcc / resource.c
index 13a77368d135a73e43791b9f6f1c366b0f59cd7f..f8a23ed9f58bb25de2106b25ad7bc2095798517b 100644 (file)
@@ -1,12 +1,11 @@
 /* Definitions for computing resource usage of specific insns.
-   Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
-   Free Software Foundation, Inc.
+   Copyright (C) 1999-2019 Free Software Foundation, Inc.
 
 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
-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
@@ -15,25 +14,20 @@ 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
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
-#include "tm.h"
-#include "toplev.h"
+#include "backend.h"
 #include "rtl.h"
+#include "df.h"
+#include "memmodel.h"
 #include "tm_p.h"
-#include "hard-reg-set.h"
-#include "basic-block.h"
-#include "function.h"
 #include "regs.h"
-#include "flags.h"
-#include "output.h"
+#include "emit-rtl.h"
 #include "resource.h"
-#include "except.h"
 #include "insn-attr.h"
 #include "params.h"
 
@@ -79,36 +73,46 @@ static HARD_REG_SET current_live_regs;
 
 static HARD_REG_SET pending_dead_regs;
 \f
-static void update_live_status (rtx, rtx, void *);
-static int find_basic_block (rtx, int);
-static rtx next_insn_no_annul (rtx);
-static rtx find_dead_or_set_registers (rtx, struct resources*,
-                                      rtx*, int, struct resources,
-                                      struct resources);
+static void update_live_status (rtx, const_rtx, void *);
+static int find_basic_block (rtx_insn *, int);
+static rtx_insn *next_insn_no_annul (rtx_insn *);
+static rtx_insn *find_dead_or_set_registers (rtx_insn *, struct resources*,
+                                            rtx *, int, struct resources,
+                                            struct resources);
 \f
 /* Utility function called from mark_target_live_regs via note_stores.
    It deadens any CLOBBERed registers and livens any SET registers.  */
 
 static void
-update_live_status (rtx dest, rtx x, void *data ATTRIBUTE_UNUSED)
+update_live_status (rtx dest, const_rtx x, void *data ATTRIBUTE_UNUSED)
 {
   int first_regno, last_regno;
   int i;
 
-  if (GET_CODE (dest) != REG
-      && (GET_CODE (dest) != SUBREG || GET_CODE (SUBREG_REG (dest)) != REG))
+  if (!REG_P (dest)
+      && (GET_CODE (dest) != SUBREG || !REG_P (SUBREG_REG (dest))))
     return;
 
   if (GET_CODE (dest) == SUBREG)
-    first_regno = subreg_regno (dest);
-  else
-    first_regno = REGNO (dest);
+    {
+      first_regno = subreg_regno (dest);
+      last_regno = first_regno + subreg_nregs (dest);
 
-  last_regno = first_regno + hard_regno_nregs[first_regno][GET_MODE (dest)];
+    }
+  else
+    {
+      first_regno = REGNO (dest);
+      last_regno = END_REGNO (dest);
+    }
 
   if (GET_CODE (x) == CLOBBER)
     for (i = first_regno; i < last_regno; i++)
       CLEAR_HARD_REG_BIT (current_live_regs, i);
+  else if (GET_CODE (x) == CLOBBER_HIGH)
+    /* No current target supports both branch delay slots and CLOBBER_HIGH.
+       We'd need more elaborate liveness tracking to handle that
+       combination.  */
+    gcc_unreachable ();
   else
     for (i = first_regno; i < last_regno; i++)
       {
@@ -129,14 +133,12 @@ update_live_status (rtx dest, rtx x, void *data ATTRIBUTE_UNUSED)
    correct.  */
 
 static int
-find_basic_block (rtx insn, int search_limit)
+find_basic_block (rtx_insn *insn, int search_limit)
 {
-  basic_block bb;
-
   /* Scan backwards to the previous BARRIER.  Then see if we can find a
      label that starts a basic block.  Return the basic block number.  */
   for (insn = prev_nonnote_insn (insn);
-       insn && GET_CODE (insn) != BARRIER && search_limit != 0;
+       insn && !BARRIER_P (insn) && search_limit != 0;
        insn = prev_nonnote_insn (insn), --search_limit)
     ;
 
@@ -146,18 +148,15 @@ find_basic_block (rtx insn, int search_limit)
 
   /* The start of the function.  */
   else if (insn == 0)
-    return ENTRY_BLOCK_PTR->next_bb->index;
+    return ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb->index;
 
   /* See if any of the upcoming CODE_LABELs start a basic block.  If we reach
      anything other than a CODE_LABEL or note, we can't find this code.  */
   for (insn = next_nonnote_insn (insn);
-       insn && GET_CODE (insn) == CODE_LABEL;
+       insn && LABEL_P (insn);
        insn = next_nonnote_insn (insn))
-    {
-      FOR_EACH_BB (bb)
-       if (insn == BB_HEAD (bb))
-         return bb->index;
-    }
+    if (BLOCK_FOR_INSN (insn))
+      return BLOCK_FOR_INSN (insn)->index;
 
   return -1;
 }
@@ -165,35 +164,31 @@ find_basic_block (rtx insn, int search_limit)
 /* Similar to next_insn, but ignores insns in the delay slots of
    an annulled branch.  */
 
-static rtx
-next_insn_no_annul (rtx insn)
+static rtx_insn *
+next_insn_no_annul (rtx_insn *insn)
 {
   if (insn)
     {
       /* If INSN is an annulled branch, skip any insns from the target
         of the branch.  */
-      if ((GET_CODE (insn) == JUMP_INSN
-          || GET_CODE (insn) == CALL_INSN
-          || GET_CODE (insn) == INSN)
+      if (JUMP_P (insn)
          && INSN_ANNULLED_BRANCH_P (insn)
          && NEXT_INSN (PREV_INSN (insn)) != insn)
        {
-         rtx next = NEXT_INSN (insn);
-         enum rtx_code code = GET_CODE (next);
+         rtx_insn *next = NEXT_INSN (insn);
 
-         while ((code == INSN || code == JUMP_INSN || code == CALL_INSN)
+         while ((NONJUMP_INSN_P (next) || JUMP_P (next) || CALL_P (next))
                 && INSN_FROM_TARGET_P (next))
            {
              insn = next;
              next = NEXT_INSN (insn);
-             code = GET_CODE (next);
            }
        }
 
       insn = NEXT_INSN (insn);
-      if (insn && GET_CODE (insn) == INSN
+      if (insn && NONJUMP_INSN_P (insn)
          && GET_CODE (PATTERN (insn)) == SEQUENCE)
-       insn = XVECEXP (PATTERN (insn), 0, 0);
+       insn = as_a <rtx_sequence *> (PATTERN (insn))->insn (0);
     }
 
   return insn;
@@ -206,7 +201,7 @@ next_insn_no_annul (rtx insn)
 
 void
 mark_referenced_resources (rtx x, struct resources *res,
-                          int include_delayed_effects)
+                          bool include_delayed_effects)
 {
   enum rtx_code code = GET_CODE (x);
   int i, j;
@@ -218,54 +213,41 @@ mark_referenced_resources (rtx x, struct resources *res,
   switch (code)
     {
     case CONST:
-    case CONST_INT:
-    case CONST_DOUBLE:
-    case CONST_VECTOR:
+    CASE_CONST_ANY:
     case PC:
     case SYMBOL_REF:
     case LABEL_REF:
+    case DEBUG_INSN:
       return;
 
     case SUBREG:
-      if (GET_CODE (SUBREG_REG (x)) != REG)
-       mark_referenced_resources (SUBREG_REG (x), res, 0);
+      if (!REG_P (SUBREG_REG (x)))
+       mark_referenced_resources (SUBREG_REG (x), res, false);
       else
        {
          unsigned int regno = subreg_regno (x);
-         unsigned int last_regno
-           = regno + hard_regno_nregs[regno][GET_MODE (x)];
+         unsigned int last_regno = regno + subreg_nregs (x);
 
-         if (last_regno > FIRST_PSEUDO_REGISTER)
-           abort ();
+         gcc_assert (last_regno <= FIRST_PSEUDO_REGISTER);
          for (r = regno; r < last_regno; r++)
            SET_HARD_REG_BIT (res->regs, r);
        }
       return;
 
     case REG:
-       {
-         unsigned int regno = REGNO (x);
-         unsigned int last_regno
-           = regno + hard_regno_nregs[regno][GET_MODE (x)];
-
-         if (last_regno > FIRST_PSEUDO_REGISTER)
-           abort ();
-         for (r = regno; r < last_regno; r++)
-           SET_HARD_REG_BIT (res->regs, r);
-       }
+      gcc_assert (HARD_REGISTER_P (x));
+      add_to_hard_reg_set (&res->regs, GET_MODE (x), REGNO (x));
       return;
 
     case MEM:
       /* If this memory shouldn't change, it really isn't referencing
         memory.  */
-      if (RTX_UNCHANGING_P (x))
-       res->unch_memory = 1;
-      else
+      if (! MEM_READONLY_P (x))
        res->memory = 1;
       res->volatil |= MEM_VOLATILE_P (x);
 
       /* Mark registers used to access memory.  */
-      mark_referenced_resources (XEXP (x, 0), res, 0);
+      mark_referenced_resources (XEXP (x, 0), res, false);
       return;
 
     case CC0:
@@ -273,12 +255,9 @@ mark_referenced_resources (rtx x, struct resources *res,
       return;
 
     case UNSPEC_VOLATILE:
+    case TRAP_IF:
     case ASM_INPUT:
       /* Traditional asm's are always volatile.  */
-      res->volatil = 1;
-      return;
-
-    case TRAP_IF:
       res->volatil = 1;
       break;
 
@@ -286,40 +265,40 @@ mark_referenced_resources (rtx x, struct resources *res,
       res->volatil |= MEM_VOLATILE_P (x);
 
       /* For all ASM_OPERANDS, we must traverse the vector of input operands.
-        We can not just fall through here since then we would be confused
+        We cannot just fall through here since then we would be confused
         by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
         traditional asms unlike their normal usage.  */
 
       for (i = 0; i < ASM_OPERANDS_INPUT_LENGTH (x); i++)
-       mark_referenced_resources (ASM_OPERANDS_INPUT (x, i), res, 0);
+       mark_referenced_resources (ASM_OPERANDS_INPUT (x, i), res, false);
       return;
 
     case CALL:
       /* The first operand will be a (MEM (xxx)) but doesn't really reference
         memory.  The second operand may be referenced, though.  */
-      mark_referenced_resources (XEXP (XEXP (x, 0), 0), res, 0);
-      mark_referenced_resources (XEXP (x, 1), res, 0);
+      mark_referenced_resources (XEXP (XEXP (x, 0), 0), res, false);
+      mark_referenced_resources (XEXP (x, 1), res, false);
       return;
 
     case SET:
       /* Usually, the first operand of SET is set, not referenced.  But
         registers used to access memory are referenced.  SET_DEST is
-        also referenced if it is a ZERO_EXTRACT or SIGN_EXTRACT.  */
+        also referenced if it is a ZERO_EXTRACT.  */
 
-      mark_referenced_resources (SET_SRC (x), res, 0);
+      mark_referenced_resources (SET_SRC (x), res, false);
 
       x = SET_DEST (x);
-      if (GET_CODE (x) == SIGN_EXTRACT
-         || GET_CODE (x) == ZERO_EXTRACT
+      if (GET_CODE (x) == ZERO_EXTRACT
          || GET_CODE (x) == STRICT_LOW_PART)
-       mark_referenced_resources (x, res, 0);
+       mark_referenced_resources (x, res, false);
       else if (GET_CODE (x) == SUBREG)
        x = SUBREG_REG (x);
-      if (GET_CODE (x) == MEM)
-       mark_referenced_resources (XEXP (x, 0), res, 0);
+      if (MEM_P (x))
+       mark_referenced_resources (XEXP (x, 0), res, false);
       return;
 
     case CLOBBER:
+    case CLOBBER_HIGH:
       return;
 
     case CALL_INSN:
@@ -332,18 +311,17 @@ mark_referenced_resources (rtx x, struct resources *res,
             However, we may have moved some of the parameter loading insns
             into the delay slot of this CALL.  If so, the USE's for them
             don't count and should be skipped.  */
-         rtx insn = PREV_INSN (x);
-         rtx sequence = 0;
+         rtx_insn *insn = PREV_INSN (as_a <rtx_insn *> (x));
+         rtx_sequence *sequence = 0;
          int seq_size = 0;
          int i;
 
          /* If we are part of a delay slot sequence, point at the SEQUENCE.  */
          if (NEXT_INSN (insn) != x)
            {
-             sequence = PATTERN (NEXT_INSN (insn));
-             seq_size = XVECLEN (sequence, 0);
-             if (GET_CODE (sequence) != SEQUENCE)
-               abort ();
+             sequence = as_a <rtx_sequence *> (PATTERN (NEXT_INSN (insn)));
+             seq_size = sequence->len ();
+             gcc_assert (GET_CODE (sequence) == SEQUENCE);
            }
 
          res->memory = 1;
@@ -351,9 +329,8 @@ mark_referenced_resources (rtx x, struct resources *res,
          if (frame_pointer_needed)
            {
              SET_HARD_REG_BIT (res->regs, FRAME_POINTER_REGNUM);
-#if FRAME_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
-             SET_HARD_REG_BIT (res->regs, HARD_FRAME_POINTER_REGNUM);
-#endif
+             if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
+               SET_HARD_REG_BIT (res->regs, HARD_FRAME_POINTER_REGNUM);
            }
 
          for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
@@ -381,7 +358,7 @@ mark_referenced_resources (rtx x, struct resources *res,
                {
                  for (i = 1; i < seq_size; i++)
                    {
-                     rtx slot_pat = PATTERN (XVECEXP (sequence, 0, i));
+                     rtx slot_pat = PATTERN (sequence->element (i));
                      if (GET_CODE (slot_pat) == SET
                          && rtx_equal_p (SET_DEST (slot_pat),
                                          XEXP (XEXP (link, 0), 0)))
@@ -389,21 +366,30 @@ mark_referenced_resources (rtx x, struct resources *res,
                    }
                  if (i >= seq_size)
                    mark_referenced_resources (XEXP (XEXP (link, 0), 0),
-                                              res, 0);
+                                              res, false);
                }
          }
        }
 
       /* ... fall through to other INSN processing ...  */
+      gcc_fallthrough ();
 
     case INSN:
     case JUMP_INSN:
 
-#ifdef INSN_REFERENCES_ARE_DELAYED
+      if (GET_CODE (PATTERN (x)) == COND_EXEC)
+      /* In addition to the usual references, also consider all outputs
+        as referenced, to compensate for mark_set_resources treating
+        them as killed.  This is similar to ZERO_EXTRACT / STRICT_LOW_PART
+        handling, execpt that we got a partial incidence instead of a partial
+        width.  */
+      mark_set_resources (x, res, 0,
+                         include_delayed_effects
+                         ? MARK_SRC_DEST_CALL : MARK_SRC_DEST);
+
       if (! include_delayed_effects
-         && INSN_REFERENCES_ARE_DELAYED (x))
+         && INSN_REFERENCES_ARE_DELAYED (as_a <rtx_insn *> (x)))
        return;
-#endif
 
       /* No special processing, just speed up.  */
       mark_referenced_resources (PATTERN (x), res, include_delayed_effects);
@@ -435,21 +421,22 @@ mark_referenced_resources (rtx x, struct resources *res,
    Stop after passing a few conditional jumps, and/or a small
    number of unconditional branches.  */
 
-static rtx
-find_dead_or_set_registers (rtx target, struct resources *res,
+static rtx_insn *
+find_dead_or_set_registers (rtx_insn *target, struct resources *res,
                            rtx *jump_target, int jump_count,
                            struct resources set, struct resources needed)
 {
   HARD_REG_SET scratch;
-  rtx insn, next;
-  rtx jump_insn = 0;
+  rtx_insn *insn;
+  rtx_insn *next_insn;
+  rtx_insn *jump_insn = 0;
   int i;
 
-  for (insn = target; insn; insn = next)
+  for (insn = target; insn; insn = next_insn)
     {
-      rtx this_jump_insn = insn;
+      rtx_insn *this_insn = insn;
 
-      next = NEXT_INSN (insn);
+      next_insn = NEXT_INSN (insn);
 
       /* If this instruction can throw an exception, then we don't
         know where we might end up next.  That means that we have to
@@ -471,6 +458,7 @@ find_dead_or_set_registers (rtx target, struct resources *res,
 
        case BARRIER:
        case NOTE:
+       case DEBUG_INSN:
          continue;
 
        case INSN:
@@ -488,14 +476,15 @@ find_dead_or_set_registers (rtx target, struct resources *res,
            }
          else if (GET_CODE (PATTERN (insn)) == CLOBBER)
            continue;
-         else if (GET_CODE (PATTERN (insn)) == SEQUENCE)
+         else if (rtx_sequence *seq =
+                    dyn_cast <rtx_sequence *> (PATTERN (insn)))
            {
              /* An unconditional jump can be used to fill the delay slot
                 of a call, so search for a JUMP_INSN in any position.  */
-             for (i = 0; i < XVECLEN (PATTERN (insn), 0); i++)
+             for (i = 0; i < seq->len (); i++)
                {
-                 this_jump_insn = XVECEXP (PATTERN (insn), 0, i);
-                 if (GET_CODE (this_jump_insn) == JUMP_INSN)
+                 this_insn = seq->insn (i);
+                 if (JUMP_P (this_insn))
                    break;
                }
            }
@@ -504,14 +493,19 @@ find_dead_or_set_registers (rtx target, struct resources *res,
          break;
        }
 
-      if (GET_CODE (this_jump_insn) == JUMP_INSN)
+      if (rtx_jump_insn *this_jump_insn =
+           dyn_cast <rtx_jump_insn *> (this_insn))
        {
          if (jump_count++ < 10)
            {
              if (any_uncondjump_p (this_jump_insn)
-                 || GET_CODE (PATTERN (this_jump_insn)) == RETURN)
+                 || ANY_RETURN_P (PATTERN (this_jump_insn)))
                {
-                 next = JUMP_LABEL (this_jump_insn);
+                 rtx lab_or_return = this_jump_insn->jump_label ();
+                 if (ANY_RETURN_P (lab_or_return))
+                   next_insn = NULL;
+                 else
+                   next_insn = as_a <rtx_insn *> (lab_or_return);
                  if (jump_insn == 0)
                    {
                      jump_insn = insn;
@@ -536,7 +530,7 @@ find_dead_or_set_registers (rtx target, struct resources *res,
                  if (jump_count >= 10)
                    break;
 
-                 mark_referenced_resources (insn, &needed, 1);
+                 mark_referenced_resources (insn, &needed, true);
 
                  /* For an annulled branch, mark_set_resources ignores slots
                     filled by instructions from the target.  This is correct
@@ -549,17 +543,18 @@ find_dead_or_set_registers (rtx target, struct resources *res,
                  if (GET_CODE (PATTERN (insn)) == SEQUENCE
                      && INSN_ANNULLED_BRANCH_P (this_jump_insn))
                    {
-                     for (i = 1; i < XVECLEN (PATTERN (insn), 0); i++)
-                       INSN_FROM_TARGET_P (XVECEXP (PATTERN (insn), 0, i))
-                         = ! INSN_FROM_TARGET_P (XVECEXP (PATTERN (insn), 0, i));
+                     rtx_sequence *seq = as_a <rtx_sequence *> (PATTERN (insn));
+                     for (i = 1; i < seq->len (); i++)
+                       INSN_FROM_TARGET_P (seq->element (i))
+                         = ! INSN_FROM_TARGET_P (seq->element (i));
 
                      target_set = set;
                      mark_set_resources (insn, &target_set, 0,
                                          MARK_SRC_DEST_CALL);
 
-                     for (i = 1; i < XVECLEN (PATTERN (insn), 0); i++)
-                       INSN_FROM_TARGET_P (XVECEXP (PATTERN (insn), 0, i))
-                         = ! INSN_FROM_TARGET_P (XVECEXP (PATTERN (insn), 0, i));
+                     for (i = 1; i < seq->len (); i++)
+                       INSN_FROM_TARGET_P (seq->element (i))
+                         = ! INSN_FROM_TARGET_P (seq->element (i));
 
                      mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
                    }
@@ -579,10 +574,11 @@ find_dead_or_set_registers (rtx target, struct resources *res,
                  AND_COMPL_HARD_REG_SET (scratch, needed.regs);
                  AND_COMPL_HARD_REG_SET (fallthrough_res.regs, scratch);
 
-                 find_dead_or_set_registers (JUMP_LABEL (this_jump_insn),
-                                             &target_res, 0, jump_count,
-                                             target_set, needed);
-                 find_dead_or_set_registers (next,
+                 if (!ANY_RETURN_P (this_jump_insn->jump_label ()))
+                   find_dead_or_set_registers
+                         (this_jump_insn->jump_target (),
+                          &target_res, 0, jump_count, target_set, needed);
+                 find_dead_or_set_registers (next_insn,
                                              &fallthrough_res, 0, jump_count,
                                              set, needed);
                  IOR_HARD_REG_SET (fallthrough_res.regs, target_res.regs);
@@ -602,7 +598,7 @@ find_dead_or_set_registers (rtx target, struct resources *res,
            }
        }
 
-      mark_referenced_resources (insn, &needed, 1);
+      mark_referenced_resources (insn, &needed, true);
       mark_set_resources (insn, &set, 0, MARK_SRC_DEST_CALL);
 
       COPY_HARD_REG_SET (scratch, set.regs);
@@ -646,13 +642,12 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
     case BARRIER:
     case CODE_LABEL:
     case USE:
-    case CONST_INT:
-    case CONST_DOUBLE:
-    case CONST_VECTOR:
+    CASE_CONST_ANY:
     case LABEL_REF:
     case SYMBOL_REF:
     case CONST:
     case PC:
+    case DEBUG_INSN:
       /* These don't set any resources.  */
       return;
 
@@ -668,26 +663,35 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
 
       if (mark_type == MARK_SRC_DEST_CALL)
        {
+         rtx_call_insn *call_insn = as_a <rtx_call_insn *> (x);
          rtx link;
+         HARD_REG_SET regs;
 
          res->cc = res->memory = 1;
-         for (r = 0; r < FIRST_PSEUDO_REGISTER; r++)
-           if (call_used_regs[r] || global_regs[r])
-             SET_HARD_REG_BIT (res->regs, r);
 
-         for (link = CALL_INSN_FUNCTION_USAGE (x);
+         get_call_reg_set_usage (call_insn, &regs, regs_invalidated_by_call);
+         IOR_HARD_REG_SET (res->regs, regs);
+
+         for (link = CALL_INSN_FUNCTION_USAGE (call_insn);
               link; link = XEXP (link, 1))
-           if (GET_CODE (XEXP (link, 0)) == CLOBBER)
-             mark_set_resources (SET_DEST (XEXP (link, 0)), res, 1,
-                                 MARK_SRC_DEST);
+           {
+             /* We could support CLOBBER_HIGH and treat it in the same way as
+                HARD_REGNO_CALL_PART_CLOBBERED, but no port needs that
+                yet.  */
+             gcc_assert (GET_CODE (XEXP (link, 0)) != CLOBBER_HIGH);
+             if (GET_CODE (XEXP (link, 0)) == CLOBBER)
+               mark_set_resources (SET_DEST (XEXP (link, 0)), res, 1,
+                                   MARK_SRC_DEST);
+           }
 
          /* Check for a REG_SETJMP.  If it exists, then we must
             assume that this call can clobber any register.  */
-         if (find_reg_note (x, REG_SETJMP, NULL))
+         if (find_reg_note (call_insn, REG_SETJMP, NULL))
            SET_HARD_REG_SET (res->regs);
        }
 
       /* ... and also what its RTL says it modifies, if anything.  */
+      gcc_fallthrough ();
 
     case JUMP_INSN:
     case INSN:
@@ -695,11 +699,9 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
        /* An insn consisting of just a CLOBBER (or USE) is just for flow
           and doesn't actually do anything, so we ignore it.  */
 
-#ifdef INSN_SETS_ARE_DELAYED
       if (mark_type != MARK_SRC_DEST_CALL
-         && INSN_SETS_ARE_DELAYED (x))
+         && INSN_SETS_ARE_DELAYED (as_a <rtx_insn *> (x)))
        return;
-#endif
 
       x = PATTERN (x);
       if (GET_CODE (x) != USE && GET_CODE (x) != CLOBBER)
@@ -723,11 +725,26 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
       mark_set_resources (XEXP (x, 0), res, 1, MARK_SRC_DEST);
       return;
 
+    case CLOBBER_HIGH:
+      /* No current target supports both branch delay slots and CLOBBER_HIGH.
+        We'd need more elaborate liveness tracking to handle that
+        combination.  */
+      gcc_unreachable ();
+
     case SEQUENCE:
-      for (i = 0; i < XVECLEN (x, 0); i++)
-       if (! (INSN_ANNULLED_BRANCH_P (XVECEXP (x, 0, 0))
-              && INSN_FROM_TARGET_P (XVECEXP (x, 0, i))))
-         mark_set_resources (XVECEXP (x, 0, i), res, 0, mark_type);
+      {
+        rtx_sequence *seq = as_a <rtx_sequence *> (x);
+        rtx control = seq->element (0);
+        bool annul_p = JUMP_P (control) && INSN_ANNULLED_BRANCH_P (control);
+
+        mark_set_resources (control, res, 0, mark_type);
+        for (i = seq->len () - 1; i >= 0; --i)
+         {
+           rtx elt = seq->element (i);
+           if (!annul_p && INSN_FROM_TARGET_P (elt))
+             mark_set_resources (elt, res, 0, mark_type);
+         }
+      }
       return;
 
     case POST_INC:
@@ -755,7 +772,6 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
       if (in_dest)
        {
          res->memory = 1;
-         res->unch_memory |= RTX_UNCHANGING_P (x);
          res->volatil |= MEM_VOLATILE_P (x);
        }
 
@@ -765,16 +781,14 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
     case SUBREG:
       if (in_dest)
        {
-         if (GET_CODE (SUBREG_REG (x)) != REG)
+         if (!REG_P (SUBREG_REG (x)))
            mark_set_resources (SUBREG_REG (x), res, in_dest, mark_type);
          else
            {
              unsigned int regno = subreg_regno (x);
-             unsigned int last_regno
-               = regno + hard_regno_nregs[regno][GET_MODE (x)];
+             unsigned int last_regno = regno + subreg_nregs (x);
 
-             if (last_regno > FIRST_PSEUDO_REGISTER)
-               abort ();
+             gcc_assert (last_regno <= FIRST_PSEUDO_REGISTER);
              for (r = regno; r < last_regno; r++)
                SET_HARD_REG_BIT (res->regs, r);
            }
@@ -784,14 +798,8 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
     case REG:
       if (in_dest)
        {
-         unsigned int regno = REGNO (x);
-         unsigned int last_regno
-           = regno + hard_regno_nregs[regno][GET_MODE (x)];
-
-         if (last_regno > FIRST_PSEUDO_REGISTER)
-           abort ();
-         for (r = regno; r < last_regno; r++)
-           SET_HARD_REG_BIT (res->regs, r);
+         gcc_assert (HARD_REGISTER_P (x));
+         add_to_hard_reg_set (&res->regs, GET_MODE (x), REGNO (x));
        }
       return;
 
@@ -809,7 +817,7 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
       res->volatil |= MEM_VOLATILE_P (x);
 
       /* For all ASM_OPERANDS, we must traverse the vector of input operands.
-        We can not just fall through here since then we would be confused
+        We cannot just fall through here since then we would be confused
         by the ASM_INPUT rtx inside ASM_OPERANDS, which do not indicate
         traditional asms unlike their normal usage.  */
 
@@ -838,6 +846,20 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
       }
 }
 \f
+/* Return TRUE if INSN is a return, possibly with a filled delay slot.  */
+
+static bool
+return_insn_p (const_rtx insn)
+{
+  if (JUMP_P (insn) && ANY_RETURN_P (PATTERN (insn)))
+    return true;
+
+  if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
+    return return_insn_p (XVECEXP (PATTERN (insn), 0, 0));
+
+  return false;
+}
+
 /* Set the resources that are live at TARGET.
 
    If TARGET is zero, we refer to the end of the current function and can
@@ -854,13 +876,12 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
    (with no intervening active insns) to see if any of them start a basic
    block.  If we hit the start of the function first, we use block 0.
 
-   Once we have found a basic block and a corresponding first insns, we can
-   accurately compute the live status from basic_block_live_regs and
-   reg_renumber.  (By starting at a label following a BARRIER, we are immune
-   to actions taken by reload and jump.)  Then we scan all insns between
-   that point and our target.  For each CLOBBER (or for call-clobbered regs
-   when we pass a CALL_INSN), mark the appropriate registers are dead.  For
-   a SET, mark them as live.
+   Once we have found a basic block and a corresponding first insn, we can
+   accurately compute the live status (by starting at a label following a
+   BARRIER, we are immune to actions taken by reload and jump.)  Then we
+   scan all insns between that point and our target.  For each CLOBBER (or
+   for call-clobbered regs when we pass a CALL_INSN), mark the appropriate
+   registers are dead.  For a SET, mark them as live.
 
    We have to be careful when using REG_DEAD notes because they are not
    updated by such things as find_equiv_reg.  So keep track of registers
@@ -878,27 +899,38 @@ mark_set_resources (rtx x, struct resources *res, int in_dest,
    init_resource_info () was invoked before we are called.  */
 
 void
-mark_target_live_regs (rtx insns, rtx target, struct resources *res)
+mark_target_live_regs (rtx_insn *insns, rtx target_maybe_return, struct resources *res)
 {
   int b = -1;
   unsigned int i;
   struct target_info *tinfo = NULL;
-  rtx insn;
-  rtx jump_insn = 0;
+  rtx_insn *insn;
   rtx jump_target;
   HARD_REG_SET scratch;
   struct resources set, needed;
 
   /* Handle end of function.  */
-  if (target == 0)
+  if (target_maybe_return == 0 || ANY_RETURN_P (target_maybe_return))
     {
       *res = end_of_function_needs;
       return;
     }
 
+  /* We've handled the case of RETURN/SIMPLE_RETURN; we should now have an
+     instruction.  */
+  rtx_insn *target = as_a <rtx_insn *> (target_maybe_return);
+
+  /* Handle return insn.  */
+  if (return_insn_p (target))
+    {
+      *res = end_of_function_needs;
+      mark_referenced_resources (target, res, false);
+      return;
+    }
+
   /* We have to assume memory is needed, but the CC isn't.  */
   res->memory = 1;
-  res->volatil = res->unch_memory = 0;
+  res->volatil = 0;
   res->cc = 0;
 
   /* See if we have computed this value already.  */
@@ -913,7 +945,7 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
         information, we can get it from there unless the insn at the
         start of the basic block has been deleted.  */
       if (tinfo && tinfo->block != -1
-         && ! INSN_DELETED_P (BB_HEAD (BASIC_BLOCK (tinfo->block))))
+         && ! BB_HEAD (BASIC_BLOCK_FOR_FN (cfun, tinfo->block))->deleted ())
        b = tinfo->block;
     }
 
@@ -936,7 +968,7 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
        {
          /* Allocate a place to put our results and chain it into the
             hash table.  */
-         tinfo = xmalloc (sizeof (struct target_info));
+         tinfo = XNEW (struct target_info);
          tinfo->uid = INSN_UID (target);
          tinfo->block = b;
          tinfo->next
@@ -949,44 +981,27 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
 
   /* If we found a basic block, get the live registers from it and update
      them with anything set or killed between its start and the insn before
-     TARGET.  Otherwise, we must assume everything is live.  */
+     TARGET; this custom life analysis is really about registers so we need
+     to use the LR problem.  Otherwise, we must assume everything is live.  */
   if (b != -1)
     {
-      regset regs_live = BASIC_BLOCK (b)->global_live_at_start;
-      unsigned int j;
-      unsigned int regno;
-      rtx start_insn, stop_insn;
-
-      /* Compute hard regs live at start of block -- this is the real hard regs
-        marked live, plus live pseudo regs that have been renumbered to
-        hard regs.  */
+      regset regs_live = DF_LR_IN (BASIC_BLOCK_FOR_FN (cfun, b));
+      rtx_insn *start_insn, *stop_insn;
 
+      /* Compute hard regs live at start of block.  */
       REG_SET_TO_HARD_REG_SET (current_live_regs, regs_live);
 
-      EXECUTE_IF_SET_IN_REG_SET
-       (regs_live, FIRST_PSEUDO_REGISTER, i,
-        {
-          if (reg_renumber[i] >= 0)
-            {
-              regno = reg_renumber[i];
-              for (j = regno;
-                   j < regno + hard_regno_nregs[regno]
-                                               [PSEUDO_REGNO_MODE (i)];
-                   j++)
-                SET_HARD_REG_BIT (current_live_regs, j);
-            }
-        });
-
       /* Get starting and ending insn, handling the case where each might
         be a SEQUENCE.  */
-      start_insn = (b == 0 ? insns : BB_HEAD (BASIC_BLOCK (b)));
+      start_insn = (b == ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb->index ?
+                   insns : BB_HEAD (BASIC_BLOCK_FOR_FN (cfun, b)));
       stop_insn = target;
 
-      if (GET_CODE (start_insn) == INSN
+      if (NONJUMP_INSN_P (start_insn)
          && GET_CODE (PATTERN (start_insn)) == SEQUENCE)
-       start_insn = XVECEXP (PATTERN (start_insn), 0, 0);
+       start_insn = as_a <rtx_sequence *> (PATTERN (start_insn))->insn (0);
 
-      if (GET_CODE (stop_insn) == INSN
+      if (NONJUMP_INSN_P (stop_insn)
          && GET_CODE (PATTERN (stop_insn)) == SEQUENCE)
        stop_insn = next_insn (PREV_INSN (stop_insn));
 
@@ -994,9 +1009,12 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
           insn = next_insn_no_annul (insn))
        {
          rtx link;
-         rtx real_insn = insn;
+         rtx_insn *real_insn = insn;
          enum rtx_code code = GET_CODE (insn);
 
+         if (DEBUG_INSN_P (insn))
+           continue;
+
          /* If this insn is from the target of a branch, it isn't going to
             be used in the sequel.  If it is used in both cases, this
             test will not be true.  */
@@ -1006,17 +1024,29 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
 
          /* If this insn is a USE made by update_block, we care about the
             underlying insn.  */
-         if (code == INSN && GET_CODE (PATTERN (insn)) == USE
+         if (code == INSN
+             && GET_CODE (PATTERN (insn)) == USE
              && INSN_P (XEXP (PATTERN (insn), 0)))
-             real_insn = XEXP (PATTERN (insn), 0);
+           real_insn = as_a <rtx_insn *> (XEXP (PATTERN (insn), 0));
 
-         if (GET_CODE (real_insn) == CALL_INSN)
+         if (CALL_P (real_insn))
            {
-             /* CALL clobbers all call-used regs that aren't fixed except
-                sp, ap, and fp.  Do this before setting the result of the
-                call live.  */
-             AND_COMPL_HARD_REG_SET (current_live_regs,
-                                     regs_invalidated_by_call);
+             /* Values in call-clobbered registers survive a COND_EXEC CALL
+                if that is not executed; this matters for resoure use because
+                they may be used by a complementarily (or more strictly)
+                predicated instruction, or if the CALL is NORETURN.  */
+             if (GET_CODE (PATTERN (real_insn)) != COND_EXEC)
+               {
+                 HARD_REG_SET regs_invalidated_by_this_call;
+                 get_call_reg_set_usage (real_insn,
+                                         &regs_invalidated_by_this_call,
+                                         regs_invalidated_by_call);
+                 /* CALL clobbers all call-used regs that aren't fixed except
+                    sp, ap, and fp.  Do this before setting the result of the
+                    call live.  */
+                 AND_COMPL_HARD_REG_SET (current_live_regs,
+                                         regs_invalidated_by_this_call);
+               }
 
              /* A CALL_INSN sets any global register live, since it may
                 have been modified by the call.  */
@@ -1030,26 +1060,19 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
             parameters.  But they might be early.  A CALL_INSN will usually
             clobber registers used for parameters.  It isn't worth bothering
             with the unlikely case when it won't.  */
-         if ((GET_CODE (real_insn) == INSN
+         if ((NONJUMP_INSN_P (real_insn)
               && GET_CODE (PATTERN (real_insn)) != USE
               && GET_CODE (PATTERN (real_insn)) != CLOBBER)
-             || GET_CODE (real_insn) == JUMP_INSN
-             || GET_CODE (real_insn) == CALL_INSN)
+             || JUMP_P (real_insn)
+             || CALL_P (real_insn))
            {
              for (link = REG_NOTES (real_insn); link; link = XEXP (link, 1))
                if (REG_NOTE_KIND (link) == REG_DEAD
-                   && GET_CODE (XEXP (link, 0)) == REG
+                   && REG_P (XEXP (link, 0))
                    && REGNO (XEXP (link, 0)) < FIRST_PSEUDO_REGISTER)
-                 {
-                   unsigned int first_regno = REGNO (XEXP (link, 0));
-                   unsigned int last_regno
-                     = (first_regno
-                        + hard_regno_nregs[first_regno]
-                                          [GET_MODE (XEXP (link, 0))]);
-
-                   for (i = first_regno; i < last_regno; i++)
-                     SET_HARD_REG_BIT (pending_dead_regs, i);
-                 }
+                 add_to_hard_reg_set (&pending_dead_regs,
+                                     GET_MODE (XEXP (link, 0)),
+                                     REGNO (XEXP (link, 0)));
 
              note_stores (PATTERN (real_insn), update_live_status, NULL);
 
@@ -1057,33 +1080,40 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
                 These notes will always be accurate.  */
              for (link = REG_NOTES (real_insn); link; link = XEXP (link, 1))
                if (REG_NOTE_KIND (link) == REG_UNUSED
-                   && GET_CODE (XEXP (link, 0)) == REG
+                   && REG_P (XEXP (link, 0))
                    && REGNO (XEXP (link, 0)) < FIRST_PSEUDO_REGISTER)
-                 {
-                   unsigned int first_regno = REGNO (XEXP (link, 0));
-                   unsigned int last_regno
-                     = (first_regno
-                        + hard_regno_nregs[first_regno]
-                                          [GET_MODE (XEXP (link, 0))]);
-
-                   for (i = first_regno; i < last_regno; i++)
-                     CLEAR_HARD_REG_BIT (current_live_regs, i);
-                 }
+                 remove_from_hard_reg_set (&current_live_regs,
+                                          GET_MODE (XEXP (link, 0)),
+                                          REGNO (XEXP (link, 0)));
            }
 
-         else if (GET_CODE (real_insn) == CODE_LABEL)
+         else if (LABEL_P (real_insn))
            {
+             basic_block bb;
+
              /* A label clobbers the pending dead registers since neither
                 reload nor jump will propagate a value across a label.  */
              AND_COMPL_HARD_REG_SET (current_live_regs, pending_dead_regs);
              CLEAR_HARD_REG_SET (pending_dead_regs);
+
+             /* We must conservatively assume that all registers that used
+                to be live here still are.  The fallthrough edge may have
+                left a live register uninitialized.  */
+             bb = BLOCK_FOR_INSN (real_insn);
+             if (bb)
+               {
+                 HARD_REG_SET extra_live;
+
+                 REG_SET_TO_HARD_REG_SET (extra_live, DF_LR_IN (bb));
+                 IOR_HARD_REG_SET (current_live_regs, extra_live);
+               }
            }
 
          /* The beginning of the epilogue corresponds to the end of the
             RTL chain when there are no epilogue insns.  Certain resources
             are implicitly required at that point.  */
-         else if (GET_CODE (real_insn) == NOTE
-                  && NOTE_LINE_NUMBER (real_insn) == NOTE_INSN_EPILOGUE_BEG)
+         else if (NOTE_P (real_insn)
+                  && NOTE_KIND (real_insn) == NOTE_INSN_EPILOGUE_BEG)
            IOR_HARD_REG_SET (current_live_regs, start_of_epilogue_needs.regs);
        }
 
@@ -1102,8 +1132,8 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
   CLEAR_RESOURCE (&set);
   CLEAR_RESOURCE (&needed);
 
-  jump_insn = find_dead_or_set_registers (target, res, &jump_target, 0,
-                                         set, needed);
+  rtx_insn *jump_insn = find_dead_or_set_registers (target, res, &jump_target,
+                                                   0, set, needed);
 
   /* If we hit an unconditional branch, we have another way of finding out
      what is live: we can see what is live at the branch target and include
@@ -1113,17 +1143,18 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
   if (jump_insn)
     {
       struct resources new_resources;
-      rtx stop_insn = next_active_insn (jump_insn);
+      rtx_insn *stop_insn = next_active_insn (jump_insn);
 
-      mark_target_live_regs (insns, next_active_insn (jump_target),
-                            &new_resources);
+      if (!ANY_RETURN_P (jump_target))
+       jump_target = next_active_insn (as_a<rtx_insn *> (jump_target));
+      mark_target_live_regs (insns, jump_target, &new_resources);
       CLEAR_RESOURCE (&set);
       CLEAR_RESOURCE (&needed);
 
       /* Include JUMP_INSN in the needed registers.  */
       for (insn = target; insn != stop_insn; insn = next_active_insn (insn))
        {
-         mark_referenced_resources (insn, &needed, 1);
+         mark_referenced_resources (insn, &needed, true);
 
          COPY_HARD_REG_SET (scratch, needed.regs);
          AND_COMPL_HARD_REG_SET (scratch, set.regs);
@@ -1145,45 +1176,41 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res)
    This should be invoked before the first call to mark_target_live_regs.  */
 
 void
-init_resource_info (rtx epilogue_insn)
+init_resource_info (rtx_insn *epilogue_insn)
 {
   int i;
+  basic_block bb;
 
   /* Indicate what resources are required to be valid at the end of the current
-     function.  The condition code never is and memory always is.  If the
-     frame pointer is needed, it is and so is the stack pointer unless
-     EXIT_IGNORE_STACK is nonzero.  If the frame pointer is not needed, the
-     stack pointer is.  Registers used to return the function value are
-     needed.  Registers holding global variables are needed.  */
+     function.  The condition code never is and memory always is.
+     The stack pointer is needed unless EXIT_IGNORE_STACK is true
+     and there is an epilogue that restores the original stack pointer
+     from the frame pointer.  Registers used to return the function value
+     are needed.  Registers holding global variables are needed.  */
 
   end_of_function_needs.cc = 0;
   end_of_function_needs.memory = 1;
-  end_of_function_needs.unch_memory = 0;
   CLEAR_HARD_REG_SET (end_of_function_needs.regs);
 
   if (frame_pointer_needed)
     {
       SET_HARD_REG_BIT (end_of_function_needs.regs, FRAME_POINTER_REGNUM);
-#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
-      SET_HARD_REG_BIT (end_of_function_needs.regs, HARD_FRAME_POINTER_REGNUM);
-#endif
-      if (! EXIT_IGNORE_STACK
-         || current_function_sp_is_unchanging)
-       SET_HARD_REG_BIT (end_of_function_needs.regs, STACK_POINTER_REGNUM);
+      if (!HARD_FRAME_POINTER_IS_FRAME_POINTER)
+       SET_HARD_REG_BIT (end_of_function_needs.regs,
+                         HARD_FRAME_POINTER_REGNUM);
     }
-  else
+  if (!(frame_pointer_needed
+       && EXIT_IGNORE_STACK
+       && epilogue_insn
+       && !crtl->sp_is_unchanging))
     SET_HARD_REG_BIT (end_of_function_needs.regs, STACK_POINTER_REGNUM);
 
-  if (current_function_return_rtx != 0)
-    mark_referenced_resources (current_function_return_rtx,
-                              &end_of_function_needs, 1);
+  if (crtl->return_rtx != 0)
+    mark_referenced_resources (crtl->return_rtx,
+                              &end_of_function_needs, true);
 
   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-    if (global_regs[i]
-#ifdef EPILOGUE_USES
-       || EPILOGUE_USES (i)
-#endif
-       )
+    if (global_regs[i] || EPILOGUE_USES (i))
       SET_HARD_REG_BIT (end_of_function_needs.regs, i);
 
   /* The registers required to be live at the end of the function are
@@ -1206,12 +1233,21 @@ init_resource_info (rtx epilogue_insn)
   start_of_epilogue_needs = end_of_function_needs;
 
   while ((epilogue_insn = next_nonnote_insn (epilogue_insn)))
-    mark_set_resources (epilogue_insn, &end_of_function_needs, 0,
-                       MARK_SRC_DEST_CALL);
+    {
+      mark_set_resources (epilogue_insn, &end_of_function_needs, 0,
+                         MARK_SRC_DEST_CALL);
+      if (return_insn_p (epilogue_insn))
+       break;
+    }
 
   /* Allocate and initialize the tables used by mark_target_live_regs.  */
-  target_hash_table = xcalloc (TARGET_HASH_PRIME, sizeof (struct target_info *));
-  bb_ticks = xcalloc (last_basic_block, sizeof (int));
+  target_hash_table = XCNEWVEC (struct target_info *, TARGET_HASH_PRIME);
+  bb_ticks = XCNEWVEC (int, last_basic_block_for_fn (cfun));
+
+  /* Set the BLOCK_FOR_INSN of each label that starts a basic block.  */
+  FOR_EACH_BB_FN (bb, cfun)
+    if (LABEL_P (BB_HEAD (bb)))
+      BLOCK_FOR_INSN (BB_HEAD (bb)) = bb;
 }
 \f
 /* Free up the resources allocated to mark_target_live_regs ().  This
@@ -1220,6 +1256,8 @@ init_resource_info (rtx epilogue_insn)
 void
 free_resource_info (void)
 {
+  basic_block bb;
+
   if (target_hash_table != NULL)
     {
       int i;
@@ -1245,12 +1283,16 @@ free_resource_info (void)
       free (bb_ticks);
       bb_ticks = NULL;
     }
+
+  FOR_EACH_BB_FN (bb, cfun)
+    if (LABEL_P (BB_HEAD (bb)))
+      BLOCK_FOR_INSN (BB_HEAD (bb)) = NULL;
 }
 \f
 /* Clear any hashed information that we have stored for INSN.  */
 
 void
-clear_hashed_info_for_insn (rtx insn)
+clear_hashed_info_for_insn (rtx_insn *insn)
 {
   struct target_info *tinfo;
 
@@ -1269,7 +1311,7 @@ clear_hashed_info_for_insn (rtx insn)
 /* Increment the tick count for the basic block that contains INSN.  */
 
 void
-incr_ticks_for_insn (rtx insn)
+incr_ticks_for_insn (rtx_insn *insn)
 {
   int b = find_basic_block (insn, MAX_DELAY_SLOT_LIVE_SEARCH);
 
@@ -1280,7 +1322,7 @@ incr_ticks_for_insn (rtx insn)
 /* Add TRIAL to the set of resources used at the end of the current
    function.  */
 void
-mark_end_of_function_resources (rtx trial, int include_delayed_effects)
+mark_end_of_function_resources (rtx trial, bool include_delayed_effects)
 {
   mark_referenced_resources (trial, &end_of_function_needs,
                             include_delayed_effects);