[patch] Clean up fix_loop_placement and its usage
Zdenek Dvorak
rakdver@atrey.karlin.mff.cuni.cz
Sun Jan 14 20:10:00 GMT 2007
Hello,
this patch cleans up the internals of fix_loop_placement a bit (makes it
use get_loop_exit_edges, instead of traversing cfg by itself), and
removes its redundant usage in loop-unswitch.c:unswitch_loop.
Bootstrapped & regtested on i686, commited.
Zdenek
Index: ChangeLog
===================================================================
*** ChangeLog (revision 120780)
--- ChangeLog (working copy)
***************
*** 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.
Index: loop-unswitch.c
===================================================================
*** loop-unswitch.c (revision 120780)
--- loop-unswitch.c (working copy)
*************** unswitch_loop (struct loop *loop, basic_
*** 458,468 ****
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));
--- 458,463 ----
Index: cfgloopmanip.c
===================================================================
*** cfgloopmanip.c (revision 120780)
--- cfgloopmanip.c (working copy)
*************** fix_bb_placement (basic_block bb)
*** 120,125 ****
--- 120,165 ----
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
*************** unloop (struct loop *loop, bool *irred_i
*** 563,604 ****
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
--- 603,608 ----
Index: cfgloop.h
===================================================================
*** cfgloop.h (revision 120780)
--- cfgloop.h (working copy)
*************** extern void remove_bb_from_loops (basic_
*** 242,249 ****
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
--- 242,247 ----
More information about the Gcc-patches
mailing list