[09/46] Add vec_info::lookup_single_use
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 31 Jul 2018 14:21:51 +0000 (14:21 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 31 Jul 2018 14:21:51 +0000 (14:21 +0000)
This patch adds a helper function for seeing whether there is a single
user of an SSA name, and whether that user has a stmt_vec_info.

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

gcc/
* tree-vectorizer.h (vec_info::lookup_single_use): Declare.
* tree-vectorizer.c (vec_info::lookup_single_use): New function.
* tree-vect-loop.c (vectorizable_reduction): Use it instead of
a single_imm_use-based sequence.
* tree-vect-stmts.c (supportable_widening_operation): Likewise.

From-SVN: r263124

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

index 7d62e270973ce07e6bf4771e14f809b30627105d..a00fad889f5e57e14c946952a6fe7f9b37adcf3d 100644 (file)
@@ -1,3 +1,11 @@
+2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-vectorizer.h (vec_info::lookup_single_use): Declare.
+       * tree-vectorizer.c (vec_info::lookup_single_use): New function.
+       * tree-vect-loop.c (vectorizable_reduction): Use it instead of
+       a single_imm_use-based sequence.
+       * tree-vect-stmts.c (supportable_widening_operation): Likewise.
+
 2018-07-31  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-vectorizer.h (vec_info::lookup_def): Declare.
index 856c1985602caabbcde146d47ad68c2d701ff338..4fe3e1dc5fce054746fd99ef590258abb09f5460 100644 (file)
@@ -6138,6 +6138,7 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi,
 
   if (gimple_code (stmt) == GIMPLE_PHI)
     {
+      tree phi_result = gimple_phi_result (stmt);
       /* Analysis is fully done on the reduction stmt invocation.  */
       if (! vec_stmt)
        {
@@ -6158,7 +6159,8 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi,
       if (STMT_VINFO_IN_PATTERN_P (vinfo_for_stmt (reduc_stmt)))
        reduc_stmt = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (reduc_stmt));
 
-      if (STMT_VINFO_VEC_REDUCTION_TYPE (vinfo_for_stmt (reduc_stmt))
+      stmt_vec_info reduc_stmt_info = vinfo_for_stmt (reduc_stmt);
+      if (STMT_VINFO_VEC_REDUCTION_TYPE (reduc_stmt_info)
          == EXTRACT_LAST_REDUCTION)
        /* Leave the scalar phi in place.  */
        return true;
@@ -6185,15 +6187,12 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi,
       else
        ncopies = vect_get_num_copies (loop_vinfo, vectype_in);
 
-      use_operand_p use_p;
-      gimple *use_stmt;
+      stmt_vec_info use_stmt_info;
       if (ncopies > 1
-         && (STMT_VINFO_RELEVANT (vinfo_for_stmt (reduc_stmt))
-             <= vect_used_only_live)
-         && single_imm_use (gimple_phi_result (stmt), &use_p, &use_stmt)
-         && (use_stmt == reduc_stmt
-             || (STMT_VINFO_RELATED_STMT (vinfo_for_stmt (use_stmt))
-                 == reduc_stmt)))
+         && STMT_VINFO_RELEVANT (reduc_stmt_info) <= vect_used_only_live
+         && (use_stmt_info = loop_vinfo->lookup_single_use (phi_result))
+         && (use_stmt_info == reduc_stmt_info
+             || STMT_VINFO_RELATED_STMT (use_stmt_info) == reduc_stmt))
        single_defuse_cycle = true;
 
       /* Create the destination vector  */
@@ -6955,13 +6954,13 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi,
    This only works when we see both the reduction PHI and its only consumer
    in vectorizable_reduction and there are no intermediate stmts
    participating.  */
-  use_operand_p use_p;
-  gimple *use_stmt;
+  stmt_vec_info use_stmt_info;
+  tree reduc_phi_result = gimple_phi_result (reduc_def_stmt);
   if (ncopies > 1
       && (STMT_VINFO_RELEVANT (stmt_info) <= vect_used_only_live)
-      && single_imm_use (gimple_phi_result (reduc_def_stmt), &use_p, &use_stmt)
-      && (use_stmt == stmt
-         || STMT_VINFO_RELATED_STMT (vinfo_for_stmt (use_stmt)) == stmt))
+      && (use_stmt_info = loop_vinfo->lookup_single_use (reduc_phi_result))
+      && (use_stmt_info == stmt_info
+         || STMT_VINFO_RELATED_STMT (use_stmt_info) == stmt))
     {
       single_defuse_cycle = true;
       epilog_copies = 1;
index 8f4b66d12c16a53ba7f2005fd4e9657f7148a2c4..f21599ea3aab30fa6f0ab506919ef3f5451d145d 100644 (file)
@@ -10310,14 +10310,11 @@ supportable_widening_operation (enum tree_code code, gimple *stmt,
              same operation.  One such an example is s += a * b, where elements
              in a and b cannot be reordered.  Here we check if the vector defined
              by STMT is only directly used in the reduction statement.  */
-          tree lhs = gimple_assign_lhs (stmt);
-          use_operand_p dummy;
-          gimple *use_stmt;
-          stmt_vec_info use_stmt_info = NULL;
-          if (single_imm_use (lhs, &dummy, &use_stmt)
-              && (use_stmt_info = vinfo_for_stmt (use_stmt))
-              && STMT_VINFO_DEF_TYPE (use_stmt_info) == vect_reduction_def)
-            return true;
+         tree lhs = gimple_assign_lhs (stmt);
+         stmt_vec_info use_stmt_info = loop_info->lookup_single_use (lhs);
+         if (use_stmt_info
+             && STMT_VINFO_DEF_TYPE (use_stmt_info) == vect_reduction_def)
+           return true;
         }
       c1 = VEC_WIDEN_MULT_LO_EXPR;
       c2 = VEC_WIDEN_MULT_HI_EXPR;
index 372cf69e35e7c41a1b8be9d22f02ff44e41ae61b..2640aab1ca06dd1c5d4149b3c7e45d7c4deb8e9e 100644 (file)
@@ -548,6 +548,20 @@ vec_info::lookup_def (tree name)
   return NULL;
 }
 
+/* See whether there is a single non-debug statement that uses LHS and
+   whether that statement has an associated stmt_vec_info.  Return the
+   stmt_vec_info if so, otherwise return null.  */
+
+stmt_vec_info
+vec_info::lookup_single_use (tree lhs)
+{
+  use_operand_p dummy;
+  gimple *use_stmt;
+  if (single_imm_use (lhs, &dummy, &use_stmt))
+    return lookup_stmt (use_stmt);
+  return NULL;
+}
+
 /* A helper function to free scev and LOOP niter information, as well as
    clear loop constraint LOOP_C_FINITE.  */
 
index 5b76e45a856b1dc5fc626e3c9c23f0a5c4aae469..cbec2fbdc1dacbb7d0f7186952357a0279b32cbd 100644 (file)
@@ -220,6 +220,7 @@ struct vec_info {
   stmt_vec_info add_stmt (gimple *);
   stmt_vec_info lookup_stmt (gimple *);
   stmt_vec_info lookup_def (tree);
+  stmt_vec_info lookup_single_use (tree);
 
   /* The type of vectorization.  */
   vec_kind kind;