Commit c0493b13 by Zdenek Dvorak Committed by Zdenek Dvorak

cfgloopmanip.c (update_single_exit_for_duplicated_loop, [...]): New functions.

	* cfgloopmanip.c (update_single_exit_for_duplicated_loop,
	update_single_exit_for_duplicated_loops): New functions.
	(duplicate_loop_to_header_edge): Use
	update_single_exit_for_duplicated_loops.
	* tree-ssa-loop-manip.c (tree_unroll_loop): Call verification
	functions only with ENABLE_CHECKING.

From-SVN: r118726
parent 8a492e2c
2006-11-12 Zdenek Dvorak <dvorakz@suse.cz>
* cfgloopmanip.c (update_single_exit_for_duplicated_loop,
update_single_exit_for_duplicated_loops): New functions.
(duplicate_loop_to_header_edge): Use
update_single_exit_for_duplicated_loops.
* tree-ssa-loop-manip.c (tree_unroll_loop): Call verification
functions only with ENABLE_CHECKING.
2006-11-12 Andreas Schwab <schwab@suse.de> 2006-11-12 Andreas Schwab <schwab@suse.de>
* except.c (sjlj_emit_function_enter): Remove unused variable. * except.c (sjlj_emit_function_enter): Remove unused variable.
......
...@@ -770,6 +770,40 @@ update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs, ...@@ -770,6 +770,40 @@ update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs,
bbs[i]->flags &= ~BB_DUPLICATED; bbs[i]->flags &= ~BB_DUPLICATED;
} }
/* Updates single exit information for the copy of LOOP. */
static void
update_single_exit_for_duplicated_loop (struct loop *loop)
{
struct loop *copy = loop->copy;
basic_block src, dest;
edge exit = loop->single_exit;
if (!exit)
return;
src = get_bb_copy (exit->src);
dest = exit->dest;
if (dest->flags & BB_DUPLICATED)
dest = get_bb_copy (dest);
exit = find_edge (src, dest);
gcc_assert (exit != NULL);
copy->single_exit = exit;
}
/* Updates single exit information for copies of ORIG_LOOPS and their subloops.
N is the number of the loops in the ORIG_LOOPS array. */
static void
update_single_exit_for_duplicated_loops (struct loop *orig_loops[], unsigned n)
{
unsigned i;
for (i = 0; i < n; i++)
update_single_exit_for_duplicated_loop (orig_loops[i]);
}
/* Duplicates body of LOOP to given edge E NDUPL times. Takes care of updating /* Duplicates body of LOOP to given edge E NDUPL times. Takes care of updating
LOOPS structure and dominators. E's destination must be LOOP header for LOOPS structure and dominators. E's destination must be LOOP header for
this to work, i.e. it must be entry or latch edge of this loop; these are this to work, i.e. it must be entry or latch edge of this loop; these are
...@@ -950,6 +984,15 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops, ...@@ -950,6 +984,15 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
place_after); place_after);
place_after = new_spec_edges[SE_LATCH]->src; place_after = new_spec_edges[SE_LATCH]->src;
if (loops->state & LOOPS_HAVE_MARKED_SINGLE_EXITS)
{
for (i = 0; i < n; i++)
bbs[i]->flags |= BB_DUPLICATED;
update_single_exit_for_duplicated_loops (orig_loops, n_orig_loops);
for (i = 0; i < n; i++)
bbs[i]->flags &= ~BB_DUPLICATED;
}
if (flags & DLTHE_RECORD_COPY_NUMBER) if (flags & DLTHE_RECORD_COPY_NUMBER)
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
......
...@@ -940,8 +940,10 @@ tree_unroll_loop (struct loops *loops, struct loop *loop, unsigned factor, ...@@ -940,8 +940,10 @@ tree_unroll_loop (struct loops *loops, struct loop *loop, unsigned factor,
tree_block_label (rest)); tree_block_label (rest));
bsi_insert_after (&bsi, exit_if, BSI_NEW_STMT); bsi_insert_after (&bsi, exit_if, BSI_NEW_STMT);
#ifdef ENABLE_CHECKING
verify_flow_info (); verify_flow_info ();
verify_dominators (CDI_DOMINATORS); verify_dominators (CDI_DOMINATORS);
verify_loop_structure (loops); verify_loop_structure (loops);
verify_loop_closed_ssa (); verify_loop_closed_ssa ();
#endif
} }
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