OSDN Git Service

2010-04-09 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Apr 2010 10:40:14 +0000 (10:40 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 05:30:43 +0000 (14:30 +0900)
* tree-vectorizer.h (struct _stmt_vec_info): Document
that vectype is the type of the LHS.
(supportable_widening_operation, supportable_narrowing_operation):
Get both input and output vector types as arguments.
(vect_is_simple_use_1): Declare.
(get_same_sized_vectype): Likewise.
* tree-vect-loop.c (vect_determine_vectorization_factor):
Set STMT_VINFO_VECTYPE to the vector type of the def.
(vectorizable_reduction): Adjust.
* tree-vect-patterns.c (vect_recog_widen_mult_pattern):
Adjust.  Specify the output vector type.
(vect_pattern_recog_1): Adjust.
* tree-vect-stmts.c (get_same_sized_vectype): New function.
(vectorizable_call): Adjust.
(vectorizable_conversion): Likewise.
(vectorizable_operation): Likewise.
(vectorizable_type_demotion): Likewise.
(vectorizable_type_promotion): Likewise.
(vect_analyze_stmt): Set STMT_VINFO_VECTYPE to the vector type of
the def.
(vect_is_simple_use_1): New function.
(supportable_widening_operation): Get both input and output
vector types.
(supportable_narrowing_operation): Likewise.
* tree-vect-slp.c (vect_schedule_slp_instance): Adjust.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158157 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 74d541e..cd6180b 100644 (file)
@@ -1,3 +1,31 @@
+2010-04-09  Richard Guenther  <rguenther@suse.de>
+
+       * tree-vectorizer.h (struct _stmt_vec_info): Document
+       that vectype is the type of the LHS.
+       (supportable_widening_operation, supportable_narrowing_operation): 
+       Get both input and output vector types as arguments.
+       (vect_is_simple_use_1): Declare.
+       (get_same_sized_vectype): Likewise.
+       * tree-vect-loop.c (vect_determine_vectorization_factor):
+       Set STMT_VINFO_VECTYPE to the vector type of the def.
+       (vectorizable_reduction): Adjust.
+       * tree-vect-patterns.c (vect_recog_widen_mult_pattern):
+       Adjust.  Specify the output vector type.
+       (vect_pattern_recog_1): Adjust.
+       * tree-vect-stmts.c (get_same_sized_vectype): New function.
+       (vectorizable_call): Adjust.
+       (vectorizable_conversion): Likewise.
+       (vectorizable_operation): Likewise.
+       (vectorizable_type_demotion): Likewise.
+       (vectorizable_type_promotion): Likewise.
+       (vect_analyze_stmt): Set STMT_VINFO_VECTYPE to the vector type of
+       the def.
+       (vect_is_simple_use_1): New function.
+       (supportable_widening_operation): Get both input and output
+       vector types.
+       (supportable_narrowing_operation): Likewise.
+       * tree-vect-slp.c (vect_schedule_slp_instance): Adjust.
+
 2010-04-09  Kai Tietz  <kai.tietz@onevision.com>
 
        * config/i386/cygming.h (TARGET_OS_CPP_BUILTINS): Add
index 8acc992..817d573 100644 (file)
@@ -3754,6 +3754,10 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi,
       nested_cycle = true;
     }
 
+  /* FORNOW: SLP not supported.  */
+  if (STMT_SLP_TYPE (stmt_info))
+    return false;
+
   /* 1. Is vectorizable reduction?  */
   /* Not supportable if the reduction variable is used in the loop.  */
   if (STMT_VINFO_RELEVANT (stmt_info) > vect_used_in_outer)
@@ -3886,12 +3890,9 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi,
   if (STMT_VINFO_LIVE_P (vinfo_for_stmt (reduc_def_stmt)))
     return false;
 
-  if (slp_node)
-    ncopies = 1;
-  else
-    ncopies = (LOOP_VINFO_VECT_FACTOR (loop_vinfo)
-               / TYPE_VECTOR_SUBPARTS (vectype_in));
 
+  ncopies = (LOOP_VINFO_VECT_FACTOR (loop_vinfo)
+            / TYPE_VECTOR_SUBPARTS (vectype_in));
   gcc_assert (ncopies >= 1);
 
   vec_mode = TYPE_MODE (vectype_in);
@@ -4202,34 +4203,24 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi,
 
       for (i = 0; VEC_iterate (tree, vec_oprnds0, i, def0); i++)
         {
-          if (slp_node)
-            reduc_def = PHI_RESULT (VEC_index (gimple, phis, i));
+          if (reduc_index == 0)
+            expr = build2 (code, vectype_out, reduc_def, loop_vec_def0);
           else
-            {
-              if (!single_defuse_cycle || j == 0)
-                reduc_def = PHI_RESULT (new_phi);
-            }
-
-          def1 = ((op_type == ternary_op)
-                  ? VEC_index (tree, vec_oprnds1, i) : NULL);
-          if (op_type == binary_op)
-            {
-              if (reduc_index == 0)
-                expr = build2 (code, vectype_out, reduc_def, def0);
-              else
-                expr = build2 (code, vectype_out, def0, reduc_def);
-            }
+            expr = build2 (code, vectype_out, loop_vec_def0, reduc_def);
+        }
+      else
+        {
+          if (reduc_index == 0)
+            expr = build3 (code, vectype_out, reduc_def, loop_vec_def0,
+                           loop_vec_def1);
           else
             {
-              if (reduc_index == 0)
-                expr = build3 (code, vectype_out, reduc_def, def0, def1);
+              if (reduc_index == 1)
+                expr = build3 (code, vectype_out, loop_vec_def0, reduc_def,
+                               loop_vec_def1);
               else
-                {
-                  if (reduc_index == 1)
-                    expr = build3 (code, vectype_out, def0, reduc_def, def1);
-                  else
-                    expr = build3 (code, vectype_out, def0, def1, reduc_def);
-                }
+                expr = build3 (code, vectype_out, loop_vec_def0, loop_vec_def1,
+                              reduc_def);
             }
 
           new_stmt = gimple_build_assign (vec_dest, expr);
index a2c2e20..b91f8d1 100644 (file)
@@ -1304,18 +1304,6 @@ vectorizable_call (gimple stmt, gimple_stmt_iterator *gsi, gimple *vec_stmt)
      the same size as the output vector type.  */
   if (!vectype_in)
     vectype_in = get_same_sized_vectype (rhs_type, vectype_out);
-  if (vec_stmt)
-    gcc_assert (vectype_in);
-  if (!vectype_in)
-    {
-      if (vect_print_dump_info (REPORT_DETAILS))
-        {
-          fprintf (vect_dump, "no vectype for scalar type ");
-          print_generic_expr (vect_dump, rhs_type, TDF_SLIM);
-        }
-
-      return false;
-    }
 
   /* FORNOW */
   nunits_in = TYPE_VECTOR_SUBPARTS (vectype_in);
@@ -1618,18 +1606,6 @@ vectorizable_conversion (gimple stmt, gimple_stmt_iterator *gsi,
      the same size as the output vector type.  */
   if (!vectype_in)
     vectype_in = get_same_sized_vectype (rhs_type, vectype_out);
-  if (vec_stmt)
-    gcc_assert (vectype_in);
-  if (!vectype_in)
-    {
-      if (vect_print_dump_info (REPORT_DETAILS))
-        {
-          fprintf (vect_dump, "no vectype for scalar type ");
-          print_generic_expr (vect_dump, rhs_type, TDF_SLIM);
-        }
-
-      return false;
-    }
 
   /* FORNOW */
   nunits_in = TYPE_VECTOR_SUBPARTS (vectype_in);
@@ -1643,6 +1619,8 @@ vectorizable_conversion (gimple stmt, gimple_stmt_iterator *gsi,
   else
     return false;
 
+  integral_type = INTEGRAL_TYPE_P (rhs_type) ? vectype_in : vectype_out;
+
   if (modifier == NARROW)
     ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits_out;
   else
@@ -2010,18 +1988,7 @@ vectorizable_operation (gimple stmt, gimple_stmt_iterator *gsi,
      the same size as the output vector type.  */
   if (!vectype)
     vectype = get_same_sized_vectype (TREE_TYPE (op0), vectype_out);
-  if (vec_stmt)
-    gcc_assert (vectype);
-  if (!vectype)
-    {
-      if (vect_print_dump_info (REPORT_DETAILS))
-        {
-          fprintf (vect_dump, "no vectype for scalar type ");
-          print_generic_expr (vect_dump, TREE_TYPE (op0), TDF_SLIM);
-        }
-
-      return false;
-    }
+  gcc_assert (vectype);
 
   nunits_out = TYPE_VECTOR_SUBPARTS (vectype_out);
   nunits_in = TYPE_VECTOR_SUBPARTS (vectype);
@@ -2484,18 +2451,8 @@ vectorizable_type_demotion (gimple stmt, gimple_stmt_iterator *gsi,
      same size as the output vector type if possible.  */
   if (!vectype_in)
     vectype_in = get_same_sized_vectype (TREE_TYPE (op0), vectype_out);
-  if (vec_stmt)
-    gcc_assert (vectype_in);
   if (!vectype_in)
-    {
-      if (vect_print_dump_info (REPORT_DETAILS))
-        {
-          fprintf (vect_dump, "no vectype for scalar type ");
-          print_generic_expr (vect_dump, TREE_TYPE (op0), TDF_SLIM);
-        }
-
-      return false;
-    }
+    return false;
 
   nunits_in = TYPE_VECTOR_SUBPARTS (vectype_in);
   nunits_out = TYPE_VECTOR_SUBPARTS (vectype_out);
@@ -2763,18 +2720,8 @@ vectorizable_type_promotion (gimple stmt, gimple_stmt_iterator *gsi,
      the same size as the output vector type.  */
   if (!vectype_in)
     vectype_in = get_same_sized_vectype (TREE_TYPE (op0), vectype_out);
-  if (vec_stmt)
-    gcc_assert (vectype_in);
   if (!vectype_in)
-    {
-      if (vect_print_dump_info (REPORT_DETAILS))
-        {
-          fprintf (vect_dump, "no vectype for scalar type ");
-          print_generic_expr (vect_dump, TREE_TYPE (op0), TDF_SLIM);
-        }
-
-      return false;
-    }
+    return false;
 
   nunits_in = TYPE_VECTOR_SUBPARTS (vectype_in);
   nunits_out = TYPE_VECTOR_SUBPARTS (vectype_out);
index 79fe6ab..1b99b16 100644 (file)
@@ -415,6 +415,15 @@ typedef struct _stmt_vec_info {
   /* The loop_vec_info with respect to which STMT is vectorized.  */
   loop_vec_info loop_vinfo;
 
+  /* Not all stmts in the loop need to be vectorized. e.g, the increment
+     of the loop induction variable and computation of array indexes. relevant
+     indicates whether the stmt needs to be vectorized.  */
+  enum vect_relevant relevant;
+
+  /* Indicates whether this stmts is part of a computation whose result is
+     used outside the loop.  */
+  bool live;
+
   /* The vector type to be used for the LHS of this statement.  */
   tree vectype;