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
This commit is contained in:
Zdenek Dvorak 2006-11-12 19:20:03 +01:00 committed by Zdenek Dvorak
parent 8a492e2cbf
commit c0493b13fb
3 changed files with 54 additions and 0 deletions

View file

@ -1,3 +1,12 @@
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>
* except.c (sjlj_emit_function_enter): Remove unused variable.

View file

@ -770,6 +770,40 @@ update_single_exits_after_duplication (basic_block *bbs, unsigned nbbs,
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
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
@ -950,6 +984,15 @@ duplicate_loop_to_header_edge (struct loop *loop, edge e, struct loops *loops,
place_after);
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)
for (i = 0; i < n; i++)
{

View file

@ -940,8 +940,10 @@ tree_unroll_loop (struct loops *loops, struct loop *loop, unsigned factor,
tree_block_label (rest));
bsi_insert_after (&bsi, exit_if, BSI_NEW_STMT);
#ifdef ENABLE_CHECKING
verify_flow_info ();
verify_dominators (CDI_DOMINATORS);
verify_loop_structure (loops);
verify_loop_closed_ssa ();
#endif
}