Commit d2e78d76 by Richard Biener Committed by Richard Biener

re PR tree-optimization/81418 (ICE in vect_get_vec_def_for_stmt_copy)

2017-06-18  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/81418
	* tree-vect-loop.c (vectorizable_reduction): Properly compute
	vectype_in.  Verify that with lane-reducing reduction operations
	we have a single def-use cycle.

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

From-SVN: r250296
parent 651dbe5d
gcc/ChangeLog: 2017-06-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/81418
* tree-vect-loop.c (vectorizable_reduction): Properly compute
vectype_in. Verify that with lane-reducing reduction operations
we have a single def-use cycle.
2017-07-17 Carl Love <cel@us.ibm.com> 2017-07-17 Carl Love <cel@us.ibm.com>
......
gcc/testsuite/ChangeLog: 2017-06-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/81418
* gcc.dg/torture/pr81418.c: New testcase.
2017-07-17 Carl Love <cel@us.ibm.com> 2017-07-17 Carl Love <cel@us.ibm.com>
......
/* { dg-do compile } */
/* { dg-additional-options "-ftree-loop-optimize" } */
int
ol (int ku)
{
int zq = 0;
while (ku < 1)
{
int y6;
for (y6 = 0; y6 < 3; ++y6)
zq += (char)ku;
++ku;
}
return zq;
}
...@@ -5642,7 +5642,10 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi, ...@@ -5642,7 +5642,10 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi,
if (k == 1 if (k == 1
&& gimple_assign_rhs_code (reduc_stmt) == COND_EXPR) && gimple_assign_rhs_code (reduc_stmt) == COND_EXPR)
continue; continue;
vectype_in = get_vectype_for_scalar_type (TREE_TYPE (op)); tem = get_vectype_for_scalar_type (TREE_TYPE (op));
if (! vectype_in
|| TYPE_VECTOR_SUBPARTS (tem) < TYPE_VECTOR_SUBPARTS (vectype_in))
vectype_in = tem;
break; break;
} }
gcc_assert (vectype_in); gcc_assert (vectype_in);
...@@ -6213,26 +6216,6 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi, ...@@ -6213,26 +6216,6 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi,
} }
} }
if (!vec_stmt) /* transformation not required. */
{
if (first_p)
vect_model_reduction_cost (stmt_info, epilog_reduc_code, ncopies);
STMT_VINFO_TYPE (stmt_info) = reduc_vec_info_type;
return true;
}
/* Transform. */
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location, "transform reduction.\n");
/* FORNOW: Multiple types are not supported for condition. */
if (code == COND_EXPR)
gcc_assert (ncopies == 1);
/* Create the destination vector */
vec_dest = vect_create_destination_var (scalar_dest, vectype_out);
/* In case the vectorization factor (VF) is bigger than the number /* In case the vectorization factor (VF) is bigger than the number
of elements that we can fit in a vectype (nunits), we have to generate of elements that we can fit in a vectype (nunits), we have to generate
more than one vector stmt - i.e - we need to "unroll" the more than one vector stmt - i.e - we need to "unroll" the
...@@ -6276,6 +6259,41 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi, ...@@ -6276,6 +6259,41 @@ vectorizable_reduction (gimple *stmt, gimple_stmt_iterator *gsi,
else else
epilog_copies = ncopies; epilog_copies = ncopies;
/* If the reduction stmt is one of the patterns that have lane
reduction embedded we cannot handle the case of ! single_defuse_cycle. */
if ((ncopies > 1
&& ! single_defuse_cycle)
&& (code == DOT_PROD_EXPR
|| code == WIDEN_SUM_EXPR
|| code == SAD_EXPR))
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
"multi def-use cycle not possible for lane-reducing "
"reduction operation\n");
return false;
}
if (!vec_stmt) /* transformation not required. */
{
if (first_p)
vect_model_reduction_cost (stmt_info, epilog_reduc_code, ncopies);
STMT_VINFO_TYPE (stmt_info) = reduc_vec_info_type;
return true;
}
/* Transform. */
if (dump_enabled_p ())
dump_printf_loc (MSG_NOTE, vect_location, "transform reduction.\n");
/* FORNOW: Multiple types are not supported for condition. */
if (code == COND_EXPR)
gcc_assert (ncopies == 1);
/* Create the destination vector */
vec_dest = vect_create_destination_var (scalar_dest, vectype_out);
prev_stmt_info = NULL; prev_stmt_info = NULL;
prev_phi_info = NULL; prev_phi_info = NULL;
if (slp_node) if (slp_node)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment