This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 17/18] make pending_{read,write}_insns vec<rtx_insn *>


From: Trevor Saunders <tbsaunde+gcc@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+gcc@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]