From: Trevor Saunders <tbsaunde+...@tbsaunde.org>

The old versions of the functions copied here are removed in later patches in
my queue once all the lists are gone from sched-*.  However they are necessary
temporarily to not have to convert all the lists at once which made writing and
hopefully reviewing these patches much easier.

gcc/ChangeLog:

2016-04-20  Trevor Saunders  <tbsaunde+...@tbsaunde.org>

        * sched-deps.c (add_dependence_list): Adjust.
        (add_dependence_list_and_free): Likewise.
        (remove_from_both_dependence_lists): Likewise.
        (add_insn_mem_dependence): Likewise. Likewise.
        (flush_pending_lists): Likewise.
        (sched_analyze_1): Likewise.
        (sched_analyze_2): Likewise.
        (sched_analyze_insn): Likewise.
        (init_deps): Likewise.
        (free_deps): Likewise.
        * sched-int.h (struct deps_desc): Make pending_read_insns and
        pending_write_insns vectors.
        * sched-rgn.c (concat_mem_list): Adjust.
        (deps_join): Likewise.
        (propagate_deps): Likewise.
        (free_pending_lists): Likewise.
---
 gcc/sched-deps.c | 134 ++++++++++++++++++++++++++++++-------------------------
 gcc/sched-int.h  |   4 +-
 gcc/sched-rgn.c  |  41 +++++++----------
 3 files changed, 91 insertions(+), 88 deletions(-)

diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index 8f3a124..879c9ca 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -1568,6 +1568,20 @@ add_dependence_list (rtx_insn *insn, rtx_insn_list 
*list, int uncond,
   mark_as_hard = false;
 }
 
+static void
+add_dependence_list (rtx_insn *insn, const vec<rtx_insn *> &insns, int uncond,
+                    enum reg_note dep_type, bool hard)
+{
+  mark_as_hard = hard;
+  unsigned int len = insns.length ();
+  for (unsigned int i = len - 1; i < len; i--)
+    {
+      if (uncond || ! sched_insns_conditions_mutex_p (insn, insns[i]))
+       add_dependence (insn, insns[i], dep_type);
+    }
+  mark_as_hard = false;
+}
+
 /* Similar, but free *LISTP at the same time, when the context
    is not readonly.  HARD should be true if DEP_NONREG should be set on
    newly created dependencies.  */
@@ -1588,6 +1602,22 @@ add_dependence_list_and_free (struct deps_desc *deps, 
rtx_insn *insn,
   free_INSN_LIST_list (listp);
 }
 
+static void
+add_dependence_list_and_free (struct deps_desc *deps, rtx_insn *insn,
+                             vec<rtx_insn *> *insns,
+                             int uncond, enum reg_note dep_type, bool hard)
+{
+  add_dependence_list (insn, *insns, uncond, dep_type, hard);
+
+  /* We don't want to short-circuit dependencies involving debug
+     insns, because they may cause actual dependencies to be
+     disregarded.  */
+  if (deps->readonly || DEBUG_INSN_P (insn))
+    return;
+
+  insns->release ();
+}
+
 /* Remove all occurrences of INSN from LIST.  Return the number of
    occurrences removed.  */
 
@@ -1614,22 +1644,22 @@ remove_from_dependence_list (rtx_insn *insn, 
rtx_insn_list **listp)
 /* Same as above, but process two lists at once.  */
 static int
 remove_from_both_dependence_lists (rtx_insn *insn,
-                                  rtx_insn_list **listp,
+                                  vec<rtx_insn *> *insns,
                                   rtx_expr_list **exprp)
 {
   int removed = 0;
 
-  while (*listp)
+  unsigned int len = insns->length ();
+  for (unsigned int i = len - 1; i < len; i--)
     {
-      if (XEXP (*listp, 0) == insn)
+      if ((*insns)[i] == insn)
         {
-          remove_free_INSN_LIST_node (listp);
+         insns->ordered_remove (i);
           remove_free_EXPR_LIST_node (exprp);
           removed++;
           continue;
         }
 
-      listp = (rtx_insn_list **)&XEXP (*listp, 1);
       exprp = (rtx_expr_list **)&XEXP (*exprp, 1);
     }
 
@@ -1710,29 +1740,24 @@ static void
 add_insn_mem_dependence (struct deps_desc *deps, bool read_p,
                         rtx_insn *insn, rtx mem)
 {
-  rtx_insn_list **insn_list;
-  rtx_insn_list *insn_node;
   rtx_expr_list **mem_list;
   rtx_expr_list *mem_node;
 
   gcc_assert (!deps->readonly);
   if (read_p)
     {
-      insn_list = &deps->pending_read_insns;
+      deps->pending_read_insns.safe_push (insn);
       mem_list = &deps->pending_read_mems;
       if (!DEBUG_INSN_P (insn))
        deps->pending_read_list_length++;
     }
   else
     {
-      insn_list = &deps->pending_write_insns;
+      deps->pending_write_insns.safe_push (insn);
       mem_list = &deps->pending_write_mems;
       deps->pending_write_list_length++;
     }
 
-  insn_node = alloc_INSN_LIST (insn, *insn_list);
-  *insn_list = insn_node;
-
   if (sched_deps_info->use_cselib)
     {
       mem = shallow_copy_rtx (mem);
@@ -1777,8 +1802,8 @@ flush_pending_lists (struct deps_desc *deps, rtx_insn 
*insn, int for_read,
   if (DEBUG_INSN_P (insn))
     {
       if (for_write)
-       free_INSN_LIST_list (&deps->pending_read_insns);
-      free_INSN_LIST_list (&deps->pending_write_insns);
+       deps->pending_read_insns.release ();
+      deps->pending_write_insns.release ();
       free_INSN_LIST_list (&deps->last_pending_memory_flush);
       free_INSN_LIST_list (&deps->pending_jump_insns);
     }
@@ -2489,33 +2514,29 @@ sched_analyze_1 (struct deps_desc *deps, rtx x, 
rtx_insn *insn)
        }
       else
        {
-         rtx_insn_list *pending;
          rtx_expr_list *pending_mem;
 
-         pending = deps->pending_read_insns;
+         unsigned int len = deps->pending_read_insns.length ();
          pending_mem = deps->pending_read_mems;
-         while (pending)
+         for (unsigned int i = len - 1; i < len; i--)
            {
+             rtx_insn *temp = deps->pending_read_insns[i];
              if (anti_dependence (pending_mem->element (), t)
-                 && ! sched_insns_conditions_mutex_p (insn, pending->insn ()))
-               note_mem_dep (t, pending_mem->element (), pending->insn (),
-                             DEP_ANTI);
+                 && ! sched_insns_conditions_mutex_p (insn, temp))
+               note_mem_dep (t, pending_mem->element (), temp, DEP_ANTI);
 
-             pending = pending->next ();
              pending_mem = pending_mem->next ();
            }
 
-         pending = deps->pending_write_insns;
+         len = deps->pending_write_insns.length ();
          pending_mem = deps->pending_write_mems;
-         while (pending)
+         for (unsigned int i = len - 1; i < len; i--)
            {
+             rtx_insn *temp = deps->pending_write_insns[i];
              if (output_dependence (pending_mem->element (), t)
-                 && ! sched_insns_conditions_mutex_p (insn, pending->insn ()))
-               note_mem_dep (t, pending_mem->element (),
-                             pending->insn (),
-                             DEP_OUTPUT);
+                 && ! sched_insns_conditions_mutex_p (insn, temp))
+               note_mem_dep (t, pending_mem->element (), temp, DEP_OUTPUT);
 
-             pending = pending->next ();
              pending_mem = pending_mem-> next ();
            }
 
@@ -2620,7 +2641,6 @@ sched_analyze_2 (struct deps_desc *deps, rtx x, rtx_insn 
*insn)
       {
        /* Reading memory.  */
        rtx_insn_list *u;
-       rtx_insn_list *pending;
        rtx_expr_list *pending_mem;
        rtx t = x;
 
@@ -2639,34 +2659,29 @@ sched_analyze_2 (struct deps_desc *deps, rtx x, 
rtx_insn *insn)
        if (!DEBUG_INSN_P (insn))
          {
            t = canon_rtx (t);
-           pending = deps->pending_read_insns;
+           unsigned int len = deps->pending_read_insns.length ();
            pending_mem = deps->pending_read_mems;
-           while (pending)
+           for (unsigned int i = len - 1; i < len; i--)
              {
+               rtx_insn *temp = deps->pending_read_insns[i];
                if (read_dependence (pending_mem->element (), t)
-                   && ! sched_insns_conditions_mutex_p (insn,
-                                                        pending->insn ()))
-                 note_mem_dep (t, pending_mem->element (),
-                               pending->insn (),
-                               DEP_ANTI);
+                   && ! sched_insns_conditions_mutex_p (insn, temp))
+                 note_mem_dep (t, pending_mem->element (), temp, DEP_ANTI);
 
-               pending = pending->next ();
                pending_mem = pending_mem->next ();
              }
 
-           pending = deps->pending_write_insns;
+           len = deps->pending_write_insns.length ();
            pending_mem = deps->pending_write_mems;
-           while (pending)
+           for (unsigned int i = len - 1; i < len; i--)
              {
+               rtx_insn *temp = deps->pending_write_insns[i];
                if (true_dependence (pending_mem->element (), VOIDmode, t)
-                   && ! sched_insns_conditions_mutex_p (insn,
-                                                        pending->insn ()))
-                 note_mem_dep (t, pending_mem->element (),
-                               pending->insn (),
+                   && ! sched_insns_conditions_mutex_p (insn, temp))
+                 note_mem_dep (t, pending_mem->element (), temp,
                                sched_deps_info->generate_spec_deps
                                ? BEGIN_DATA | DEP_TRUE : DEP_TRUE);
 
-               pending = pending->next ();
                pending_mem = pending_mem->next ();
              }
 
@@ -2987,7 +3002,6 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, 
rtx_insn *insn)
        reg_pending_barrier = MOVE_BARRIER;
       else
        {
-         rtx_insn_list *pending;
          rtx_expr_list *pending_mem;
 
           if (sched_deps_info->compute_jump_reg_dependencies)
@@ -3012,26 +3026,24 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, 
rtx_insn *insn)
             jump.  Non-volatile reads must happen before the jump iff
             the result is needed by the above register used mask.  */
 
-         pending = deps->pending_write_insns;
+         unsigned int len = deps->pending_write_insns.length ();
          pending_mem = deps->pending_write_mems;
-         while (pending)
+         for (unsigned int i = len - 1; i < len; i--)
            {
-             if (! sched_insns_conditions_mutex_p (insn, pending->insn ()))
-               add_dependence (insn, pending->insn (),
-                               REG_DEP_OUTPUT);
-             pending = pending->next ();
+             rtx_insn *temp = deps->pending_write_insns[i];
+             if (! sched_insns_conditions_mutex_p (insn, temp))
+               add_dependence (insn, temp, REG_DEP_OUTPUT);
              pending_mem = pending_mem->next ();
            }
 
-         pending = deps->pending_read_insns;
+         len = deps->pending_read_insns.length ();
          pending_mem = deps->pending_read_mems;
-         while (pending)
+         for (unsigned int i = len - 1; i < len; i--)
            {
+             rtx_insn *temp = deps->pending_read_insns[i];
              if (MEM_VOLATILE_P (pending_mem->element ())
-                 && ! sched_insns_conditions_mutex_p (insn, pending->insn ()))
-               add_dependence (insn, pending->insn (),
-                               REG_DEP_OUTPUT);
-             pending = pending->next ();
+                 && ! sched_insns_conditions_mutex_p (insn, temp))
+               add_dependence (insn, temp, REG_DEP_OUTPUT);
              pending_mem = pending_mem->next ();
            }
 
@@ -3887,9 +3899,9 @@ init_deps (struct deps_desc *deps, bool lazy_reg_last)
     deps->reg_last = XCNEWVEC (struct deps_reg, max_reg);
   INIT_REG_SET (&deps->reg_last_in_use);
 
-  deps->pending_read_insns = 0;
+  deps->pending_read_insns.create (0);
   deps->pending_read_mems = 0;
-  deps->pending_write_insns = 0;
+  deps->pending_write_insns.create (0);
   deps->pending_write_mems = 0;
   deps->pending_jump_insns = 0;
   deps->pending_read_list_length = 0;
@@ -3935,9 +3947,9 @@ free_deps (struct deps_desc *deps)
     }
   deps->max_reg = 0;
 
-  free_INSN_LIST_list (&deps->pending_read_insns);
+  deps->pending_read_insns.release ();
   free_EXPR_LIST_list (&deps->pending_read_mems);
-  free_INSN_LIST_list (&deps->pending_write_insns);
+  deps->pending_write_insns.release ();
   free_EXPR_LIST_list (&deps->pending_write_mems);
   free_INSN_LIST_list (&deps->last_pending_memory_flush);
 
diff --git a/gcc/sched-int.h b/gcc/sched-int.h
index de5d326..45890b8 100644
--- a/gcc/sched-int.h
+++ b/gcc/sched-int.h
@@ -466,13 +466,13 @@ struct deps_desc
      to a list more than once.  */
 
   /* An INSN_LIST containing all insns with pending read operations.  */
-  rtx_insn_list *pending_read_insns;
+  vec<rtx_insn *> pending_read_insns;
 
   /* An EXPR_LIST containing all MEM rtx's which are pending reads.  */
   rtx_expr_list *pending_read_mems;
 
   /* An INSN_LIST containing all insns with pending write operations.  */
-  rtx_insn_list *pending_write_insns;
+  vec<rtx_insn *> pending_write_insns;
 
   /* An EXPR_LIST containing all MEM rtx's which are pending writes.  */
   rtx_expr_list *pending_write_mems;
diff --git a/gcc/sched-rgn.c b/gcc/sched-rgn.c
index d4b71a1..9e807a1 100644
--- a/gcc/sched-rgn.c
+++ b/gcc/sched-rgn.c
@@ -238,8 +238,7 @@ static void add_branch_dependences (rtx_insn *, rtx_insn *);
 static void compute_block_dependences (int);
 
 static void schedule_region (int);
-static void concat_insn_mem_list (rtx_insn_list *, rtx_expr_list *,
-                                 rtx_insn_list **, rtx_expr_list **);
+static void concat_mem_list (rtx_expr_list *, rtx_expr_list **);
 static void propagate_deps (int, struct deps_desc *);
 static void free_pending_lists (void);
 
@@ -2576,23 +2575,16 @@ add_branch_dependences (rtx_insn *head, rtx_insn *tail)
 static struct deps_desc *bb_deps;
 
 static void
-concat_insn_mem_list (rtx_insn_list *copy_insns,
-                     rtx_expr_list *copy_mems,
-                     rtx_insn_list **old_insns_p,
-                     rtx_expr_list **old_mems_p)
+concat_mem_list (rtx_expr_list *copy_mems, rtx_expr_list **old_mems_p)
 {
-  rtx_insn_list *new_insns = *old_insns_p;
   rtx_expr_list *new_mems = *old_mems_p;
 
-  while (copy_insns)
+  while (copy_mems)
     {
-      new_insns = alloc_INSN_LIST (copy_insns->insn (), new_insns);
       new_mems = alloc_EXPR_LIST (VOIDmode, copy_mems->element (), new_mems);
-      copy_insns = copy_insns->next ();
       copy_mems = copy_mems->next ();
     }
 
-  *old_insns_p = new_insns;
   *old_mems_p = new_mems;
 }
 
@@ -2621,14 +2613,12 @@ deps_join (struct deps_desc *succ_deps, struct 
deps_desc *pred_deps)
   IOR_REG_SET (&succ_deps->reg_last_in_use, &pred_deps->reg_last_in_use);
 
   /* Mem read/write lists are inherited by successor.  */
-  concat_insn_mem_list (pred_deps->pending_read_insns,
-                        pred_deps->pending_read_mems,
-                        &succ_deps->pending_read_insns,
-                        &succ_deps->pending_read_mems);
-  concat_insn_mem_list (pred_deps->pending_write_insns,
-                        pred_deps->pending_write_mems,
-                        &succ_deps->pending_write_insns,
-                        &succ_deps->pending_write_mems);
+  succ_deps->pending_read_insns.safe_splice (pred_deps->pending_read_insns);
+  succ_deps->pending_write_insns.safe_splice (pred_deps->pending_write_insns);
+  concat_mem_list (pred_deps->pending_read_mems,
+                  &succ_deps->pending_read_mems);
+  concat_mem_list (pred_deps->pending_write_mems,
+                  &succ_deps->pending_write_mems);
 
   succ_deps->pending_jump_insns
     = concat_INSN_LIST (pred_deps->pending_jump_insns,
@@ -2678,18 +2668,19 @@ propagate_deps (int bb, struct deps_desc *pred_deps)
       deps_join (bb_deps + BLOCK_TO_BB (e->dest->index), pred_deps);
     }
 
+  bb_deps[bb].pending_read_insns = pred_deps->pending_read_insns;
+  pred_deps->pending_read_insns = vNULL;
+  bb_deps[bb].pending_write_insns = pred_deps->pending_write_insns;
+  pred_deps->pending_write_insns = vNULL;
+
   /* These lists should point to the right place, for correct
      freeing later.  */
-  bb_deps[bb].pending_read_insns = pred_deps->pending_read_insns;
   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;
 }
@@ -2766,8 +2757,8 @@ free_pending_lists (void)
 
   for (bb = 0; bb < current_nr_blocks; bb++)
     {
-      free_INSN_LIST_list (&bb_deps[bb].pending_read_insns);
-      free_INSN_LIST_list (&bb_deps[bb].pending_write_insns);
+      bb_deps[bb].pending_read_insns.release ();
+      bb_deps[bb].pending_write_insns.release ();
       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);
-- 
2.7.4

Reply via email to