re PR tree-optimization/77286 (ICE in fold_convert_loc, at fold-const.c:2248 building 435.gromacs)

2016-08-23  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/77286
	* tree-vect-loop.c (vect_analyze_loop_form_1): Do not modify
	the CFG here.
	(vect_transform_loop): Split exit edges of loop and scalar
	loop if required and at the appropriate time.

From-SVN: r239700
This commit is contained in:
Richard Biener 2016-08-23 13:58:19 +00:00 committed by Richard Biener
parent 5ea387db6c
commit 027f10047b
2 changed files with 41 additions and 16 deletions

View File

@ -1,3 +1,11 @@
2016-08-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/77286
* tree-vect-loop.c (vect_analyze_loop_form_1): Do not modify
the CFG here.
(vect_transform_loop): Split exit edges of loop and scalar
loop if required and at the appropriate time.
2016-08-23 Dominik Vogt <vogt@linux.vnet.ibm.com> 2016-08-23 Dominik Vogt <vogt@linux.vnet.ibm.com>
* explow.c (get_dynamic_stack_size): Take known alignment of stack * explow.c (get_dynamic_stack_size): Take known alignment of stack

View File

@ -1486,23 +1486,14 @@ vect_analyze_loop_form_1 (struct loop *loop, gcond **loop_cond,
return false; return false;
} }
/* Make sure there exists a single-predecessor exit bb: */ /* Make sure the exit is not abnormal. */
if (!single_pred_p (single_exit (loop)->dest)) edge e = single_exit (loop);
if (e->flags & EDGE_ABNORMAL)
{ {
edge e = single_exit (loop); if (dump_enabled_p ())
if (!(e->flags & EDGE_ABNORMAL)) dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
{ "not vectorized: abnormal loop exit edge.\n");
split_loop_exit_edge (e); return false;
if (dump_enabled_p ())
dump_printf (MSG_NOTE, "split exit edge.\n");
}
else
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
"not vectorized: abnormal loop exit edge.\n");
return false;
}
} }
*loop_cond = vect_get_loop_niters (loop, assumptions, number_of_iterations, *loop_cond = vect_get_loop_niters (loop, assumptions, number_of_iterations,
@ -6759,6 +6750,16 @@ vect_transform_loop (loop_vec_info loop_vinfo)
check_profitability = true; check_profitability = true;
} }
/* Make sure there exists a single-predecessor exit bb. Do this before
versioning. */
edge e = single_exit (loop);
if (! single_pred_p (e->dest))
{
split_loop_exit_edge (e);
if (dump_enabled_p ())
dump_printf (MSG_NOTE, "split exit edge\n");
}
/* Version the loop first, if required, so the profitability check /* Version the loop first, if required, so the profitability check
comes first. */ comes first. */
@ -6768,6 +6769,22 @@ vect_transform_loop (loop_vec_info loop_vinfo)
check_profitability = false; check_profitability = false;
} }
/* Make sure there exists a single-predecessor exit bb also on the
scalar loop copy. Do this after versioning but before peeling
so CFG structure is fine for both scalar and if-converted loop
to make slpeel_duplicate_current_defs_from_edges face matched
loop closed PHI nodes on the exit. */
if (LOOP_VINFO_SCALAR_LOOP (loop_vinfo))
{
e = single_exit (LOOP_VINFO_SCALAR_LOOP (loop_vinfo));
if (! single_pred_p (e->dest))
{
split_loop_exit_edge (e);
if (dump_enabled_p ())
dump_printf (MSG_NOTE, "split exit edge of scalar loop\n");
}
}
tree ni_name = vect_build_loop_niters (loop_vinfo); tree ni_name = vect_build_loop_niters (loop_vinfo);
LOOP_VINFO_NITERS_UNCHANGED (loop_vinfo) = ni_name; LOOP_VINFO_NITERS_UNCHANGED (loop_vinfo) = ni_name;