Commit 02bf7e6f by Richard Biener Committed by Richard Biener

re PR tree-optimization/92371 (ICE in info_for_reduction, at tree-vect-loop.c:4106)

2019-11-05  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/92371
	* tree-vect-loop.c (vectorizable_reduction): Set STMT_VINFO_REDUC_DEF
	on the original stmt of live stmts in the chain.
	(vectorizable_live_operation): Look at the original stmt when
	checking STMT_VINFO_REDUC_DEF.

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

From-SVN: r277850
parent c6a7be9b
2019-11-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/92371
* tree-vect-loop.c (vectorizable_reduction): Set STMT_VINFO_REDUC_DEF
on the original stmt of live stmts in the chain.
(vectorizable_live_operation): Look at the original stmt when
checking STMT_VINFO_REDUC_DEF.
2019-11-05 Aldy Hernandez <aldyh@redhat.com> 2019-11-05 Aldy Hernandez <aldyh@redhat.com>
* gimple-fold.c, gimple-loop-versioning.cc, * gimple-fold.c, gimple-loop-versioning.cc,
2019-11-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/92371
* gcc.dg/torture/pr92371.c: New testcase.
2019-11-05 Martin Liska <mliska@suse.cz> 2019-11-05 Martin Liska <mliska@suse.cz>
* c-c++-common/ubsan/ptr-overflow-2.c: Update based on changed * c-c++-common/ubsan/ptr-overflow-2.c: Update based on changed
......
/* { dg-do compile } */
/* { dg-additional-options "-ftree-vectorize" } */
int a, b;
void d()
{
int c = sizeof(int);
for (; a; a++)
c *= sizeof(int);
c *= sizeof(int);
b = c;
}
...@@ -5836,21 +5836,22 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node, ...@@ -5836,21 +5836,22 @@ vectorizable_reduction (stmt_vec_info stmt_info, slp_tree slp_node,
while (reduc_def != PHI_RESULT (reduc_def_phi)) while (reduc_def != PHI_RESULT (reduc_def_phi))
{ {
stmt_vec_info def = loop_vinfo->lookup_def (reduc_def); stmt_vec_info def = loop_vinfo->lookup_def (reduc_def);
def = vect_stmt_to_vectorize (def); stmt_vec_info vdef = vect_stmt_to_vectorize (def);
if (STMT_VINFO_REDUC_IDX (def) == -1) if (STMT_VINFO_REDUC_IDX (vdef) == -1)
{ {
if (dump_enabled_p ()) if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
"reduction chain broken by patterns.\n"); "reduction chain broken by patterns.\n");
return false; return false;
} }
if (!REDUC_GROUP_FIRST_ELEMENT (def)) if (!REDUC_GROUP_FIRST_ELEMENT (vdef))
only_slp_reduc_chain = false; only_slp_reduc_chain = false;
/* ??? For epilogue generation live members of the chain need /* ??? For epilogue generation live members of the chain need
to point back to the PHI for info_for_reduction to work. */ to point back to the PHI via their original stmt for
if (STMT_VINFO_LIVE_P (def)) info_for_reduction to work. */
if (STMT_VINFO_LIVE_P (vdef))
STMT_VINFO_REDUC_DEF (def) = phi_info; STMT_VINFO_REDUC_DEF (def) = phi_info;
reduc_def = gimple_op (def->stmt, 1 + STMT_VINFO_REDUC_IDX (def)); reduc_def = gimple_op (vdef->stmt, 1 + STMT_VINFO_REDUC_IDX (vdef));
reduc_chain_length++; reduc_chain_length++;
} }
...@@ -7554,7 +7555,7 @@ vectorizable_live_operation (stmt_vec_info stmt_info, ...@@ -7554,7 +7555,7 @@ vectorizable_live_operation (stmt_vec_info stmt_info,
/* If a stmt of a reduction is live, vectorize it via /* If a stmt of a reduction is live, vectorize it via
vect_create_epilog_for_reduction. vectorizable_reduction assessed vect_create_epilog_for_reduction. vectorizable_reduction assessed
validity so just trigger the transform here. */ validity so just trigger the transform here. */
if (STMT_VINFO_REDUC_DEF (stmt_info)) if (STMT_VINFO_REDUC_DEF (vect_orig_stmt (stmt_info)))
{ {
if (!vec_stmt_p) if (!vec_stmt_p)
return true; return true;
......
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