OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / sched-rgn.c
index 0acdc4a..8e94888 100644 (file)
@@ -1,6 +1,6 @@
 /* Instruction scheduling pass.
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011
    Free Software Foundation, Inc.
    Contributed by Michael Tiemann (tiemann@cygnus.com) Enhanced by,
    and currently maintained by, Jim Wilson (wilson@cygnus.com)
@@ -49,7 +49,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
-#include "toplev.h"
+#include "diagnostic-core.h"
 #include "rtl.h"
 #include "tm_p.h"
 #include "hard-reg-set.h"
@@ -59,7 +59,6 @@ along with GCC; see the file COPYING3.  If not see
 #include "insn-config.h"
 #include "insn-attr.h"
 #include "except.h"
-#include "toplev.h"
 #include "recog.h"
 #include "cfglayout.h"
 #include "params.h"
@@ -235,9 +234,8 @@ static void add_branch_dependences (rtx, rtx);
 static void compute_block_dependences (int);
 
 static void schedule_region (int);
-static rtx concat_INSN_LIST (rtx, rtx);
 static void concat_insn_mem_list (rtx, rtx, rtx *, rtx *);
-static void propagate_deps (int, struct deps *);
+static void propagate_deps (int, struct deps_desc *);
 static void free_pending_lists (void);
 
 /* Functions for construction of the control flow graph.  */
@@ -354,7 +352,7 @@ extract_edgelst (sbitmap set, edgelst *el)
 
 /* Print the regions, for debugging purposes.  Callable from debugger.  */
 
-void
+DEBUG_FUNCTION void
 debug_regions (void)
 {
   int rgn, bb;
@@ -379,7 +377,7 @@ debug_regions (void)
 
 /* Print the region's basic blocks.  */
 
-void
+DEBUG_FUNCTION void
 debug_region (int rgn)
 {
   int bb;
@@ -448,7 +446,7 @@ dump_region_dot (FILE *f, int rgn)
 }
 
 /* The same, but first open a file specified by FNAME.  */
-void 
+void
 dump_region_dot_file (const char *fname, int rgn)
 {
   FILE *f = fopen (fname, "wt");
@@ -486,7 +484,6 @@ find_single_block_region (bool ebbs_p)
         for (bb = ebb_start; ; bb = bb->next_bb)
           {
             edge e;
-            edge_iterator ei;
 
             rgn_bb_table[i] = bb->index;
             RGN_NR_BLOCKS (nr_regions)++;
@@ -497,10 +494,8 @@ find_single_block_region (bool ebbs_p)
             if (bb->next_bb == EXIT_BLOCK_PTR
                 || LABEL_P (BB_HEAD (bb->next_bb)))
               break;
-            
-            FOR_EACH_EDGE (e, ei, bb->succs)
-             if ((e->flags & EDGE_FALLTHRU) != 0)
-               break;
+
+           e = find_fallthru_edge (bb->succs);
             if (! e)
               break;
             if (e->probability <= probability_cutoff)
@@ -783,7 +778,7 @@ haifa_find_rgns (void)
       int *queue, *degree1 = NULL;
       /* We use EXTENDED_RGN_HEADER as an addition to HEADER and put
         there basic blocks, which are forced to be region heads.
-        This is done to try to assemble few smaller regions 
+        This is done to try to assemble few smaller regions
         from a too_large region.  */
       sbitmap extended_rgn_header = NULL;
       bool extend_regions_p;
@@ -795,7 +790,7 @@ haifa_find_rgns (void)
         block of each region.  */
 
       queue = XNEWVEC (int, n_basic_blocks);
-      
+
       extend_regions_p = PARAM_VALUE (PARAM_MAX_SCHED_EXTEND_REGIONS_ITERS) > 0;
       if (extend_regions_p)
         {
@@ -851,11 +846,11 @@ haifa_find_rgns (void)
              loop_head = max_hdr[bb->index];
 
               if (extend_regions_p)
-                /* We save degree in case when we meet a too_large region 
-                  and cancel it.  We need a correct degree later when 
+                /* We save degree in case when we meet a too_large region
+                  and cancel it.  We need a correct degree later when
                    calling extend_rgns.  */
                 memcpy (degree1, degree, last_basic_block * sizeof (int));
-             
+
              /* Decrease degree of all I's successors for topological
                 ordering.  */
              FOR_EACH_EDGE (e, ei, bb->succs)
@@ -1022,7 +1017,7 @@ haifa_find_rgns (void)
 
                   degree = degree1;
                   degree1 = t;
-                  
+
                   /* And force successors of BB to be region heads.
                     This may provide several smaller regions instead
                     of one too_large region.  */
@@ -1037,10 +1032,10 @@ haifa_find_rgns (void)
       if (extend_regions_p)
         {
           free (degree1);
-          
+
           sbitmap_a_or_b (header, header, extended_rgn_header);
           sbitmap_free (extended_rgn_header);
+
           extend_rgns (degree, &idx, header, max_hdr);
         }
     }
@@ -1084,8 +1079,8 @@ find_rgns (void)
 static int gather_region_statistics (int **);
 static void print_region_statistics (int *, int, int *, int);
 
-/* Calculate the histogram that shows the number of regions having the 
-   given number of basic blocks, and store it in the RSP array.  Return 
+/* Calculate the histogram that shows the number of regions having the
+   given number of basic blocks, and store it in the RSP array.  Return
    the size of this array.  */
 static int
 gather_region_statistics (int **rsp)
@@ -1100,7 +1095,7 @@ gather_region_statistics (int **rsp)
       gcc_assert (nr_blocks >= 1);
 
       if (nr_blocks > a_sz)
-       {        
+       {
          a = XRESIZEVEC (int, a, nr_blocks);
          do
            a[a_sz++] = 0;
@@ -1114,14 +1109,14 @@ gather_region_statistics (int **rsp)
   return a_sz;
 }
 
-/* Print regions statistics.  S1 and S2 denote the data before and after 
+/* Print regions statistics.  S1 and S2 denote the data before and after
    calling extend_rgns, respectively.  */
 static void
 print_region_statistics (int *s1, int s1_sz, int *s2, int s2_sz)
 {
   int i;
-  
-  /* We iterate until s2_sz because extend_rgns does not decrease 
+
+  /* We iterate until s2_sz because extend_rgns does not decrease
      the maximal region size.  */
   for (i = 1; i < s2_sz; i++)
     {
@@ -1175,28 +1170,28 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
         /* This block already was processed in find_rgns.  */
         max_hdr[bbn] = -1;
     }
-  
+
   /* The idea is to topologically walk through CFG in top-down order.
      During the traversal, if all the predecessors of a node are
      marked to be in the same region (they all have the same max_hdr),
-     then current node is also marked to be a part of that region. 
+     then current node is also marked to be a part of that region.
      Otherwise the node starts its own region.
-     CFG should be traversed until no further changes are made.  On each 
-     iteration the set of the region heads is extended (the set of those 
-     blocks that have max_hdr[bbi] == bbi).  This set is upper bounded by the 
+     CFG should be traversed until no further changes are made.  On each
+     iteration the set of the region heads is extended (the set of those
+     blocks that have max_hdr[bbi] == bbi).  This set is upper bounded by the
      set of all basic blocks, thus the algorithm is guaranteed to
      terminate.  */
 
   while (rescan && iter < max_iter)
     {
       rescan = 0;
-      
+
       for (i = nblocks - 1; i >= 0; i--)
        {
          edge e;
          edge_iterator ei;
          int bbn = order[i];
-       
+
          if (max_hdr[bbn] != -1 && !TEST_BIT (header, bbn))
            {
              int hdr = -1;
@@ -1222,16 +1217,16 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
                        {
                          hdr = bbn;
                          break;
-                       }                   
+                       }
                    }
                  else
                    /* BB starts its own region.  */
                    {
                      hdr = bbn;
                      break;
-                   }           
+                   }
                }
-           
+
              if (hdr == bbn)
                {
                  /* If BB start its own region,
@@ -1240,7 +1235,7 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
                  rescan = 1;
                }
              else
-               gcc_assert (hdr != -1);     
+               gcc_assert (hdr != -1);
 
              max_hdr[bbn] = hdr;
            }
@@ -1248,17 +1243,17 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
 
       iter++;
     }
-  
+
   /* Statistics were gathered on the SPEC2000 package of tests with
      mainline weekly snapshot gcc-4.1-20051015 on ia64.
-     
+
      Statistics for SPECint:
      1 iteration : 1751 cases (38.7%)
      2 iterations: 2770 cases (61.3%)
      Blocks wrapped in regions by find_rgns without extension: 18295 blocks
      Blocks wrapped in regions by 2 iterations in extend_rgns: 23821 blocks
      (We don't count single block regions here).
-     
+
      Statistics for SPECfp:
      1 iteration : 621 cases (35.9%)
      2 iterations: 1110 cases (64.1%)
@@ -1270,11 +1265,11 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
      This can be overridden with max-sched-extend-regions-iters parameter:
      0 - disable region extension,
      N > 0 - do at most N iterations.  */
-  
+
   if (sched_verbose && iter != 0)
     fprintf (sched_dump, ";; Region extension iterations: %d%s\n", iter,
             rescan ? "... failed" : "");
-    
+
   if (!rescan && iter != 0)
     {
       int *s1 = NULL, s1_sz = 0;
@@ -1294,7 +1289,7 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
              edge e;
              edge_iterator ei;
              int num_bbs = 0, j, num_insns = 0, large;
-       
+
              large = too_large (bbn, &num_bbs, &num_insns);
 
              degree[bbn] = -1;
@@ -1329,7 +1324,7 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
                {
                  RGN_NR_BLOCKS (nr_regions) = 1;
                  nr_regions++;
-               }          
+               }
 
              num_bbs = 1;
 
@@ -1338,7 +1333,7 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
                  int succn = order[j];
 
                  if (max_hdr[succn] == bbn)
-                   /* This cycle iterates over all basic blocks, that 
+                   /* This cycle iterates over all basic blocks, that
                       are supposed to be in the region with head BBN,
                       and wraps them into that region (or in single
                       block region).  */
@@ -1346,7 +1341,7 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
                      gcc_assert (degree[succn] == 0);
 
                      degree[succn] = -1;
-                     rgn_bb_table[idx] = succn;                 
+                     rgn_bb_table[idx] = succn;
                      BLOCK_TO_BB (succn) = large ? 0 : num_bbs++;
                      CONTAINING_RGN (succn) = nr_regions;
 
@@ -1361,7 +1356,7 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
                        }
 
                      idx++;
-                               
+
                      FOR_EACH_EDGE (e, ei, BASIC_BLOCK (succn)->succs)
                        if (e->dest != EXIT_BLOCK_PTR)
                          degree[e->dest->index]--;
@@ -1380,7 +1375,7 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
        {
          int *s2, s2_sz;
 
-          /* Get the new statistics and print the comparison with the 
+          /* Get the new statistics and print the comparison with the
              one before calling this function.  */
          s2_sz = gather_region_statistics (&s2);
          print_region_statistics (s1, s1_sz, s2, s2_sz);
@@ -1388,11 +1383,11 @@ extend_rgns (int *degree, int *idxp, sbitmap header, int *loop_hdr)
          free (s2);
        }
     }
-  
+
   free (order);
   free (max_hdr);
 
-  *idxp = idx; 
+  *idxp = idx;
 }
 
 /* Functions for regions scheduling information.  */
@@ -1408,7 +1403,7 @@ compute_dom_prob_ps (int bb)
 
   /* We shouldn't have any real ebbs yet.  */
   gcc_assert (ebb_head [bb] == bb + current_blocks);
-  
+
   if (IS_RGN_ENTRY (bb))
     {
       SET_BIT (dom[bb], 0);
@@ -1594,7 +1589,7 @@ free_trg_info (void)
 
 /* Print candidates info, for debugging purposes.  Callable from debugger.  */
 
-void
+DEBUG_FUNCTION void
 debug_candidate (int i)
 {
   if (!candidate_table[i].is_valid)
@@ -1631,7 +1626,7 @@ debug_candidate (int i)
 
 /* Print candidates info, for debugging purposes.  Callable from debugger.  */
 
-void
+DEBUG_FUNCTION void
 debug_candidates (int trg)
 {
   int i;
@@ -1766,29 +1761,18 @@ update_live_1 (int src, rtx x)
 
   regno = REGNO (reg);
 
-  if (regno >= FIRST_PSEUDO_REGISTER || !global_regs[regno])
+  if (! HARD_REGISTER_NUM_P (regno)
+      || !global_regs[regno])
     {
-      if (regno < FIRST_PSEUDO_REGISTER)
+      for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
        {
-         int j = hard_regno_nregs[regno][GET_MODE (reg)];
-         while (--j >= 0)
-           {
-             for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
-               {
-                 basic_block b = candidate_table[src].update_bbs.first_member[i];
+         basic_block b = candidate_table[src].update_bbs.first_member[i];
 
-                 SET_REGNO_REG_SET (df_get_live_in (b), regno + j);
-               }
-           }
-       }
-      else
-       {
-         for (i = 0; i < candidate_table[src].update_bbs.nr_members; i++)
-           {
-             basic_block b = candidate_table[src].update_bbs.first_member[i];
-
-             SET_REGNO_REG_SET (df_get_live_in (b), regno);
-           }
+         if (HARD_REGISTER_NUM_P (regno))
+           bitmap_set_range (df_get_live_in (b), regno,
+                             hard_regno_nregs[regno][GET_MODE (reg)]);
+         else
+           bitmap_set_bit (df_get_live_in (b), regno);
        }
     }
 }
@@ -2072,12 +2056,12 @@ static int sched_n_insns;
 /* Implementations of the sched_info functions for region scheduling.  */
 static void init_ready_list (void);
 static int can_schedule_ready_p (rtx);
-static void begin_schedule_ready (rtx, rtx);
+static void begin_schedule_ready (rtx);
 static ds_t new_ready (rtx, ds_t);
 static int schedule_more_p (void);
 static const char *rgn_print_insn (const_rtx, int);
 static int rgn_rank (rtx, rtx);
-static void compute_jump_reg_dependencies (rtx, regset, regset, regset);
+static void compute_jump_reg_dependencies (rtx, regset);
 
 /* Functions for speculative scheduling.  */
 static void rgn_add_remove_insn (rtx, int);
@@ -2119,7 +2103,7 @@ init_ready_list (void)
   /* Initialize ready list with all 'ready' insns in target block.
      Count number of insns in the target block being scheduled.  */
   for (insn = NEXT_INSN (prev_head); insn != next_tail; insn = NEXT_INSN (insn))
-    {      
+    {
       try_ready (insn);
       target_n_insns++;
 
@@ -2142,7 +2126,7 @@ init_ready_list (void)
        src_head = head;
 
        for (insn = src_head; insn != src_next_tail; insn = NEXT_INSN (insn))
-         if (INSN_P (insn) && !BOUNDARY_DEBUG_INSN_P (insn))
+         if (INSN_P (insn))
            try_ready (insn);
       }
 }
@@ -2157,7 +2141,7 @@ can_schedule_ready_p (rtx insn)
   if (INSN_BB (insn) != target_bb
       && IS_SPECULATIVE_INSN (insn)
       && !check_live (insn, INSN_BB (insn)))
-    return 0;          
+    return 0;
   else
     return 1;
 }
@@ -2167,7 +2151,7 @@ can_schedule_ready_p (rtx insn)
    can_schedule_ready_p () differs from the one passed to
    begin_schedule_ready ().  */
 static void
-begin_schedule_ready (rtx insn, rtx last ATTRIBUTE_UNUSED)
+begin_schedule_ready (rtx insn)
 {
   /* An interblock motion?  */
   if (INSN_BB (insn) != target_bb)
@@ -2206,12 +2190,12 @@ new_ready (rtx next, ds_t ts)
       int not_ex_free = 0;
 
       /* For speculative insns, before inserting to ready/queue,
-        check live, exception-free, and issue-delay.  */       
+        check live, exception-free, and issue-delay.  */
       if (!IS_VALID (INSN_BB (next))
          || CANT_MOVE (next)
          || (IS_SPECULATIVE_INSN (next)
              && ((recog_memoized (next) >= 0
-                  && min_insn_conflict_delay (curr_state, next, next) 
+                  && min_insn_conflict_delay (curr_state, next, next)
                    > PARAM_VALUE (PARAM_MAX_SCHED_INSN_CONFLICT_DELAY))
                   || IS_SPECULATION_CHECK_P (next)
                  || !check_live (next, INSN_BB (next))
@@ -2242,7 +2226,7 @@ new_ready (rtx next, ds_t ts)
             ts = (ts & ~SPECULATIVE) | HARD_DEP;
        }
     }
-  
+
   return ts;
 }
 
@@ -2310,22 +2294,18 @@ contributes_to_priority (rtx next, rtx insn)
   return BLOCK_TO_BB (BLOCK_NUM (next)) == BLOCK_TO_BB (BLOCK_NUM (insn));
 }
 
-/* INSN is a JUMP_INSN, COND_SET is the set of registers that are
-   conditionally set before INSN.  Store the set of registers that
-   must be considered as used by this jump in USED and that of
-   registers that must be considered as set in SET.  */
+/* INSN is a JUMP_INSN.  Store the set of registers that must be
+   considered as used by this jump in USED.  */
 
 static void
 compute_jump_reg_dependencies (rtx insn ATTRIBUTE_UNUSED,
-                              regset cond_exec ATTRIBUTE_UNUSED,
-                              regset used ATTRIBUTE_UNUSED,
-                              regset set ATTRIBUTE_UNUSED)
+                              regset used ATTRIBUTE_UNUSED)
 {
   /* Nothing to do here, since we postprocess jumps in
      add_branch_dependences.  */
 }
 
-/* This variable holds common_sched_info hooks and data relevant to 
+/* This variable holds common_sched_info hooks and data relevant to
    the interblock scheduler.  */
 static struct common_sched_info_def rgn_common_sched_info;
 
@@ -2384,7 +2364,9 @@ static const struct haifa_sched_info rgn_const_sched_info =
 
   rgn_add_remove_insn,
   begin_schedule_ready,
+  NULL,
   advance_target_bb,
+  NULL, NULL,
   SCHED_RGN
 };
 
@@ -2400,7 +2382,7 @@ get_rgn_sched_max_insns_priority (void)
   return rgn_sched_info.sched_max_insns_priority;
 }
 
-/* Determine if PAT sets a CLASS_LIKELY_SPILLED_P register.  */
+/* Determine if PAT sets a TARGET_CLASS_LIKELY_SPILLED_P register.  */
 
 static bool
 sets_likely_spilled (rtx pat)
@@ -2417,8 +2399,8 @@ sets_likely_spilled_1 (rtx x, const_rtx pat, void *data)
 
   if (GET_CODE (pat) == SET
       && REG_P (x)
-      && REGNO (x) < FIRST_PSEUDO_REGISTER
-      && CLASS_LIKELY_SPILLED_P (REGNO_REG_CLASS (REGNO (x))))
+      && HARD_REGISTER_P (x)
+      && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (x))))
     *ret = true;
 }
 
@@ -2447,8 +2429,8 @@ add_branch_dependences (rtx head, rtx tail)
 
      COND_EXEC insns cannot be moved past a branch (see e.g. PR17808).
 
-     Insns setting CLASS_LIKELY_SPILLED_P registers (usually return values)
-     are not moved before reload because we can wind up with register
+     Insns setting TARGET_CLASS_LIKELY_SPILLED_P registers (usually return
+     values) are not moved before reload because we can wind up with register
      allocation failures.  */
 
   while (tail != head && DEBUG_INSN_P (tail))
@@ -2567,18 +2549,7 @@ add_branch_dependences (rtx head, rtx tail)
    the variables of its predecessors.  When the analysis for a bb completes,
    we save the contents to the corresponding bb_deps[bb] variable.  */
 
-static struct deps *bb_deps;
-
-/* Duplicate the INSN_LIST elements of COPY and prepend them to OLD.  */
-
-static rtx
-concat_INSN_LIST (rtx copy, rtx old)
-{
-  rtx new_rtx = old;
-  for (; copy ; copy = XEXP (copy, 1))
-    new_rtx = alloc_INSN_LIST (XEXP (copy, 0), new_rtx);
-  return new_rtx;
-}
+static struct deps_desc *bb_deps;
 
 static void
 concat_insn_mem_list (rtx copy_insns, rtx copy_mems, rtx *old_insns_p,
@@ -2601,7 +2572,7 @@ concat_insn_mem_list (rtx copy_insns, rtx copy_mems, rtx *old_insns_p,
 
 /* Join PRED_DEPS to the SUCC_DEPS.  */
 void
-deps_join (struct deps *succ_deps, struct deps *pred_deps)
+deps_join (struct deps_desc *succ_deps, struct deps_desc *pred_deps)
 {
   unsigned reg;
   reg_set_iterator rsi;
@@ -2633,6 +2604,9 @@ deps_join (struct deps *succ_deps, struct deps *pred_deps)
                         &succ_deps->pending_write_insns,
                         &succ_deps->pending_write_mems);
 
+  succ_deps->pending_jump_insns
+    = concat_INSN_LIST (pred_deps->pending_jump_insns,
+                        succ_deps->pending_jump_insns);
   succ_deps->last_pending_memory_flush
     = concat_INSN_LIST (pred_deps->last_pending_memory_flush,
                         succ_deps->last_pending_memory_flush);
@@ -2660,7 +2634,7 @@ deps_join (struct deps *succ_deps, struct deps *pred_deps)
 /* After computing the dependencies for block BB, propagate the dependencies
    found in TMP_DEPS to the successors of the block.  */
 static void
-propagate_deps (int bb, struct deps *pred_deps)
+propagate_deps (int bb, struct deps_desc *pred_deps)
 {
   basic_block block = BASIC_BLOCK (BB_TO_BLOCK (bb));
   edge_iterator ei;
@@ -2684,12 +2658,14 @@ propagate_deps (int bb, struct deps *pred_deps)
   bb_deps[bb].pending_read_mems = pred_deps->pending_read_mems;
   bb_deps[bb].pending_write_insns = pred_deps->pending_write_insns;
   bb_deps[bb].pending_write_mems = pred_deps->pending_write_mems;
+  bb_deps[bb].pending_jump_insns = pred_deps->pending_jump_insns;
 
   /* Can't allow these to be freed twice.  */
   pred_deps->pending_read_insns = 0;
   pred_deps->pending_read_mems = 0;
   pred_deps->pending_write_insns = 0;
   pred_deps->pending_write_mems = 0;
+  pred_deps->pending_jump_insns = 0;
 }
 
 /* Compute dependences inside bb.  In a multiple blocks region:
@@ -2715,7 +2691,7 @@ static void
 compute_block_dependences (int bb)
 {
   rtx head, tail;
-  struct deps tmp_deps;
+  struct deps_desc tmp_deps;
 
   tmp_deps = bb_deps[bb];
 
@@ -2768,6 +2744,7 @@ free_pending_lists (void)
       free_INSN_LIST_list (&bb_deps[bb].pending_write_insns);
       free_EXPR_LIST_list (&bb_deps[bb].pending_read_mems);
       free_EXPR_LIST_list (&bb_deps[bb].pending_write_mems);
+      free_INSN_LIST_list (&bb_deps[bb].pending_jump_insns);
     }
 }
 \f
@@ -2775,7 +2752,7 @@ free_pending_lists (void)
    Callable from debugger.  */
 /* Print dependences for debugging starting from FROM_BB.
    Callable from debugger.  */
-void
+DEBUG_FUNCTION void
 debug_rgn_dependencies (int from_bb)
 {
   int bb;
@@ -2872,9 +2849,9 @@ sched_is_disabled_for_current_region_p (void)
   return true;
 }
 
-/* Free all region dependencies saved in INSN_BACK_DEPS and 
+/* Free all region dependencies saved in INSN_BACK_DEPS and
    INSN_RESOLVED_BACK_DEPS.  The Haifa scheduler does this on the fly
-   when scheduling, so this function is supposed to be called from 
+   when scheduling, so this function is supposed to be called from
    the selective scheduling only.  */
 void
 free_rgn_deps (void)
@@ -2884,7 +2861,7 @@ free_rgn_deps (void)
   for (bb = 0; bb < current_nr_blocks; bb++)
     {
       rtx head, tail;
-      
+
       gcc_assert (EBB_FIRST_BB (bb) == EBB_LAST_BB (bb));
       get_ebb_head_tail (EBB_FIRST_BB (bb), EBB_LAST_BB (bb), &head, &tail);
 
@@ -2896,7 +2873,7 @@ static int rgn_n_insns;
 
 /* Compute insn priority for a current region.  */
 void
-compute_priorities (void) 
+compute_priorities (void)
 {
   int bb;
 
@@ -2904,7 +2881,7 @@ compute_priorities (void)
   for (bb = 0; bb < current_nr_blocks; bb++)
     {
       rtx head, tail;
-      
+
       gcc_assert (EBB_FIRST_BB (bb) == EBB_LAST_BB (bb));
       get_ebb_head_tail (EBB_FIRST_BB (bb), EBB_LAST_BB (bb), &head, &tail);
 
@@ -2951,12 +2928,12 @@ schedule_region (int rgn)
        {
          basic_block first_bb, last_bb;
          rtx head, tail;
-         
+
          first_bb = EBB_FIRST_BB (bb);
          last_bb = EBB_LAST_BB (bb);
-         
+
          get_ebb_head_tail (first_bb, last_bb, &head, &tail);
-         
+
          if (no_real_insns_p (head, tail))
            {
              gcc_assert (first_bb == last_bb);
@@ -3127,7 +3104,7 @@ rgn_setup_region (int rgn)
   /* Set variables for the current region.  */
   current_nr_blocks = RGN_NR_BLOCKS (rgn);
   current_blocks = RGN_BLOCKS (rgn);
-  
+
   /* EBB_HEAD is a region-scope structure.  But we realloc it for
      each region to save time/memory/something else.
      See comments in add_block1, for what reasons we allocate +1 element.  */
@@ -3150,18 +3127,18 @@ sched_rgn_compute_dependencies (int rgn)
       init_deps_global ();
 
       /* Initializations for region data dependence analysis.  */
-      bb_deps = XNEWVEC (struct deps, current_nr_blocks);
+      bb_deps = XNEWVEC (struct deps_desc, current_nr_blocks);
       for (bb = 0; bb < current_nr_blocks; bb++)
-       init_deps (bb_deps + bb);
+       init_deps (bb_deps + bb, false);
 
       /* Initialize bitmap used in add_branch_dependences.  */
       insn_referenced = sbitmap_alloc (sched_max_luid);
       sbitmap_zero (insn_referenced);
-      
+
       /* Compute backward dependencies.  */
       for (bb = 0; bb < current_nr_blocks; bb++)
        compute_block_dependences (bb);
-      
+
       sbitmap_free (insn_referenced);
       free_pending_lists ();
       finish_deps_global ();
@@ -3185,7 +3162,7 @@ void
 sched_rgn_local_init (int rgn)
 {
   int bb;
-      
+
   /* Compute interblock info: probabilities, split-edges, dominators, etc.  */
   if (current_nr_blocks > 1)
     {
@@ -3242,7 +3219,7 @@ sched_rgn_local_init (int rgn)
 }
 
 /* Free data computed for the finished region.  */
-void 
+void
 sched_rgn_local_free (void)
 {
   free (prob);
@@ -3372,7 +3349,7 @@ rgn_make_new_region_out_of_new_block (basic_block bb)
   BLOCK_TO_BB (bb->index) = 0;
 
   nr_regions++;
-      
+
   RGN_BLOCKS (nr_regions) = i + 1;
 }
 
@@ -3389,7 +3366,7 @@ rgn_add_block (basic_block bb, basic_block after)
       RGN_DONT_CALC_DEPS (nr_regions - 1) = (after == EXIT_BLOCK_PTR);
     }
   else
-    { 
+    {
       int i, pos;
 
       /* We need to fix rgn_table, block_to_bb, containing_rgn
@@ -3398,7 +3375,7 @@ rgn_add_block (basic_block bb, basic_block after)
       BLOCK_TO_BB (bb->index) = BLOCK_TO_BB (after->index);
 
       /* We extend ebb_head to one more position to
-        easily find the last position of the last ebb in 
+        easily find the last position of the last ebb in
         the current region.  Thus, ebb_head[BLOCK_TO_BB (after) + 1]
         is _always_ valid for access.  */
 
@@ -3407,7 +3384,8 @@ rgn_add_block (basic_block bb, basic_block after)
       /* Now POS is the index of the last block in the region.  */
 
       /* Find index of basic block AFTER.  */
-      for (; rgn_bb_table[pos] != after->index; pos--);
+      for (; rgn_bb_table[pos] != after->index; pos--)
+       ;
 
       pos++;
       gcc_assert (pos > ebb_head[i - 1]);
@@ -3417,24 +3395,24 @@ rgn_add_block (basic_block bb, basic_block after)
 
       /* Source position: ebb_head[i]
         Destination position: ebb_head[i] + 1
-        Last position: 
+        Last position:
           RGN_BLOCKS (nr_regions) - 1
         Number of elements to copy: (last_position) - (source_position) + 1
        */
-      
+
       memmove (rgn_bb_table + pos + 1,
               rgn_bb_table + pos,
               ((RGN_BLOCKS (nr_regions) - 1) - (pos) + 1)
               * sizeof (*rgn_bb_table));
 
       rgn_bb_table[pos] = bb->index;
-      
+
       for (; i <= current_nr_blocks; i++)
        ebb_head [i]++;
 
       i = CONTAINING_RGN (after->index);
       CONTAINING_RGN (bb->index) = i;
-      
+
       RGN_HAS_REAL_EBB (i) = 1;
 
       for (++i; i <= nr_regions; i++)
@@ -3451,18 +3429,20 @@ rgn_fix_recovery_cfg (int bbi, int check_bbi, int check_bb_nexti)
   int old_pos, new_pos, i;
 
   BLOCK_TO_BB (check_bb_nexti) = BLOCK_TO_BB (bbi);
-  
+
   for (old_pos = ebb_head[BLOCK_TO_BB (check_bbi) + 1] - 1;
        rgn_bb_table[old_pos] != check_bb_nexti;
-       old_pos--);
+       old_pos--)
+    ;
   gcc_assert (old_pos > ebb_head[BLOCK_TO_BB (check_bbi)]);
 
   for (new_pos = ebb_head[BLOCK_TO_BB (bbi) + 1] - 1;
        rgn_bb_table[new_pos] != bbi;
-       new_pos--);
+       new_pos--)
+    ;
   new_pos++;
   gcc_assert (new_pos > ebb_head[BLOCK_TO_BB (bbi)]);
-  
+
   gcc_assert (new_pos < old_pos);
 
   memmove (rgn_bb_table + new_pos + 1,
@@ -3518,8 +3498,8 @@ static bool
 gate_handle_sched2 (void)
 {
 #ifdef INSN_SCHEDULING
-  return optimize > 0 && flag_schedule_insns_after_reload 
-    && dbg_cnt (sched2_func);
+  return optimize > 0 && flag_schedule_insns_after_reload
+    && !targetm.delay_sched2 && dbg_cnt (sched2_func);
 #else
   return 0;
 #endif
@@ -3537,7 +3517,7 @@ rest_of_handle_sched2 (void)
     {
       /* Do control and data sched analysis again,
         and write some more of the results to dump file.  */
-      if (flag_sched2_use_superblocks || flag_sched2_use_traces)
+      if (flag_sched2_use_superblocks)
        schedule_ebbs ();
       else
        schedule_insns ();
@@ -3562,7 +3542,6 @@ struct rtl_opt_pass pass_sched =
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
   TODO_df_finish | TODO_verify_rtl_sharing |
-  TODO_dump_func |
   TODO_verify_flow |
   TODO_ggc_collect                      /* todo_flags_finish */
  }
@@ -3584,7 +3563,6 @@ struct rtl_opt_pass pass_sched2 =
   0,                                    /* properties_destroyed */
   0,                                    /* todo_flags_start */
   TODO_df_finish | TODO_verify_rtl_sharing |
-  TODO_dump_func |
   TODO_verify_flow |
   TODO_ggc_collect                      /* todo_flags_finish */
  }