Commit be2b68e4 by Richard Biener Committed by Richard Biener

re PR tree-optimization/87962 (ICE in vect_get_vec_def_for_operand_1, at tree-vect-stmts.c:1485)

2018-11-13  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/87962
	* tree-vect-loop.c (vect_is_simple_reduction): More reliably
	detect outer reduction for disqualifying in-loop uses.

	* gcc.dg/pr87962.c: New testcase.

From-SVN: r266071
parent a28dfaaf
2018-11-13 Richard Biener <rguenther@suse.de> 2018-11-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/87962
* tree-vect-loop.c (vect_is_simple_reduction): More reliably
detect outer reduction for disqualifying in-loop uses.
2018-11-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/87967 PR tree-optimization/87967
* tree-vect-loop.c (vect_transform_loop): Also copy PHIs * tree-vect-loop.c (vect_transform_loop): Also copy PHIs
for constants for the scalar loop. for constants for the scalar loop.
2018-11-13 Richard Biener <rguenther@suse.de> 2018-11-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/87962
* gcc.dg/pr87962.c: New testcase.
2018-11-13 Richard Biener <rguenther@suse.de>
PR tree-optimization/87967 PR tree-optimization/87967
* g++.dg/opt/pr87967.C: New testcase. * g++.dg/opt/pr87967.C: New testcase.
......
/* { dg-do compile } */
/* { dg-options "-O3" } */
/* { dg-additional-options "-march=bdver2" { target { x86_64-*-* i?86-*-* } } } */
int a, b;
int c()
{
long d, e;
while (a) {
a++;
b = 0;
for (; b++ - 2; d = d >> 1)
e += d;
}
return e;
}
...@@ -2807,11 +2807,11 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info, ...@@ -2807,11 +2807,11 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
gphi *phi = as_a <gphi *> (phi_info->stmt); gphi *phi = as_a <gphi *> (phi_info->stmt);
struct loop *loop = (gimple_bb (phi))->loop_father; struct loop *loop = (gimple_bb (phi))->loop_father;
struct loop *vect_loop = LOOP_VINFO_LOOP (loop_info); struct loop *vect_loop = LOOP_VINFO_LOOP (loop_info);
bool nested_in_vect_loop = flow_loop_nested_p (vect_loop, loop);
gimple *phi_use_stmt = NULL; gimple *phi_use_stmt = NULL;
enum tree_code orig_code, code; enum tree_code orig_code, code;
tree op1, op2, op3 = NULL_TREE, op4 = NULL_TREE; tree op1, op2, op3 = NULL_TREE, op4 = NULL_TREE;
tree type; tree type;
int nloop_uses;
tree name; tree name;
imm_use_iterator imm_iter; imm_use_iterator imm_iter;
use_operand_p use_p; use_operand_p use_p;
...@@ -2827,7 +2827,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info, ...@@ -2827,7 +2827,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
can be constant. See PR60382. */ can be constant. See PR60382. */
if (has_zero_uses (phi_name)) if (has_zero_uses (phi_name))
return NULL; return NULL;
nloop_uses = 0; unsigned nphi_def_loop_uses = 0;
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, phi_name) FOR_EACH_IMM_USE_FAST (use_p, imm_iter, phi_name)
{ {
gimple *use_stmt = USE_STMT (use_p); gimple *use_stmt = USE_STMT (use_p);
...@@ -2843,20 +2843,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info, ...@@ -2843,20 +2843,7 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
return NULL; return NULL;
} }
/* For inner loop reductions in nested vectorization there are no nphi_def_loop_uses++;
constraints on the number of uses in the inner loop. */
if (loop == vect_loop->inner)
continue;
nloop_uses++;
if (nloop_uses > 1)
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
"reduction value used in loop.\n");
return NULL;
}
phi_use_stmt = use_stmt; phi_use_stmt = use_stmt;
} }
...@@ -2894,26 +2881,32 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info, ...@@ -2894,26 +2881,32 @@ vect_is_simple_reduction (loop_vec_info loop_info, stmt_vec_info phi_info,
return NULL; return NULL;
} }
nloop_uses = 0; unsigned nlatch_def_loop_uses = 0;
auto_vec<gphi *, 3> lcphis; auto_vec<gphi *, 3> lcphis;
bool inner_loop_of_double_reduc = false;
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name) FOR_EACH_IMM_USE_FAST (use_p, imm_iter, name)
{ {
gimple *use_stmt = USE_STMT (use_p); gimple *use_stmt = USE_STMT (use_p);
if (is_gimple_debug (use_stmt)) if (is_gimple_debug (use_stmt))
continue; continue;
if (flow_bb_inside_loop_p (loop, gimple_bb (use_stmt))) if (flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)))
nloop_uses++; nlatch_def_loop_uses++;
else else
/* We can have more than one loop-closed PHI. */ {
lcphis.safe_push (as_a <gphi *> (use_stmt)); /* We can have more than one loop-closed PHI. */
lcphis.safe_push (as_a <gphi *> (use_stmt));
if (nested_in_vect_loop
&& (STMT_VINFO_DEF_TYPE (loop_info->lookup_stmt (use_stmt))
== vect_double_reduction_def))
inner_loop_of_double_reduc = true;
}
} }
/* If this isn't a nested cycle or if the nested cycle reduction value /* If this isn't a nested cycle or if the nested cycle reduction value
is used ouside of the inner loop we cannot handle uses of the reduction is used ouside of the inner loop we cannot handle uses of the reduction
value. */ value. */
bool nested_in_vect_loop = flow_loop_nested_p (vect_loop, loop); if ((!nested_in_vect_loop || inner_loop_of_double_reduc)
if ((!nested_in_vect_loop || !lcphis.is_empty ()) && (nlatch_def_loop_uses > 1 || nphi_def_loop_uses > 1))
&& nloop_uses > 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,
......
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