re PR tree-optimization/69166 (ICE in get_initial_def_for_reduction, at tree-vect...
authorRichard Biener <rguenther@suse.de>
Wed, 27 Jan 2016 14:54:03 +0000 (14:54 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 27 Jan 2016 14:54:03 +0000 (14:54 +0000)
2016-01-27  Richard Biener  <rguenther@suse.de>

PR tree-optimization/69166
* tree-vect-loop.c (vect_is_simple_reduction): Always check
reduction code for commutativity / associativity.

* gcc.dg/torture/pr69166.c: New testcase.

From-SVN: r232878

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

index 824c69c..9f8869b 100644 (file)
@@ -1,3 +1,9 @@
+2016-01-27  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69166
+       * tree-vect-loop.c (vect_is_simple_reduction): Always check
+       reduction code for commutativity / associativity.
+
 2016-01-27  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/69355
index 7dae86c..8c7f4dd 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-27  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/69166
+       * gcc.dg/torture/pr69166.c: New testcase.
+
 2016-01-27  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/69355
diff --git a/gcc/testsuite/gcc.dg/torture/pr69166.c b/gcc/testsuite/gcc.dg/torture/pr69166.c
new file mode 100644 (file)
index 0000000..c10f8e6
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+void fn2(double *e, double a)
+{
+  int b = 0;
+  for (; b < 256; b++)
+    {
+      int c = 0;
+      double x = e[b];
+      for (; c < 256; ++c)
+       x /= a;
+      e[b] = x;
+    }
+}
index 6034672..b8303ad 100644 (file)
@@ -2750,17 +2750,17 @@ vect_is_simple_reduction (loop_vec_info loop_info, gimple *phi,
       && SSA_NAME_DEF_STMT (op1) == phi)
     code = PLUS_EXPR;
 
-  if (check_reduction)
+  if (code == COND_EXPR)
     {
-      if (code == COND_EXPR)
+      if (check_reduction)
        *v_reduc_type = COND_REDUCTION;
-      else if (!commutative_tree_code (code) || !associative_tree_code (code))
-       {
-         if (dump_enabled_p ())
-           report_vect_op (MSG_MISSED_OPTIMIZATION, def_stmt,
-                           "reduction: not commutative/associative: ");
-         return NULL;
-       }
+    }
+  else if (!commutative_tree_code (code) || !associative_tree_code (code))
+    {
+      if (dump_enabled_p ())
+       report_vect_op (MSG_MISSED_OPTIMIZATION, def_stmt,
+                       "reduction: not commutative/associative: ");
+      return NULL;
     }
 
   if (get_gimple_rhs_class (code) != GIMPLE_BINARY_RHS)
@@ -2856,11 +2856,11 @@ vect_is_simple_reduction (loop_vec_info loop_info, gimple *phi,
      and therefore vectorizing reductions in the inner-loop during
      outer-loop vectorization is safe.  */
 
-  if (*v_reduc_type != COND_REDUCTION)
+  if (*v_reduc_type != COND_REDUCTION
+      && check_reduction)
     {
       /* CHECKME: check for !flag_finite_math_only too?  */
-      if (SCALAR_FLOAT_TYPE_P (type) && !flag_associative_math
-         && check_reduction)
+      if (SCALAR_FLOAT_TYPE_P (type) && !flag_associative_math)
        {
          /* Changing the order of operations changes the semantics.  */
          if (dump_enabled_p ())
@@ -2868,7 +2868,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, gimple *phi,
                        "reduction: unsafe fp math optimization: ");
          return NULL;
        }
-      else if (INTEGRAL_TYPE_P (type) && check_reduction)
+      else if (INTEGRAL_TYPE_P (type))
        {
          if (!operation_no_trapping_overflow (type, code))
            {
@@ -2891,7 +2891,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, gimple *phi,
              return NULL;
            }
        }
-      else if (SAT_FIXED_POINT_TYPE_P (type) && check_reduction)
+      else if (SAT_FIXED_POINT_TYPE_P (type))
        {
          /* Changing the order of operations changes the semantics.  */
          if (dump_enabled_p ())