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:
parent
5ea387db6c
commit
027f10047b
@ -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
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user