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:
parent
8a492e2cbf
commit
c0493b13fb
3 changed files with 54 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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++)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue