diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2007-02-06 22:49:49 +0100 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2007-02-06 21:49:49 +0000 |
commit | 89f8f30f3565328a2805adafd22e05219b56d562 (patch) | |
tree | 0b2228e5e39d0218784f7e5f8304e2e94d0d96c2 /gcc/doc | |
parent | ca20820ef1e80ac23138cbc3beb5ba895b59a1e3 (diff) | |
download | gcc-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/doc')
-rw-r--r-- | gcc/doc/loop.texi | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/gcc/doc/loop.texi b/gcc/doc/loop.texi index e486b0c..3f0076e 100644 --- a/gcc/doc/loop.texi +++ b/gcc/doc/loop.texi @@ -48,11 +48,17 @@ a single header, or if there is a branching in the middle of the loop. The representation of loops in GCC however allows only loops with a single latch. During loop analysis, headers of such loops are split and forwarder blocks are created in order to disambiguate their structures. -A heuristic based on profile information is used to determine whether -the latches correspond to sub-loops or to control flow in a single loop. -This means that the analysis sometimes changes the CFG, and if you run -it in the middle of an optimization pass, you must be able to deal with -the new blocks. +Heuristic based on profile information and structure of the induction +variables in the loops is used to determine whether the latches +correspond to sub-loops or to control flow in a single loop. This means +that the analysis sometimes changes the CFG, and if you run it in the +middle of an optimization pass, you must be able to deal with the new +blocks. You may avoid CFG changes by passing +@code{LOOPS_MAY_HAVE_MULTIPLE_LATCHES} flag to the loop discovery, +note however that most other loop manipulation functions will not work +correctly for loops with multiple latch edges (the functions that only +query membership of blocks to loops and subloop relationships, or +enumerate and test loop exits, can be expected to work). Body of the loop is the set of blocks that are dominated by its header, and reachable from its latch against the direction of edges in CFG. The @@ -96,6 +102,13 @@ bitmask. These flags specify what other properties of the loop structures should be calculated/enforced and preserved later: @itemize +@item @code{LOOPS_MAY_HAVE_MULTIPLE_LATCHES}: If this flag is set, no +changes to CFG will be performed in the loop analysis, in particular, +loops with multiple latch edges will not be disambiguated. If a loop +has multiple latches, its latch block is set to NULL. Most of +the loop manipulation functions will not work for loops in this shape. +No other flags that require CFG changes can be passed to +loop_optimizer_init. @item @code{LOOPS_HAVE_PREHEADERS}: Forwarder blocks are created in such a way that each loop has only one entry edge, and additionally, the source block of this entry edge has only one successor. This creates a |