[43/46] Make free_stmt_vec_info take a stmt_vec_info

Message ID 87r2jtkkqp.fsf@arm.com
State New
Headers show
Series
  • Remove vinfo_for_stmt etc.
Related show

Commit Message

Richard Sandiford July 24, 2018, 10:10 a.m.
This patch makes free_stmt_vec_info take the stmt_vec_info that
it's supposed to free and makes it free only that stmt_vec_info.
Callers need to update the statement mapping where necessary
(but now there are only a couple of callers).

This in turns means that we can leave ~vec_info to do the actual
freeing, since there's no longer a need to do it before resetting
the gimple_uids.


2018-07-24  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* tree-vectorizer.h (free_stmt_vec_info): Take a stmt_vec_info
	rather than a gimple stmt.
	* tree-vect-stmts.c (free_stmt_vec_info): Likewise.  Don't free
	information for pattern statements when passed the original
	statement; instead wait to be passed the pattern statement itself.
	Don't call set_vinfo_for_stmt here.
	(free_stmt_vec_infos): Update call to free_stmt_vec_info.
	* tree-vect-loop.c (_loop_vec_info::~loop_vec_info): Don't free
	stmt_vec_infos here.
	* tree-vect-slp.c (_bb_vec_info::~bb_vec_info): Likewise.
	* tree-vectorizer.c (vec_info::remove_stmt): Nullify the statement's
	stmt_vec_infos entry.

Comments

Richard Biener July 31, 2018, 12:03 p.m. | #1
On Tue, Jul 24, 2018 at 12:10 PM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>

> This patch makes free_stmt_vec_info take the stmt_vec_info that

> it's supposed to free and makes it free only that stmt_vec_info.

> Callers need to update the statement mapping where necessary

> (but now there are only a couple of callers).

>

> This in turns means that we can leave ~vec_info to do the actual

> freeing, since there's no longer a need to do it before resetting

> the gimple_uids.


OK.

>

> 2018-07-24  Richard Sandiford  <richard.sandiford@arm.com>

>

> gcc/

>         * tree-vectorizer.h (free_stmt_vec_info): Take a stmt_vec_info

>         rather than a gimple stmt.

>         * tree-vect-stmts.c (free_stmt_vec_info): Likewise.  Don't free

>         information for pattern statements when passed the original

>         statement; instead wait to be passed the pattern statement itself.

>         Don't call set_vinfo_for_stmt here.

>         (free_stmt_vec_infos): Update call to free_stmt_vec_info.

>         * tree-vect-loop.c (_loop_vec_info::~loop_vec_info): Don't free

>         stmt_vec_infos here.

>         * tree-vect-slp.c (_bb_vec_info::~bb_vec_info): Likewise.

>         * tree-vectorizer.c (vec_info::remove_stmt): Nullify the statement's

>         stmt_vec_infos entry.

>

> Index: gcc/tree-vectorizer.h

> ===================================================================

> --- gcc/tree-vectorizer.h       2018-07-24 10:24:22.684311906 +0100

> +++ gcc/tree-vectorizer.h       2018-07-24 10:24:26.084281700 +0100

> @@ -1484,7 +1484,7 @@ extern bool supportable_narrowing_operat

>                                              enum tree_code *,

>                                              int *, vec<tree> *);

>  extern stmt_vec_info new_stmt_vec_info (gimple *stmt, vec_info *);

> -extern void free_stmt_vec_info (gimple *stmt);

> +extern void free_stmt_vec_info (stmt_vec_info);

>  extern unsigned record_stmt_cost (stmt_vector_for_cost *, int,

>                                   enum vect_cost_for_stmt, stmt_vec_info,

>                                   int, enum vect_cost_model_location);

> Index: gcc/tree-vect-stmts.c

> ===================================================================

> --- gcc/tree-vect-stmts.c       2018-07-24 10:24:22.684311906 +0100

> +++ gcc/tree-vect-stmts.c       2018-07-24 10:24:26.084281700 +0100

> @@ -9916,7 +9916,7 @@ free_stmt_vec_infos (vec<stmt_vec_info>

>    stmt_vec_info info;

>    FOR_EACH_VEC_ELT (*v, i, info)

>      if (info != NULL_STMT_VEC_INFO)

> -      free_stmt_vec_info (STMT_VINFO_STMT (info));

> +      free_stmt_vec_info (info);

>    if (v == stmt_vec_info_vec)

>      stmt_vec_info_vec = NULL;

>    v->release ();

> @@ -9926,44 +9926,18 @@ free_stmt_vec_infos (vec<stmt_vec_info>

>  /* Free stmt vectorization related info.  */

>

>  void

> -free_stmt_vec_info (gimple *stmt)

> +free_stmt_vec_info (stmt_vec_info stmt_info)

>  {

> -  stmt_vec_info stmt_info = vinfo_for_stmt (stmt);

> -

> -  if (!stmt_info)

> -    return;

> -

> -  /* Check if this statement has a related "pattern stmt"

> -     (introduced by the vectorizer during the pattern recognition

> -     pass).  Free pattern's stmt_vec_info and def stmt's stmt_vec_info

> -     too.  */

> -  if (STMT_VINFO_IN_PATTERN_P (stmt_info))

> +  if (stmt_info->pattern_stmt_p)

>      {

> -      if (gimple_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info))

> -       for (gimple_stmt_iterator si = gsi_start (seq);

> -            !gsi_end_p (si); gsi_next (&si))

> -         {

> -           gimple *seq_stmt = gsi_stmt (si);

> -           gimple_set_bb (seq_stmt, NULL);

> -           tree lhs = gimple_get_lhs (seq_stmt);

> -           if (lhs && TREE_CODE (lhs) == SSA_NAME)

> -             release_ssa_name (lhs);

> -           free_stmt_vec_info (seq_stmt);

> -         }

> -      stmt_vec_info patt_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);

> -      if (patt_stmt_info)

> -       {

> -         gimple_set_bb (patt_stmt_info->stmt, NULL);

> -         tree lhs = gimple_get_lhs (patt_stmt_info->stmt);

> -         if (lhs && TREE_CODE (lhs) == SSA_NAME)

> -           release_ssa_name (lhs);

> -         free_stmt_vec_info (patt_stmt_info);

> -       }

> +      gimple_set_bb (stmt_info->stmt, NULL);

> +      tree lhs = gimple_get_lhs (stmt_info->stmt);

> +      if (lhs && TREE_CODE (lhs) == SSA_NAME)

> +       release_ssa_name (lhs);

>      }

>

>    STMT_VINFO_SAME_ALIGN_REFS (stmt_info).release ();

>    STMT_VINFO_SIMD_CLONE_INFO (stmt_info).release ();

> -  set_vinfo_for_stmt (stmt, NULL);

>    free (stmt_info);

>  }

>

> Index: gcc/tree-vect-loop.c

> ===================================================================

> --- gcc/tree-vect-loop.c        2018-07-24 10:24:19.540339838 +0100

> +++ gcc/tree-vect-loop.c        2018-07-24 10:24:26.080281735 +0100

> @@ -894,9 +894,6 @@ _loop_vec_info::~_loop_vec_info ()

>    for (j = 0; j < nbbs; j++)

>      {

>        basic_block bb = bbs[j];

> -      for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))

> -        free_stmt_vec_info (gsi_stmt (si));

> -

>        for (si = gsi_start_bb (bb); !gsi_end_p (si); )

>          {

>           gimple *stmt = gsi_stmt (si);

> @@ -936,9 +933,6 @@ _loop_vec_info::~_loop_vec_info ()

>                     }

>                 }

>             }

> -

> -         /* Free stmt_vec_info.  */

> -         free_stmt_vec_info (stmt);

>            gsi_next (&si);

>          }

>      }

> Index: gcc/tree-vect-slp.c

> ===================================================================

> --- gcc/tree-vect-slp.c 2018-07-24 10:24:22.680311942 +0100

> +++ gcc/tree-vect-slp.c 2018-07-24 10:24:26.080281735 +0100

> @@ -2490,17 +2490,8 @@ _bb_vec_info::~_bb_vec_info ()

>  {

>    for (gimple_stmt_iterator si = region_begin;

>         gsi_stmt (si) != gsi_stmt (region_end); gsi_next (&si))

> -    {

> -      gimple *stmt = gsi_stmt (si);

> -      stmt_vec_info stmt_info = vinfo_for_stmt (stmt);

> -

> -      if (stmt_info)

> -        /* Free stmt_vec_info.  */

> -        free_stmt_vec_info (stmt);

> -

> -      /* Reset region marker.  */

> -      gimple_set_uid (stmt, -1);

> -    }

> +    /* Reset region marker.  */

> +    gimple_set_uid (gsi_stmt (si), -1);

>

>    bb->aux = NULL;

>  }

> Index: gcc/tree-vectorizer.c

> ===================================================================

> --- gcc/tree-vectorizer.c       2018-07-24 10:24:22.684311906 +0100

> +++ gcc/tree-vectorizer.c       2018-07-24 10:24:26.084281700 +0100

> @@ -584,6 +584,7 @@ vec_info::lookup_dr (data_reference *dr)

>  vec_info::remove_stmt (stmt_vec_info stmt_info)

>  {

>    gcc_assert (!stmt_info->pattern_stmt_p);

> +  set_vinfo_for_stmt (stmt_info->stmt, NULL);

>    gimple_stmt_iterator si = gsi_for_stmt (stmt_info->stmt);

>    unlink_stmt_vdef (stmt_info->stmt);

>    gsi_remove (&si, true);

Patch

Index: gcc/tree-vectorizer.h
===================================================================
--- gcc/tree-vectorizer.h	2018-07-24 10:24:22.684311906 +0100
+++ gcc/tree-vectorizer.h	2018-07-24 10:24:26.084281700 +0100
@@ -1484,7 +1484,7 @@  extern bool supportable_narrowing_operat
 					     enum tree_code *,
 					     int *, vec<tree> *);
 extern stmt_vec_info new_stmt_vec_info (gimple *stmt, vec_info *);
-extern void free_stmt_vec_info (gimple *stmt);
+extern void free_stmt_vec_info (stmt_vec_info);
 extern unsigned record_stmt_cost (stmt_vector_for_cost *, int,
 				  enum vect_cost_for_stmt, stmt_vec_info,
 				  int, enum vect_cost_model_location);
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c	2018-07-24 10:24:22.684311906 +0100
+++ gcc/tree-vect-stmts.c	2018-07-24 10:24:26.084281700 +0100
@@ -9916,7 +9916,7 @@  free_stmt_vec_infos (vec<stmt_vec_info>
   stmt_vec_info info;
   FOR_EACH_VEC_ELT (*v, i, info)
     if (info != NULL_STMT_VEC_INFO)
-      free_stmt_vec_info (STMT_VINFO_STMT (info));
+      free_stmt_vec_info (info);
   if (v == stmt_vec_info_vec)
     stmt_vec_info_vec = NULL;
   v->release ();
@@ -9926,44 +9926,18 @@  free_stmt_vec_infos (vec<stmt_vec_info>
 /* Free stmt vectorization related info.  */
 
 void
-free_stmt_vec_info (gimple *stmt)
+free_stmt_vec_info (stmt_vec_info stmt_info)
 {
-  stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
-
-  if (!stmt_info)
-    return;
-
-  /* Check if this statement has a related "pattern stmt"
-     (introduced by the vectorizer during the pattern recognition
-     pass).  Free pattern's stmt_vec_info and def stmt's stmt_vec_info
-     too.  */
-  if (STMT_VINFO_IN_PATTERN_P (stmt_info))
+  if (stmt_info->pattern_stmt_p)
     {
-      if (gimple_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info))
-	for (gimple_stmt_iterator si = gsi_start (seq);
-	     !gsi_end_p (si); gsi_next (&si))
-	  {
-	    gimple *seq_stmt = gsi_stmt (si);
-	    gimple_set_bb (seq_stmt, NULL);
-	    tree lhs = gimple_get_lhs (seq_stmt);
-	    if (lhs && TREE_CODE (lhs) == SSA_NAME)
-	      release_ssa_name (lhs);
-	    free_stmt_vec_info (seq_stmt);
-	  }
-      stmt_vec_info patt_stmt_info = STMT_VINFO_RELATED_STMT (stmt_info);
-      if (patt_stmt_info)
-	{
-	  gimple_set_bb (patt_stmt_info->stmt, NULL);
-	  tree lhs = gimple_get_lhs (patt_stmt_info->stmt);
-	  if (lhs && TREE_CODE (lhs) == SSA_NAME)
-	    release_ssa_name (lhs);
-	  free_stmt_vec_info (patt_stmt_info);
-	}
+      gimple_set_bb (stmt_info->stmt, NULL);
+      tree lhs = gimple_get_lhs (stmt_info->stmt);
+      if (lhs && TREE_CODE (lhs) == SSA_NAME)
+	release_ssa_name (lhs);
     }
 
   STMT_VINFO_SAME_ALIGN_REFS (stmt_info).release ();
   STMT_VINFO_SIMD_CLONE_INFO (stmt_info).release ();
-  set_vinfo_for_stmt (stmt, NULL);
   free (stmt_info);
 }
 
Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c	2018-07-24 10:24:19.540339838 +0100
+++ gcc/tree-vect-loop.c	2018-07-24 10:24:26.080281735 +0100
@@ -894,9 +894,6 @@  _loop_vec_info::~_loop_vec_info ()
   for (j = 0; j < nbbs; j++)
     {
       basic_block bb = bbs[j];
-      for (si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si))
-        free_stmt_vec_info (gsi_stmt (si));
-
       for (si = gsi_start_bb (bb); !gsi_end_p (si); )
         {
 	  gimple *stmt = gsi_stmt (si);
@@ -936,9 +933,6 @@  _loop_vec_info::~_loop_vec_info ()
 		    }
 		}
 	    }
-
-	  /* Free stmt_vec_info.  */
-	  free_stmt_vec_info (stmt);
           gsi_next (&si);
         }
     }
Index: gcc/tree-vect-slp.c
===================================================================
--- gcc/tree-vect-slp.c	2018-07-24 10:24:22.680311942 +0100
+++ gcc/tree-vect-slp.c	2018-07-24 10:24:26.080281735 +0100
@@ -2490,17 +2490,8 @@  _bb_vec_info::~_bb_vec_info ()
 {
   for (gimple_stmt_iterator si = region_begin;
        gsi_stmt (si) != gsi_stmt (region_end); gsi_next (&si))
-    {
-      gimple *stmt = gsi_stmt (si);
-      stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
-
-      if (stmt_info)
-        /* Free stmt_vec_info.  */
-        free_stmt_vec_info (stmt);
-
-      /* Reset region marker.  */
-      gimple_set_uid (stmt, -1);
-    }
+    /* Reset region marker.  */
+    gimple_set_uid (gsi_stmt (si), -1);
 
   bb->aux = NULL;
 }
Index: gcc/tree-vectorizer.c
===================================================================
--- gcc/tree-vectorizer.c	2018-07-24 10:24:22.684311906 +0100
+++ gcc/tree-vectorizer.c	2018-07-24 10:24:26.084281700 +0100
@@ -584,6 +584,7 @@  vec_info::lookup_dr (data_reference *dr)
 vec_info::remove_stmt (stmt_vec_info stmt_info)
 {
   gcc_assert (!stmt_info->pattern_stmt_p);
+  set_vinfo_for_stmt (stmt_info->stmt, NULL);
   gimple_stmt_iterator si = gsi_for_stmt (stmt_info->stmt);
   unlink_stmt_vdef (stmt_info->stmt);
   gsi_remove (&si, true);