Commit d42ba2d2 by Tom de Vries Committed by Tom de Vries

Insert new exit block only when needed in transform_to_exit_first_loop_alt

2015-11-11  Tom de Vries  <tom@codesourcery.com>

	* tree-parloops.c (transform_to_exit_first_loop_alt): Insert new exit
	block only when needed.

From-SVN: r230188
parent c5bd8d52
2015-11-11 Tom de Vries <tom@codesourcery.com>
* tree-parloops.c (transform_to_exit_first_loop_alt): Insert new exit
block only when needed.
2015-11-11 Uros Bizjak <ubizjak@gmail.com>
* config/alpha/alpha-protos.h (print_operand): Remove.
......@@ -1695,10 +1695,15 @@ transform_to_exit_first_loop_alt (struct loop *loop,
/* Set the latch arguments of the new phis to ivtmp/sum_b. */
flush_pending_stmts (post_inc_edge);
/* Create a new empty exit block, inbetween the new loop header and the old
exit block. The function separate_decls_in_region needs this block to
insert code that is active on loop exit, but not any other path. */
basic_block new_exit_block = split_edge (exit);
basic_block new_exit_block = NULL;
if (!single_pred_p (exit->dest))
{
/* Create a new empty exit block, inbetween the new loop header and the
old exit block. The function separate_decls_in_region needs this block
to insert code that is active on loop exit, but not any other path. */
new_exit_block = split_edge (exit);
}
/* Insert and register the reduction exit phis. */
for (gphi_iterator gsi = gsi_start_phis (exit_block);
......@@ -1706,17 +1711,24 @@ transform_to_exit_first_loop_alt (struct loop *loop,
gsi_next (&gsi))
{
gphi *phi = gsi.phi ();
gphi *nphi = NULL;
tree res_z = PHI_RESULT (phi);
tree res_c;
/* Now that we have a new exit block, duplicate the phi of the old exit
block in the new exit block to preserve loop-closed ssa. */
if (new_exit_block != NULL)
{
/* Now that we have a new exit block, duplicate the phi of the old
exit block in the new exit block to preserve loop-closed ssa. */
edge succ_new_exit_block = single_succ_edge (new_exit_block);
edge pred_new_exit_block = single_pred_edge (new_exit_block);
tree res_y = copy_ssa_name (res_z, phi);
gphi *nphi = create_phi_node (res_y, new_exit_block);
tree res_c = PHI_ARG_DEF_FROM_EDGE (phi, succ_new_exit_block);
nphi = create_phi_node (res_y, new_exit_block);
res_c = PHI_ARG_DEF_FROM_EDGE (phi, succ_new_exit_block);
add_phi_arg (nphi, res_c, pred_new_exit_block, UNKNOWN_LOCATION);
add_phi_arg (phi, res_y, succ_new_exit_block, UNKNOWN_LOCATION);
}
else
res_c = PHI_ARG_DEF_FROM_EDGE (phi, exit);
if (virtual_operand_p (res_z))
continue;
......@@ -1724,7 +1736,9 @@ transform_to_exit_first_loop_alt (struct loop *loop,
gimple *reduc_phi = SSA_NAME_DEF_STMT (res_c);
struct reduction_info *red = reduction_phi (reduction_list, reduc_phi);
if (red != NULL)
red->keep_res = nphi;
red->keep_res = (nphi != NULL
? nphi
: phi);
}
/* We're going to cancel the loop at the end of gen_parallel_loop, but until
......
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