mirror of git://gcc.gnu.org/git/gcc.git
tree-vect-loop-manip.c (slpeel_tree_duplicate_loop_to_edge_cfg): Put duplicated loop after its preheader and after the original loop.
* tree-vect-loop-manip.c (slpeel_tree_duplicate_loop_to_edge_cfg): Put duplicated loop after its preheader and after the original loop. From-SVN: r241098
This commit is contained in:
parent
328ba117ba
commit
3884da6f21
|
|
@ -1,3 +1,8 @@
|
||||||
|
2016-10-13 Bin Cheng <bin.cheng@arm.com>
|
||||||
|
|
||||||
|
* tree-vect-loop-manip.c (slpeel_tree_duplicate_loop_to_edge_cfg): Put
|
||||||
|
duplicated loop after its preheader and after the original loop.
|
||||||
|
|
||||||
2016-10-13 Bin Cheng <bin.cheng@arm.com>
|
2016-10-13 Bin Cheng <bin.cheng@arm.com>
|
||||||
|
|
||||||
* tree-vect-loop.c (vect_analyze_loop_2): Check and skip loop if it
|
* tree-vect-loop.c (vect_analyze_loop_2): Check and skip loop if it
|
||||||
|
|
|
||||||
|
|
@ -776,7 +776,7 @@ slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop,
|
||||||
struct loop *scalar_loop, edge e)
|
struct loop *scalar_loop, edge e)
|
||||||
{
|
{
|
||||||
struct loop *new_loop;
|
struct loop *new_loop;
|
||||||
basic_block *new_bbs, *bbs;
|
basic_block *new_bbs, *bbs, *pbbs;
|
||||||
bool at_exit;
|
bool at_exit;
|
||||||
bool was_imm_dom;
|
bool was_imm_dom;
|
||||||
basic_block exit_dest;
|
basic_block exit_dest;
|
||||||
|
|
@ -792,12 +792,13 @@ slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop,
|
||||||
scalar_loop = loop;
|
scalar_loop = loop;
|
||||||
|
|
||||||
bbs = XNEWVEC (basic_block, scalar_loop->num_nodes + 1);
|
bbs = XNEWVEC (basic_block, scalar_loop->num_nodes + 1);
|
||||||
get_loop_body_with_size (scalar_loop, bbs, scalar_loop->num_nodes);
|
pbbs = bbs + 1;
|
||||||
|
get_loop_body_with_size (scalar_loop, pbbs, scalar_loop->num_nodes);
|
||||||
/* Allow duplication of outer loops. */
|
/* Allow duplication of outer loops. */
|
||||||
if (scalar_loop->inner)
|
if (scalar_loop->inner)
|
||||||
duplicate_outer_loop = true;
|
duplicate_outer_loop = true;
|
||||||
/* Check whether duplication is possible. */
|
/* Check whether duplication is possible. */
|
||||||
if (!can_copy_bbs_p (bbs, scalar_loop->num_nodes))
|
if (!can_copy_bbs_p (pbbs, scalar_loop->num_nodes))
|
||||||
{
|
{
|
||||||
free (bbs);
|
free (bbs);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -817,15 +818,15 @@ slpeel_tree_duplicate_loop_to_edge_cfg (struct loop *loop,
|
||||||
pre-header unconditionally for this. */
|
pre-header unconditionally for this. */
|
||||||
basic_block preheader = split_edge (loop_preheader_edge (scalar_loop));
|
basic_block preheader = split_edge (loop_preheader_edge (scalar_loop));
|
||||||
edge entry_e = single_pred_edge (preheader);
|
edge entry_e = single_pred_edge (preheader);
|
||||||
bbs[scalar_loop->num_nodes] = preheader;
|
bbs[0] = preheader;
|
||||||
new_bbs = XNEWVEC (basic_block, scalar_loop->num_nodes + 1);
|
new_bbs = XNEWVEC (basic_block, scalar_loop->num_nodes + 1);
|
||||||
|
|
||||||
exit = single_exit (scalar_loop);
|
exit = single_exit (scalar_loop);
|
||||||
copy_bbs (bbs, scalar_loop->num_nodes + 1, new_bbs,
|
copy_bbs (bbs, scalar_loop->num_nodes + 1, new_bbs,
|
||||||
&exit, 1, &new_exit, NULL,
|
&exit, 1, &new_exit, NULL,
|
||||||
e->src, true);
|
at_exit ? loop->latch : e->src, true);
|
||||||
exit = single_exit (loop);
|
exit = single_exit (loop);
|
||||||
basic_block new_preheader = new_bbs[scalar_loop->num_nodes];
|
basic_block new_preheader = new_bbs[0];
|
||||||
|
|
||||||
add_phi_args_after_copy (new_bbs, scalar_loop->num_nodes + 1, NULL);
|
add_phi_args_after_copy (new_bbs, scalar_loop->num_nodes + 1, NULL);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue