[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