]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-vect-patterns.c (vect_single_imm_use): New function.
authorUlrich Weigand <ulrich.weigand@linaro.org>
Fri, 4 May 2012 12:27:04 +0000 (12:27 +0000)
committerUlrich Weigand <uweigand@gcc.gnu.org>
Fri, 4 May 2012 12:27:04 +0000 (12:27 +0000)
* tree-vect-patterns.c (vect_single_imm_use): New function.
(vect_recog_widen_mult_pattern): Use it instead of open-coding loop.
(vect_recog_over_widening_pattern): Likewise.
(vect_recog_widen_shift_pattern): Likewise.

From-SVN: r187157

gcc/ChangeLog
gcc/tree-vect-patterns.c

index 4f4195aa39034943ecfbe53c41beb7e6caabeb76..41dba2e7b0f9c40cf106c2954d44a2309dd0b322 100644 (file)
@@ -1,3 +1,10 @@
+2012-05-04  Ulrich Weigand  <ulrich.weigand@linaro.org>
+
+       * tree-vect-patterns.c (vect_single_imm_use): New function.
+       (vect_recog_widen_mult_pattern): Use it instead of open-coding loop.
+       (vect_recog_over_widening_pattern): Likewise.
+       (vect_recog_widen_shift_pattern): Likewise.
+
 2012-05-04  Ulrich Weigand  <ulrich.weigand@linaro.org>
 
        * tree-vect-patterns.c (vect_same_loop_or_bb_p): New function.
index bb70b929ae6900a02e9025221a384ba408c43ffd..99346546dba295be11255376bc2778e8b94105f9 100644 (file)
@@ -119,6 +119,25 @@ vect_same_loop_or_bb_p (gimple stmt1, gimple stmt2)
   return true;
 }
 
+/* If the LHS of DEF_STMT has a single use, and that statement is
+   in the same loop or basic block, return it.  */
+
+static gimple
+vect_single_imm_use (gimple def_stmt)
+{
+  tree lhs = gimple_assign_lhs (def_stmt);
+  use_operand_p use_p;
+  gimple use_stmt;
+
+  if (!single_imm_use (lhs, &use_p, &use_stmt))
+    return NULL;
+
+  if (!vect_same_loop_or_bb_p (def_stmt, use_stmt))
+    return NULL;
+
+  return use_stmt;
+}
+
 /* Check whether NAME, an ssa-name used in USE_STMT,
    is a result of a type promotion or demotion, such that:
      DEF_STMT: NAME = NOP (name0)
@@ -636,31 +655,18 @@ vect_recog_widen_mult_pattern (VEC (gimple, heap) **stmts,
      Use unsigned TYPE as the type for WIDEN_MULT_EXPR.  */
   if (TYPE_UNSIGNED (type) != TYPE_UNSIGNED (half_type0))
     {
-      tree lhs = gimple_assign_lhs (last_stmt), use_lhs;
-      imm_use_iterator imm_iter;
-      use_operand_p use_p;
-      int nuses = 0;
-      gimple use_stmt = NULL;
+      gimple use_stmt;
+      tree use_lhs;
       tree use_type;
 
       if (TYPE_UNSIGNED (type) == TYPE_UNSIGNED (half_type1))
         return NULL;
 
-      FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
-        {
-         if (is_gimple_debug (USE_STMT (use_p)))
-           continue;
-          use_stmt = USE_STMT (use_p);
-          nuses++;
-        }
-
-      if (nuses != 1 || !is_gimple_assign (use_stmt)
-          || gimple_assign_rhs_code (use_stmt) != NOP_EXPR)
+      use_stmt = vect_single_imm_use (last_stmt);
+      if (!use_stmt || !is_gimple_assign (use_stmt)
+         || gimple_assign_rhs_code (use_stmt) != NOP_EXPR)
         return NULL;
 
-      if (!vect_same_loop_or_bb_p (last_stmt, use_stmt))
-       return NULL;
-
       use_lhs = gimple_assign_lhs (use_stmt);
       use_type = TREE_TYPE (use_lhs);
       if (!INTEGRAL_TYPE_P (use_type)
@@ -1165,10 +1171,7 @@ vect_recog_over_widening_pattern (VEC (gimple, heap) **stmts,
 {
   gimple stmt = VEC_pop (gimple, *stmts);
   gimple pattern_stmt = NULL, new_def_stmt, prev_stmt = NULL, use_stmt = NULL;
-  tree op0, op1, vectype = NULL_TREE, lhs, use_lhs, use_type;
-  imm_use_iterator imm_iter;
-  use_operand_p use_p;
-  int nuses = 0;
+  tree op0, op1, vectype = NULL_TREE, use_lhs, use_type;
   tree var = NULL_TREE, new_type = NULL_TREE, tmp, new_oprnd;
   bool first;
   tree type = NULL;
@@ -1192,18 +1195,8 @@ vect_recog_over_widening_pattern (VEC (gimple, heap) **stmts,
         }
 
       /* STMT can be performed on a smaller type.  Check its uses.  */
-      lhs = gimple_assign_lhs (stmt);
-      nuses = 0;
-      FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
-        {
-          if (is_gimple_debug (USE_STMT (use_p)))
-            continue;
-          use_stmt = USE_STMT (use_p);
-          nuses++;
-        }
-
-      if (nuses != 1 || !is_gimple_assign (use_stmt)
-         || !vect_same_loop_or_bb_p (stmt, use_stmt))
+      use_stmt = vect_single_imm_use (stmt);
+      if (!use_stmt || !is_gimple_assign (use_stmt))
         return NULL;
 
       /* Create pattern statement for STMT.  */
@@ -1454,12 +1447,6 @@ vect_recog_widen_shift_pattern (VEC (gimple, heap) **stmts,
      Use unsigned TYPE as the type for WIDEN_LSHIFT_EXPR.  */
   if (TYPE_UNSIGNED (type) != TYPE_UNSIGNED (half_type0))
     {
-      tree lhs = gimple_assign_lhs (last_stmt), use_lhs;
-      imm_use_iterator imm_iter;
-      use_operand_p use_p;
-      int nuses = 0;
-      tree use_type;
-
       if (over_widen)
         {
           /* In case of over-widening pattern, S4 should be ORIG_STMT itself.
@@ -1472,21 +1459,14 @@ vect_recog_widen_shift_pattern (VEC (gimple, heap) **stmts,
         }
       else
         {
-          FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs)
-            {
-             if (is_gimple_debug (USE_STMT (use_p)))
-               continue;
-             use_stmt = USE_STMT (use_p);
-             nuses++;
-            }
+         tree use_type;
+         tree use_lhs;
 
-          if (nuses != 1 || !is_gimple_assign (use_stmt)
+         use_stmt = vect_single_imm_use (last_stmt);
+         if (!use_stmt || !is_gimple_assign (use_stmt)
              || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (use_stmt)))
            return NULL;
 
-         if (!vect_same_loop_or_bb_p (last_stmt, use_stmt))
-           return NULL;
-
           use_lhs = gimple_assign_lhs (use_stmt);
           use_type = TREE_TYPE (use_lhs);