re PR tree-optimization/50014 (Assertion failed in vect_get_vec_def_for_stmt_copy)
authorIra Rosen <ira.rosen@linaro.org>
Tue, 9 Aug 2011 06:02:00 +0000 (06:02 +0000)
committerIra Rosen <irar@gcc.gnu.org>
Tue, 9 Aug 2011 06:02:00 +0000 (06:02 +0000)
        PR tree-optimization/50014
        * tree-vect-loop.c (vectorizable_reduction): Get def type before
        calling vect_get_vec_def_for_stmt_copy ().

From-SVN: r177581

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr50014.c [new file with mode: 0644]
gcc/tree-vect-loop.c

index 2b9fb29a8a56645f7d82d2f0e47910ef0a87c126..d7d2cd7574e36759bd3d04f4ca57c5ead4074b19 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-09  Ira Rosen  <ira.rosen@linaro.org>
+
+       PR tree-optimization/50014
+       * tree-vect-loop.c (vectorizable_reduction): Get def type before
+       calling vect_get_vec_def_for_stmt_copy ().
+
 2011-08-08  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR rtl-optimization/49990
index 347975d70910e8b0ea0b5201a255554661659bff..48836028dd6dec9a3a83d494dc0575c7c828fd43 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-09  Ira Rosen  <ira.rosen@linaro.org>
+
+       PR tree-optimization/50014
+       * gcc.dg/vect/pr50014.c: New test.
+
 2011-08-08  Martin Jambor  <mjambor@suse.cz>
 
        PR middle-end/49923
diff --git a/gcc/testsuite/gcc.dg/vect/pr50014.c b/gcc/testsuite/gcc.dg/vect/pr50014.c
new file mode 100644 (file)
index 0000000..c04ffec
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+
+int f(unsigned char *s, int n)
+{
+  int sum = 0;
+  int i;
+
+  for (i = 0; i < n; i++)
+    sum += 256 * s[i];
+
+  return sum;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
index afd03f28ff1ef036f4f72bf1adfed37120052756..539bcaabd9709f58012b07c497bfd36d8dfcff36 100644 (file)
@@ -4318,7 +4318,7 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi,
   VEC (tree, heap) *vec_oprnds0 = NULL, *vec_oprnds1 = NULL, *vect_defs = NULL;
   VEC (gimple, heap) *phis = NULL;
   int vec_num;
-  tree def0, def1, tem;
+  tree def0, def1, tem, op0, op1 = NULL_TREE;
 
   /* In case of reduction chain we switch to the first stmt in the chain, but
      we don't update STMT_INFO, since only the last stmt is marked as reduction
@@ -4775,8 +4775,6 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi,
       /* Handle uses.  */
       if (j == 0)
         {
-          tree op0, op1 = NULL_TREE;
-
           op0 = ops[!reduc_index];
           if (op_type == ternary_op)
             {
@@ -4806,11 +4804,19 @@ vectorizable_reduction (gimple stmt, gimple_stmt_iterator *gsi,
         {
           if (!slp_node)
             {
-              enum vect_def_type dt = vect_unknown_def_type; /* Dummy */
-              loop_vec_def0 = vect_get_vec_def_for_stmt_copy (dt, loop_vec_def0);
+              enum vect_def_type dt;
+              gimple dummy_stmt;
+              tree dummy;
+
+              vect_is_simple_use (ops[!reduc_index], loop_vinfo, NULL,
+                                  &dummy_stmt, &dummy, &dt);
+              loop_vec_def0 = vect_get_vec_def_for_stmt_copy (dt,
+                                                              loop_vec_def0);
               VEC_replace (tree, vec_oprnds0, 0, loop_vec_def0);
               if (op_type == ternary_op)
                 {
+                  vect_is_simple_use (op1, loop_vinfo, NULL, &dummy_stmt,
+                                      &dummy, &dt);
                   loop_vec_def1 = vect_get_vec_def_for_stmt_copy (dt,
                                                                 loop_vec_def1);
                   VEC_replace (tree, vec_oprnds1, 0, loop_vec_def1);