Commit 0eb952ea by Jakub Jelinek Committed by Jakub Jelinek

re PR lto/83338 (SPEC CPU2017 510.parest_r ICE)

	PR tree-optimization/83338
	* tree-vect-stmts.c (vectorizable_operation): Handle POINTER_DIFF_EXPR
	vectorization as MINUS_EXPR with a subsequent VIEW_CONVERT_EXPR from
	vector of unsigned integers to vector of signed integers.

	* gcc.dg/vect/pr83338.c: New test.

From-SVN: r255523
parent b01fff48
2017-12-09 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/83338
* tree-vect-stmts.c (vectorizable_operation): Handle POINTER_DIFF_EXPR
vectorization as MINUS_EXPR with a subsequent VIEW_CONVERT_EXPR from
vector of unsigned integers to vector of signed integers.
2017-12-08 Vladimir Makarov <vmakarov@redhat.com> 2017-12-08 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/83317 PR rtl-optimization/83317
2017-12-09 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/83338
* gcc.dg/vect/pr83338.c: New test.
2017-12-09 Thomas Koenig <tkoenig@gcc.gnu.org> 2017-12-09 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/83316 PR fortran/83316
......
/* PR tree-optimization/83338 */
/* { dg-do compile } */
void
foo (char **p, char **q, __PTRDIFF_TYPE__ *r)
{
int i;
for (i = 0; i < 1024; i++)
r[i] = p[i] - q[i];
}
...@@ -5226,7 +5226,7 @@ vectorizable_operation (gimple *stmt, gimple_stmt_iterator *gsi, ...@@ -5226,7 +5226,7 @@ vectorizable_operation (gimple *stmt, gimple_stmt_iterator *gsi,
stmt_vec_info stmt_info = vinfo_for_stmt (stmt); stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
tree vectype; tree vectype;
loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info); loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_info);
enum tree_code code; enum tree_code code, orig_code;
machine_mode vec_mode; machine_mode vec_mode;
tree new_temp; tree new_temp;
int op_type; int op_type;
...@@ -5264,7 +5264,7 @@ vectorizable_operation (gimple *stmt, gimple_stmt_iterator *gsi, ...@@ -5264,7 +5264,7 @@ vectorizable_operation (gimple *stmt, gimple_stmt_iterator *gsi,
if (TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME) if (TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
return false; return false;
code = gimple_assign_rhs_code (stmt); orig_code = code = gimple_assign_rhs_code (stmt);
/* For pointer addition and subtraction, we should use the normal /* For pointer addition and subtraction, we should use the normal
plus and minus for the vector operation. */ plus and minus for the vector operation. */
...@@ -5455,6 +5455,14 @@ vectorizable_operation (gimple *stmt, gimple_stmt_iterator *gsi, ...@@ -5455,6 +5455,14 @@ vectorizable_operation (gimple *stmt, gimple_stmt_iterator *gsi,
/* Handle def. */ /* Handle def. */
vec_dest = vect_create_destination_var (scalar_dest, vectype); vec_dest = vect_create_destination_var (scalar_dest, vectype);
/* POINTER_DIFF_EXPR has pointer arguments which are vectorized as
vectors with unsigned elements, but the result is signed. So, we
need to compute the MINUS_EXPR into vectype temporary and
VIEW_CONVERT_EXPR it into the final vectype_out result. */
tree vec_cvt_dest = NULL_TREE;
if (orig_code == POINTER_DIFF_EXPR)
vec_cvt_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
...@@ -5546,6 +5554,15 @@ vectorizable_operation (gimple *stmt, gimple_stmt_iterator *gsi, ...@@ -5546,6 +5554,15 @@ vectorizable_operation (gimple *stmt, gimple_stmt_iterator *gsi,
new_temp = make_ssa_name (vec_dest, new_stmt); new_temp = make_ssa_name (vec_dest, new_stmt);
gimple_assign_set_lhs (new_stmt, new_temp); gimple_assign_set_lhs (new_stmt, new_temp);
vect_finish_stmt_generation (stmt, new_stmt, gsi); vect_finish_stmt_generation (stmt, new_stmt, gsi);
if (vec_cvt_dest)
{
new_temp = build1 (VIEW_CONVERT_EXPR, vectype_out, new_temp);
new_stmt = gimple_build_assign (vec_cvt_dest, VIEW_CONVERT_EXPR,
new_temp);
new_temp = make_ssa_name (vec_cvt_dest, new_stmt);
gimple_assign_set_lhs (new_stmt, new_temp);
vect_finish_stmt_generation (stmt, new_stmt, gsi);
}
if (slp_node) if (slp_node)
SLP_TREE_VEC_STMTS (slp_node).quick_push (new_stmt); SLP_TREE_VEC_STMTS (slp_node).quick_push (new_stmt);
} }
......
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