From: Richard Biener Date: Wed, 27 Jan 2016 14:54:03 +0000 (+0000) Subject: re PR tree-optimization/69166 (ICE in get_initial_def_for_reduction, at tree-vect... X-Git-Tag: basepoints/gcc-7~1289 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=167c7bfa499967104ff514075c581a58d4ac240b;p=thirdparty%2Fgcc.git re PR tree-optimization/69166 (ICE in get_initial_def_for_reduction, at tree-vect-loop.c:4188) 2016-01-27 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 824c69c1859f..9f8869b6f6de 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-01-27 Richard Biener + + PR tree-optimization/69166 + * tree-vect-loop.c (vect_is_simple_reduction): Always check + reduction code for commutativity / associativity. + 2016-01-27 Martin Jambor PR tree-optimization/69355 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7dae86c1fe05..8c7f4ddb3716 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-27 Richard Biener + + PR tree-optimization/69166 + * gcc.dg/torture/pr69166.c: New testcase. + 2016-01-27 Martin Jambor 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 index 000000000000..c10f8e65357e --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr69166.c @@ -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; + } +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 60346725a441..b8303ad41393 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -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 ())