mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-11-24 11:24:05 +08:00
loop-unswitch.c (unswitch_loop): Do not call fix_loop_placement.
* loop-unswitch.c (unswitch_loop): Do not call fix_loop_placement. * cfgloopmanip.c (fix_loop_placement): Made static. Use get_loop_exit_edges. Changed return type to bool. * cfgloop.h (fix_loop_placement): Declaration removed. From-SVN: r120782
This commit is contained in:
parent
cd9ae11c1a
commit
b4c1c7e3bd
@ -1,3 +1,10 @@
|
||||
2007-01-14 Zdenek Dvorak <dvorakz@suse.cz>
|
||||
|
||||
* loop-unswitch.c (unswitch_loop): Do not call fix_loop_placement.
|
||||
* cfgloopmanip.c (fix_loop_placement): Made static. Use
|
||||
get_loop_exit_edges. Changed return type to bool.
|
||||
* cfgloop.h (fix_loop_placement): Declaration removed.
|
||||
|
||||
2007-01-14 Dorit Nuzman <dorit@il.ibm.com>
|
||||
|
||||
* param.h (MIN_VECT_LOOP_BOUND): New.
|
||||
|
@ -242,8 +242,6 @@ extern void remove_bb_from_loops (basic_block);
|
||||
extern void cancel_loop_tree (struct loop *);
|
||||
extern void delete_loop (struct loop *);
|
||||
|
||||
extern int fix_loop_placement (struct loop *);
|
||||
|
||||
enum
|
||||
{
|
||||
CP_SIMPLE_PREHEADERS = 1
|
||||
|
@ -120,6 +120,46 @@ fix_bb_placement (basic_block bb)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Fix placement of LOOP inside loop tree, i.e. find the innermost superloop
|
||||
of LOOP to that leads at least one exit edge of LOOP, and set it
|
||||
as the immediate superloop of LOOP. Return true if the immediate superloop
|
||||
of LOOP changed. */
|
||||
|
||||
static bool
|
||||
fix_loop_placement (struct loop *loop)
|
||||
{
|
||||
unsigned i;
|
||||
edge e;
|
||||
VEC (edge, heap) *exits = get_loop_exit_edges (loop);
|
||||
struct loop *father = current_loops->tree_root, *act;
|
||||
bool ret = false;
|
||||
|
||||
for (i = 0; VEC_iterate (edge, exits, i, e); i++)
|
||||
{
|
||||
act = find_common_loop (loop, e->dest->loop_father);
|
||||
if (flow_loop_nested_p (father, act))
|
||||
father = act;
|
||||
}
|
||||
|
||||
if (father != loop->outer)
|
||||
{
|
||||
for (act = loop->outer; act != father; act = act->outer)
|
||||
act->num_nodes -= loop->num_nodes;
|
||||
flow_loop_tree_node_remove (loop);
|
||||
flow_loop_tree_node_add (father, loop);
|
||||
|
||||
/* The exit edges of LOOP no longer exits its original immediate
|
||||
superloops; remove them from the appropriate exit lists. */
|
||||
for (i = 0; VEC_iterate (edge, exits, i, e); i++)
|
||||
rescan_loop_exit (e, false, false);
|
||||
|
||||
ret = true;
|
||||
}
|
||||
|
||||
VEC_free (edge, heap, exits);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Fix placements of basic blocks inside loop hierarchy stored in loops; i.e.
|
||||
enforce condition condition stated in description of fix_bb_placement. We
|
||||
start from basic block FROM that had some of its successors removed, so that
|
||||
@ -563,42 +603,6 @@ unloop (struct loop *loop, bool *irred_invalidated)
|
||||
fix_bb_placements (latch, &dummy);
|
||||
}
|
||||
|
||||
/* Fix placement of LOOP inside loop tree, i.e. find the innermost superloop
|
||||
FATHER of LOOP such that all of the edges coming out of LOOP belong to
|
||||
FATHER, and set it as outer loop of LOOP. Return true if placement of
|
||||
LOOP changed. */
|
||||
|
||||
int
|
||||
fix_loop_placement (struct loop *loop)
|
||||
{
|
||||
basic_block *body;
|
||||
unsigned i;
|
||||
edge e;
|
||||
edge_iterator ei;
|
||||
struct loop *father = loop->pred[0], *act;
|
||||
|
||||
body = get_loop_body (loop);
|
||||
for (i = 0; i < loop->num_nodes; i++)
|
||||
FOR_EACH_EDGE (e, ei, body[i]->succs)
|
||||
if (!flow_bb_inside_loop_p (loop, e->dest))
|
||||
{
|
||||
act = find_common_loop (loop, e->dest->loop_father);
|
||||
if (flow_loop_nested_p (father, act))
|
||||
father = act;
|
||||
}
|
||||
free (body);
|
||||
|
||||
if (father != loop->outer)
|
||||
{
|
||||
for (act = loop->outer; act != father; act = act->outer)
|
||||
act->num_nodes -= loop->num_nodes;
|
||||
flow_loop_tree_node_remove (loop);
|
||||
flow_loop_tree_node_add (father, loop);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Fix placement of superloops of LOOP inside loop tree, i.e. ensure that
|
||||
condition stated in description of fix_loop_placement holds for them.
|
||||
It is used in case when we removed some edges coming out of LOOP, which
|
||||
|
@ -458,11 +458,6 @@ unswitch_loop (struct loop *loop, basic_block unswitch_on, rtx cond, rtx cinsn)
|
||||
remove_path (true_edge);
|
||||
remove_path (false_edge);
|
||||
|
||||
/* One of created loops do not have to be subloop of the outer loop now,
|
||||
so fix its placement in loop data structure. */
|
||||
fix_loop_placement (loop);
|
||||
fix_loop_placement (nloop);
|
||||
|
||||
/* Preserve the simple loop preheaders. */
|
||||
split_edge (loop_preheader_edge (loop));
|
||||
split_edge (loop_preheader_edge (nloop));
|
||||
|
Loading…
Reference in New Issue
Block a user