Richard Biener <richard.guent...@gmail.com> writes:
> On Mon, Jun 18, 2018 at 4:53 PM Richard Sandiford
> <richard.sandif...@arm.com> wrote:
>>
>> A pattern's PATTERN_DEF_SEQ was attached to both the original statement
>> and the main pattern statement, which made it harder to update later.
>> This patch attaches it to just the original statement.  In practice,
>> anything that cared had ready access to both.
>>
>> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
>
> OK but can you please add a sentence to the pattern_def_seq member
> comment to say it's present only on the in_pattern_p stmt?

OK, here's I installed.

Thanks,
Richard


2018-06-20  Richard Sandiford  <richard.sandif...@arm.com>

gcc/
        * tree-vectorizer.h (_stmt_vec_info): Note above pattern_def_seq
        that the sequence is attached to the original statement rather
        than the pattern statement.
        * tree-vect-loop.c (vect_determine_vf_for_stmt): Take the
        PATTERN_DEF_SEQ from the original statement rather than
        the main pattern statement.
        * tree-vect-stmts.c (free_stmt_vec_info): Likewise.
        * tree-vect-patterns.c (vect_recog_dot_prod_pattern): Likewise.
        (vect_mark_pattern_stmts): Don't copy the PATTERN_DEF_SEQ.

Index: gcc/tree-vectorizer.h
===================================================================
--- gcc/tree-vectorizer.h       2018-06-20 08:59:51.626577121 +0100
+++ gcc/tree-vectorizer.h       2018-06-20 09:00:14.658372927 +0100
@@ -796,7 +796,9 @@ typedef struct _stmt_vec_info {
         pattern).  */
   gimple *related_stmt;
 
-  /* Used to keep a sequence of def stmts of a pattern stmt if such exists.  */
+  /* Used to keep a sequence of def stmts of a pattern stmt if such exists.
+     The sequence is attached to the original statement rather than the
+     pattern statement.  */
   gimple_seq pattern_def_seq;
 
   /* List of datarefs that are known to have the same alignment as the dataref
Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c        2018-06-20 09:00:07.902432824 +0100
+++ gcc/tree-vect-loop.c        2018-06-20 09:00:14.654372962 +0100
@@ -224,10 +224,10 @@ vect_determine_vf_for_stmt (stmt_vec_inf
   if (STMT_VINFO_IN_PATTERN_P (stmt_info)
       && STMT_VINFO_RELATED_STMT (stmt_info))
     {
+      gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
       stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
 
       /* If a pattern statement has def stmts, analyze them too.  */
-      gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
       for (gimple_stmt_iterator si = gsi_start (pattern_def_seq);
           !gsi_end_p (si); gsi_next (&si))
        {
@@ -2247,10 +2247,10 @@ vect_analyze_loop_2 (loop_vec_info loop_
          STMT_SLP_TYPE (stmt_info) = loop_vect;
          if (STMT_VINFO_IN_PATTERN_P (stmt_info))
            {
+             gimple *pattern_def_seq = STMT_VINFO_PATTERN_DEF_SEQ (stmt_info);
              stmt_info = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
              STMT_SLP_TYPE (stmt_info) = loop_vect;
-             for (gimple_stmt_iterator pi
-                    = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (stmt_info));
+             for (gimple_stmt_iterator pi = gsi_start (pattern_def_seq);
                   !gsi_end_p (pi); gsi_next (&pi))
                {
                  gimple *pstmt = gsi_stmt (pi);
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c       2018-06-20 09:00:07.902432824 +0100
+++ gcc/tree-vect-stmts.c       2018-06-20 09:00:14.654372962 +0100
@@ -9876,29 +9876,26 @@ free_stmt_vec_info (gimple *stmt)
      too.  */
   if (STMT_VINFO_IN_PATTERN_P (stmt_info))
     {
+      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_info
        = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (stmt_info));
       if (patt_info)
        {
-         gimple_seq seq = STMT_VINFO_PATTERN_DEF_SEQ (patt_info);
          gimple *patt_stmt = STMT_VINFO_STMT (patt_info);
          gimple_set_bb (patt_stmt, NULL);
          tree lhs = gimple_get_lhs (patt_stmt);
          if (lhs && TREE_CODE (lhs) == SSA_NAME)
            release_ssa_name (lhs);
-         if (seq)
-           {
-             gimple_stmt_iterator si;
-             for (si = gsi_start (seq); !gsi_end_p (si); gsi_next (&si))
-               {
-                 gimple *seq_stmt = gsi_stmt (si);
-                 gimple_set_bb (seq_stmt, NULL);
-                 lhs = gimple_get_lhs (seq_stmt);
-                 if (lhs && TREE_CODE (lhs) == SSA_NAME)
-                   release_ssa_name (lhs);
-                 free_stmt_vec_info (seq_stmt);
-               }
-           }
          free_stmt_vec_info (patt_stmt);
        }
     }
Index: gcc/tree-vect-patterns.c
===================================================================
--- gcc/tree-vect-patterns.c    2018-06-20 08:59:51.738576128 +0100
+++ gcc/tree-vect-patterns.c    2018-06-20 09:00:14.654372962 +0100
@@ -405,13 +405,13 @@ vect_recog_dot_prod_pattern (vec<gimple
       stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
       if (gimple_assign_rhs_code (stmt) != WIDEN_MULT_EXPR)
         return NULL;
+      STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt))
+       = STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo);
       stmt_vinfo = vinfo_for_stmt (stmt);
       gcc_assert (stmt_vinfo);
       gcc_assert (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_internal_def);
       oprnd00 = gimple_assign_rhs1 (stmt);
       oprnd01 = gimple_assign_rhs2 (stmt);
-      STMT_VINFO_PATTERN_DEF_SEQ (vinfo_for_stmt (last_stmt))
-         = STMT_VINFO_PATTERN_DEF_SEQ (stmt_vinfo);
     }
   else
     {
@@ -4433,28 +4433,23 @@ vect_mark_pattern_stmts (gimple *orig_st
   STMT_VINFO_VECTYPE (pattern_stmt_info) = pattern_vectype;
   STMT_VINFO_IN_PATTERN_P (orig_stmt_info) = true;
   STMT_VINFO_RELATED_STMT (orig_stmt_info) = pattern_stmt;
-  STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info)
-    = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info);
-  if (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info))
-    {
-      gimple_stmt_iterator si;
-      for (si = gsi_start (STMT_VINFO_PATTERN_DEF_SEQ (pattern_stmt_info));
-          !gsi_end_p (si); gsi_next (&si))
-       {
-         def_stmt = gsi_stmt (si);
-         def_stmt_info = vinfo_for_stmt (def_stmt);
-         if (def_stmt_info == NULL)
-           {
-             def_stmt_info = new_stmt_vec_info (def_stmt, vinfo);
-             set_vinfo_for_stmt (def_stmt, def_stmt_info);
-           }
-         gimple_set_bb (def_stmt, gimple_bb (orig_stmt));
-         STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt;
-         STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def;
-         if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE)
-           STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype;
-       }
-    }
+  if (gimple *def_seq = STMT_VINFO_PATTERN_DEF_SEQ (orig_stmt_info))
+    for (gimple_stmt_iterator si = gsi_start (def_seq);
+        !gsi_end_p (si); gsi_next (&si))
+      {
+       def_stmt = gsi_stmt (si);
+       def_stmt_info = vinfo_for_stmt (def_stmt);
+       if (def_stmt_info == NULL)
+         {
+           def_stmt_info = new_stmt_vec_info (def_stmt, vinfo);
+           set_vinfo_for_stmt (def_stmt, def_stmt_info);
+         }
+       gimple_set_bb (def_stmt, gimple_bb (orig_stmt));
+       STMT_VINFO_RELATED_STMT (def_stmt_info) = orig_stmt;
+       STMT_VINFO_DEF_TYPE (def_stmt_info) = vect_internal_def;
+       if (STMT_VINFO_VECTYPE (def_stmt_info) == NULL_TREE)
+         STMT_VINFO_VECTYPE (def_stmt_info) = pattern_vectype;
+      }
 }
 
 /* Function vect_pattern_recog_1

Reply via email to