[2/n] PR85694: Attach a DEF_SEQ only to the original statement
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 20 Jun 2018 08:06:27 +0000 (08:06 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 20 Jun 2018 08:06:27 +0000 (08:06 +0000)
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.

2018-06-20  Richard Sandiford  <richard.sandiford@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.

From-SVN: r261785

gcc/ChangeLog
gcc/tree-vect-loop.c
gcc/tree-vect-patterns.c
gcc/tree-vect-stmts.c
gcc/tree-vectorizer.h

index 983143f226b237a7756b9fca12a7eb03d4a4c3e0..09ab7d8c3a4bc86d98b3ba84ea410793a77b1e89 100644 (file)
@@ -1,3 +1,15 @@
+2018-06-20  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * 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.
+
 2018-06-20  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-vect-stmts.c (vect_analyze_stmt): Move the handling of pattern
index b07fcdecb724f1c757b04dc8aa01004b8494d93e..5a73a97d6ee16d774e9ff52de94cd9e5bd595818 100644 (file)
@@ -224,10 +224,10 @@ vect_determine_vf_for_stmt (stmt_vec_info stmt_info, poly_uint64 *vf,
   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 @@ again:
          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 19d4ea9fb323eb2c6a5302666432cb9c71399172..5d0543f05d09aae2702119562ee7b2e8ff2013cd 100644 (file)
@@ -405,13 +405,13 @@ vect_recog_dot_prod_pattern (vec<gimple *> *stmts, tree *type_in,
       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_stmt, gimple *pattern_stmt,
   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
index 047edcdae5f296ccc49f99493c35b9c03c722d43..af58d918cdbb666cee4b0fd82ac37dc718210945 100644 (file)
@@ -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 8bb9e3e6e8896c2538105d443941ab76589d3ffd..fce3238ff64f8a3c438bc348f867ba9285cfa42d 100644 (file)
@@ -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