diff mbox

Fix PR tree-optimization/50451

Message ID CAKSNEw4qHdq3Rp+cr28svm53cwRbBkp+uK6b9Banec0jEtLkrg@mail.gmail.com
State New
Headers show

Commit Message

Ira Rosen Sept. 22, 2011, 7:21 a.m. UTC
Hi,

This patch adds a missing support of constant operands in reduction in SLP.

Bootstrapped and tested on powerpc64-suse-linux.
Committed.

Ira

ChangeLog:

        PR tree-optimization/50451
        * tree-vect-slp.c (vect_get_constant_vectors): Don't fail for
        constant operands in reduction.
        (vect_get_slp_defs): Don't create vector operand for NULL scalar
        operand.

testsuite/ChangeLog:

        PR tree-optimization/50451
        * gcc.dg/vect/pr50451.c: New test.
diff mbox

Patch

Index: tree-vect-slp.c
===================================================================
--- tree-vect-slp.c     (revision 179076)
+++ tree-vect-slp.c     (working copy)
@@ -1905,14 +1905,9 @@  vect_get_constant_vectors (tree op, slp_tree slp_n
   gimple def_stmt;
   struct loop *loop;

-  if (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def)
+  if (STMT_VINFO_DEF_TYPE (stmt_vinfo) == vect_reduction_def
+      && reduc_index != -1)
     {
-      if (reduc_index == -1)
-        {
-          VEC_free (tree, heap, *vec_oprnds);
-          return;
-        }
-
       op_num = reduc_index - 1;
       op = gimple_op (stmt, reduc_index);
       /* For additional copies (see the explanation of NUMBER_OF_COPIES below)
@@ -2164,7 +2159,7 @@  vect_get_slp_defs (tree op0, tree op1, slp_tree sl
     return;

   code = gimple_assign_rhs_code (first_stmt);
-  if (get_gimple_rhs_class (code) != GIMPLE_BINARY_RHS || !vec_oprnds1)
+  if (get_gimple_rhs_class (code) != GIMPLE_BINARY_RHS || !vec_oprnds1 || !op1)
     return;

   /* The number of vector defs is determined by the number of vector statements
Index: testsuite/gcc.dg/vect/pr50451.c
===================================================================
--- testsuite/gcc.dg/vect/pr50451.c     (revision 0)
+++ testsuite/gcc.dg/vect/pr50451.c     (revision 0)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_int } */
+
+int
+foo (int integral, int decimal, int power_ten)
+{
+  while (power_ten > 0)
+    {
+      integral *= 10;
+      decimal *= 10;
+      power_ten--;
+    }
+
+  return integral+decimal;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
+