aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop-init.c
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2007-02-06 22:49:49 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2007-02-06 21:49:49 +0000
commit89f8f30f3565328a2805adafd22e05219b56d562 (patch)
tree0b2228e5e39d0218784f7e5f8304e2e94d0d96c2 /gcc/loop-init.c
parentca20820ef1e80ac23138cbc3beb5ba895b59a1e3 (diff)
downloadgcc-89f8f30f3565328a2805adafd22e05219b56d562.zip
gcc-89f8f30f3565328a2805adafd22e05219b56d562.tar.gz
gcc-89f8f30f3565328a2805adafd22e05219b56d562.tar.bz2
loop.texi: Document possibility not to perform disambiguation of loops with multiple latches.
* doc/loop.texi: Document possibility not to perform disambiguation of loops with multiple latches. * cfgloopmanip.c (alp_enum_p): Removed. (add_loop): Handle subloops. Use get_loop_body_with_size. (create_preheader): Do not allow ENTRY_BLOCK_PTR to be preheader. * cfghooks.c (redirect_edge_and_branch_force): Set dominator for the new forwarder block. (make_forwarder_block): Only call new_bb_cbk if it is not NULL. Handle the case latch is NULL. * tree-ssa-dom.c (tree_ssa_dominator_optimize): Avoid cfg modifications when marking loop exits. * ifcvt.c (if_convert): Ditto. Mark loop exits even if cfg cannot be modified. * loop-init.c (loop_optimizer_init): Do not modify cfg. Call disambiguate_loops_with_multiple_latches. * tree-cfgcleanup.c (cleanup_tree_cfg_loop): Calculate dominators before fix_loop_structure. * cfgloop.c: Include pointer-set.h and output.h. (canonicalize_loop_headers, HEADER_BLOCK, LATCH_EDGE, update_latch_info, mfb_keep_just, mfb_keep_nonlatch): Removed. (get_loop_latch_edges, find_subloop_latch_edge_by_profile, find_subloop_latch_edge_by_ivs, find_subloop_latch_edge, mfb_redirect_edges_in_set, form_subloop, merge_latch_edges, disambiguate_multiple_latches, get_loop_body_with_size, disambiguate_loops_with_multiple_latches): New functions. (flow_loop_dump): Dump multiple latch edges. (flow_loop_nodes_find): Handle loops with multiple latches. (flow_loops_find): Ditto. Do not call canonicalize_loop_headers. (glb_enum_p): Modified. (get_loop_body): Use get_loop_body_with_size. * cfgloop.h (LOOPS_HAVE_RECORDED_EXITS): New flag. (AVOID_CFG_MODIFICATIONS): New constant. (disambiguate_loops_with_multiple_latches, add_loop, get_loop_body_with_size): Declare. * Makefile.in (cfgloop.o): Add pointer-set.h and output.h. * gcc.dg/tree-ssa/loop-25.c: New test. From-SVN: r121670
Diffstat (limited to 'gcc/loop-init.c')
-rw-r--r--gcc/loop-init.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/gcc/loop-init.c b/gcc/loop-init.c
index 2c7f37a..3e6d342 100644
--- a/gcc/loop-init.c
+++ b/gcc/loop-init.c
@@ -40,22 +40,11 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
void
loop_optimizer_init (unsigned flags)
{
- edge e;
- edge_iterator ei;
struct loops *loops;
gcc_assert (!current_loops);
loops = XCNEW (struct loops);
- /* Avoid annoying special cases of edges going to exit
- block. */
-
- for (ei = ei_start (EXIT_BLOCK_PTR->preds); (e = ei_safe_edge (ei)); )
- if ((e->flags & EDGE_FALLTHRU) && !single_succ_p (e->src))
- split_edge (e);
- else
- ei_next (&ei);
-
/* Find the loops. */
flow_loops_find (loops);
@@ -69,6 +58,19 @@ loop_optimizer_init (unsigned flags)
return;
}
+ if (flags & LOOPS_MAY_HAVE_MULTIPLE_LATCHES)
+ {
+ /* If the loops may have multiple latches, we cannot canonicalize
+ them further (and most of the loop manipulation functions will
+ not work). However, we avoid modifying cfg, which some
+ passes may want. */
+ gcc_assert ((flags & ~(LOOPS_MAY_HAVE_MULTIPLE_LATCHES
+ | LOOPS_HAVE_RECORDED_EXITS)) == 0);
+ current_loops->state = LOOPS_MAY_HAVE_MULTIPLE_LATCHES;
+ }
+ else
+ disambiguate_loops_with_multiple_latches ();
+
/* Create pre-headers. */
if (flags & LOOPS_HAVE_PREHEADERS)
create_preheaders (CP_SIMPLE_PREHEADERS);