xref: /openbsd-src/gnu/usr.bin/gcc/gcc/cfgloop.c (revision c87b03e512fc05ed6e0222f6fb0ae86264b1d05b)
1*c87b03e5Sespie /* Natural loop discovery code for GNU compiler.
2*c87b03e5Sespie    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3*c87b03e5Sespie 
4*c87b03e5Sespie This file is part of GCC.
5*c87b03e5Sespie 
6*c87b03e5Sespie GCC is free software; you can redistribute it and/or modify it under
7*c87b03e5Sespie the terms of the GNU General Public License as published by the Free
8*c87b03e5Sespie Software Foundation; either version 2, or (at your option) any later
9*c87b03e5Sespie version.
10*c87b03e5Sespie 
11*c87b03e5Sespie GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*c87b03e5Sespie WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*c87b03e5Sespie FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*c87b03e5Sespie for more details.
15*c87b03e5Sespie 
16*c87b03e5Sespie You should have received a copy of the GNU General Public License
17*c87b03e5Sespie along with GCC; see the file COPYING.  If not, write to the Free
18*c87b03e5Sespie Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19*c87b03e5Sespie 02111-1307, USA.  */
20*c87b03e5Sespie 
21*c87b03e5Sespie #include "config.h"
22*c87b03e5Sespie #include "system.h"
23*c87b03e5Sespie #include "rtl.h"
24*c87b03e5Sespie #include "hard-reg-set.h"
25*c87b03e5Sespie #include "basic-block.h"
26*c87b03e5Sespie #include "toplev.h"
27*c87b03e5Sespie 
28*c87b03e5Sespie /* Ratio of frequencies of edges so that one of more latch edges is
29*c87b03e5Sespie    considered to belong to inner loop with same header.  */
30*c87b03e5Sespie #define HEAVY_EDGE_RATIO 8
31*c87b03e5Sespie 
32*c87b03e5Sespie static void flow_loops_cfg_dump		PARAMS ((const struct loops *,
33*c87b03e5Sespie 						 FILE *));
34*c87b03e5Sespie static void flow_loop_entry_edges_find	PARAMS ((struct loop *));
35*c87b03e5Sespie static void flow_loop_exit_edges_find	PARAMS ((struct loop *));
36*c87b03e5Sespie static int flow_loop_nodes_find		PARAMS ((basic_block, struct loop *));
37*c87b03e5Sespie static void flow_loop_pre_header_scan	PARAMS ((struct loop *));
38*c87b03e5Sespie static basic_block flow_loop_pre_header_find PARAMS ((basic_block,
39*c87b03e5Sespie 						      dominance_info));
40*c87b03e5Sespie static int flow_loop_level_compute	PARAMS ((struct loop *));
41*c87b03e5Sespie static int flow_loops_level_compute	PARAMS ((struct loops *));
42*c87b03e5Sespie static basic_block make_forwarder_block PARAMS ((basic_block, int, int,
43*c87b03e5Sespie 						 edge, int));
44*c87b03e5Sespie static void canonicalize_loop_headers   PARAMS ((void));
45*c87b03e5Sespie static bool glb_enum_p PARAMS ((basic_block, void *));
46*c87b03e5Sespie static void redirect_edge_with_latch_update PARAMS ((edge, basic_block));
47*c87b03e5Sespie static void flow_loop_free PARAMS ((struct loop *));
48*c87b03e5Sespie 
49*c87b03e5Sespie /* Dump loop related CFG information.  */
50*c87b03e5Sespie 
51*c87b03e5Sespie static void
flow_loops_cfg_dump(loops,file)52*c87b03e5Sespie flow_loops_cfg_dump (loops, file)
53*c87b03e5Sespie      const struct loops *loops;
54*c87b03e5Sespie      FILE *file;
55*c87b03e5Sespie {
56*c87b03e5Sespie   int i;
57*c87b03e5Sespie   basic_block bb;
58*c87b03e5Sespie 
59*c87b03e5Sespie   if (! loops->num || ! file || ! loops->cfg.dom)
60*c87b03e5Sespie     return;
61*c87b03e5Sespie 
62*c87b03e5Sespie   FOR_EACH_BB (bb)
63*c87b03e5Sespie     {
64*c87b03e5Sespie       edge succ;
65*c87b03e5Sespie 
66*c87b03e5Sespie       fprintf (file, ";; %d succs { ", bb->index);
67*c87b03e5Sespie       for (succ = bb->succ; succ; succ = succ->succ_next)
68*c87b03e5Sespie 	fprintf (file, "%d ", succ->dest->index);
69*c87b03e5Sespie       fprintf (file, "}\n");
70*c87b03e5Sespie     }
71*c87b03e5Sespie 
72*c87b03e5Sespie   /* Dump the DFS node order.  */
73*c87b03e5Sespie   if (loops->cfg.dfs_order)
74*c87b03e5Sespie     {
75*c87b03e5Sespie       fputs (";; DFS order: ", file);
76*c87b03e5Sespie       for (i = 0; i < n_basic_blocks; i++)
77*c87b03e5Sespie 	fprintf (file, "%d ", loops->cfg.dfs_order[i]);
78*c87b03e5Sespie 
79*c87b03e5Sespie       fputs ("\n", file);
80*c87b03e5Sespie     }
81*c87b03e5Sespie 
82*c87b03e5Sespie   /* Dump the reverse completion node order.  */
83*c87b03e5Sespie   if (loops->cfg.rc_order)
84*c87b03e5Sespie     {
85*c87b03e5Sespie       fputs (";; RC order: ", file);
86*c87b03e5Sespie       for (i = 0; i < n_basic_blocks; i++)
87*c87b03e5Sespie 	fprintf (file, "%d ", loops->cfg.rc_order[i]);
88*c87b03e5Sespie 
89*c87b03e5Sespie       fputs ("\n", file);
90*c87b03e5Sespie     }
91*c87b03e5Sespie }
92*c87b03e5Sespie 
93*c87b03e5Sespie /* Return nonzero if the nodes of LOOP are a subset of OUTER.  */
94*c87b03e5Sespie 
95*c87b03e5Sespie bool
flow_loop_nested_p(outer,loop)96*c87b03e5Sespie flow_loop_nested_p (outer, loop)
97*c87b03e5Sespie      const struct loop *outer;
98*c87b03e5Sespie      const struct loop *loop;
99*c87b03e5Sespie {
100*c87b03e5Sespie   return loop->depth > outer->depth
101*c87b03e5Sespie 	 && loop->pred[outer->depth] == outer;
102*c87b03e5Sespie }
103*c87b03e5Sespie 
104*c87b03e5Sespie /* Dump the loop information specified by LOOP to the stream FILE
105*c87b03e5Sespie    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
106*c87b03e5Sespie 
107*c87b03e5Sespie void
flow_loop_dump(loop,file,loop_dump_aux,verbose)108*c87b03e5Sespie flow_loop_dump (loop, file, loop_dump_aux, verbose)
109*c87b03e5Sespie      const struct loop *loop;
110*c87b03e5Sespie      FILE *file;
111*c87b03e5Sespie      void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
112*c87b03e5Sespie      int verbose;
113*c87b03e5Sespie {
114*c87b03e5Sespie   basic_block *bbs;
115*c87b03e5Sespie   int i;
116*c87b03e5Sespie 
117*c87b03e5Sespie   if (! loop || ! loop->header)
118*c87b03e5Sespie     return;
119*c87b03e5Sespie 
120*c87b03e5Sespie   fprintf (file, ";;\n;; Loop %d:%s\n", loop->num,
121*c87b03e5Sespie 	     loop->invalid ? " invalid" : "");
122*c87b03e5Sespie 
123*c87b03e5Sespie   fprintf (file, ";;  header %d, latch %d, pre-header %d\n",
124*c87b03e5Sespie 	   loop->header->index, loop->latch->index,
125*c87b03e5Sespie 	   loop->pre_header ? loop->pre_header->index : -1);
126*c87b03e5Sespie   fprintf (file, ";;  depth %d, level %d, outer %ld\n",
127*c87b03e5Sespie 	   loop->depth, loop->level,
128*c87b03e5Sespie 	   (long) (loop->outer ? loop->outer->num : -1));
129*c87b03e5Sespie 
130*c87b03e5Sespie   if (loop->pre_header_edges)
131*c87b03e5Sespie     flow_edge_list_print (";;  pre-header edges", loop->pre_header_edges,
132*c87b03e5Sespie 			  loop->num_pre_header_edges, file);
133*c87b03e5Sespie 
134*c87b03e5Sespie   flow_edge_list_print (";;  entry edges", loop->entry_edges,
135*c87b03e5Sespie 			loop->num_entries, file);
136*c87b03e5Sespie   fprintf (file, ";;  nodes:");
137*c87b03e5Sespie   bbs = get_loop_body (loop);
138*c87b03e5Sespie   for (i = 0; i < loop->num_nodes; i++)
139*c87b03e5Sespie     fprintf (file, " %d", bbs[i]->index);
140*c87b03e5Sespie   free (bbs);
141*c87b03e5Sespie   fprintf (file, "\n");
142*c87b03e5Sespie   flow_edge_list_print (";;  exit edges", loop->exit_edges,
143*c87b03e5Sespie 			loop->num_exits, file);
144*c87b03e5Sespie 
145*c87b03e5Sespie   if (loop_dump_aux)
146*c87b03e5Sespie     loop_dump_aux (loop, file, verbose);
147*c87b03e5Sespie }
148*c87b03e5Sespie 
149*c87b03e5Sespie /* Dump the loop information specified by LOOPS to the stream FILE,
150*c87b03e5Sespie    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
151*c87b03e5Sespie 
152*c87b03e5Sespie void
flow_loops_dump(loops,file,loop_dump_aux,verbose)153*c87b03e5Sespie flow_loops_dump (loops, file, loop_dump_aux, verbose)
154*c87b03e5Sespie      const struct loops *loops;
155*c87b03e5Sespie      FILE *file;
156*c87b03e5Sespie      void (*loop_dump_aux) PARAMS((const struct loop *, FILE *, int));
157*c87b03e5Sespie      int verbose;
158*c87b03e5Sespie {
159*c87b03e5Sespie   int i;
160*c87b03e5Sespie   int num_loops;
161*c87b03e5Sespie 
162*c87b03e5Sespie   num_loops = loops->num;
163*c87b03e5Sespie   if (! num_loops || ! file)
164*c87b03e5Sespie     return;
165*c87b03e5Sespie 
166*c87b03e5Sespie   fprintf (file, ";; %d loops found, %d levels\n",
167*c87b03e5Sespie 	   num_loops, loops->levels);
168*c87b03e5Sespie 
169*c87b03e5Sespie   for (i = 0; i < num_loops; i++)
170*c87b03e5Sespie     {
171*c87b03e5Sespie       struct loop *loop = loops->parray[i];
172*c87b03e5Sespie 
173*c87b03e5Sespie       if (!loop)
174*c87b03e5Sespie 	continue;
175*c87b03e5Sespie 
176*c87b03e5Sespie       flow_loop_dump (loop, file, loop_dump_aux, verbose);
177*c87b03e5Sespie     }
178*c87b03e5Sespie 
179*c87b03e5Sespie   if (verbose)
180*c87b03e5Sespie     flow_loops_cfg_dump (loops, file);
181*c87b03e5Sespie }
182*c87b03e5Sespie 
183*c87b03e5Sespie /* Free data allocated for LOOP.  */
184*c87b03e5Sespie static void
flow_loop_free(loop)185*c87b03e5Sespie flow_loop_free (loop)
186*c87b03e5Sespie      struct loop *loop;
187*c87b03e5Sespie {
188*c87b03e5Sespie   if (loop->pre_header_edges)
189*c87b03e5Sespie     free (loop->pre_header_edges);
190*c87b03e5Sespie   if (loop->entry_edges)
191*c87b03e5Sespie     free (loop->entry_edges);
192*c87b03e5Sespie   if (loop->exit_edges)
193*c87b03e5Sespie     free (loop->exit_edges);
194*c87b03e5Sespie   if (loop->pred)
195*c87b03e5Sespie     free (loop->pred);
196*c87b03e5Sespie   free (loop);
197*c87b03e5Sespie }
198*c87b03e5Sespie 
199*c87b03e5Sespie /* Free all the memory allocated for LOOPS.  */
200*c87b03e5Sespie 
201*c87b03e5Sespie void
flow_loops_free(loops)202*c87b03e5Sespie flow_loops_free (loops)
203*c87b03e5Sespie      struct loops *loops;
204*c87b03e5Sespie {
205*c87b03e5Sespie   if (loops->parray)
206*c87b03e5Sespie     {
207*c87b03e5Sespie       int i;
208*c87b03e5Sespie 
209*c87b03e5Sespie       if (! loops->num)
210*c87b03e5Sespie 	abort ();
211*c87b03e5Sespie 
212*c87b03e5Sespie       /* Free the loop descriptors.  */
213*c87b03e5Sespie       for (i = 0; i < loops->num; i++)
214*c87b03e5Sespie 	{
215*c87b03e5Sespie 	  struct loop *loop = loops->parray[i];
216*c87b03e5Sespie 
217*c87b03e5Sespie 	  if (!loop)
218*c87b03e5Sespie 	    continue;
219*c87b03e5Sespie 
220*c87b03e5Sespie 	  flow_loop_free (loop);
221*c87b03e5Sespie 	}
222*c87b03e5Sespie 
223*c87b03e5Sespie       free (loops->parray);
224*c87b03e5Sespie       loops->parray = NULL;
225*c87b03e5Sespie 
226*c87b03e5Sespie       if (loops->cfg.dom)
227*c87b03e5Sespie 	free_dominance_info (loops->cfg.dom);
228*c87b03e5Sespie 
229*c87b03e5Sespie       if (loops->cfg.dfs_order)
230*c87b03e5Sespie 	free (loops->cfg.dfs_order);
231*c87b03e5Sespie       if (loops->cfg.rc_order)
232*c87b03e5Sespie 	free (loops->cfg.rc_order);
233*c87b03e5Sespie 
234*c87b03e5Sespie     }
235*c87b03e5Sespie }
236*c87b03e5Sespie 
237*c87b03e5Sespie /* Find the entry edges into the LOOP.  */
238*c87b03e5Sespie 
239*c87b03e5Sespie static void
flow_loop_entry_edges_find(loop)240*c87b03e5Sespie flow_loop_entry_edges_find (loop)
241*c87b03e5Sespie      struct loop *loop;
242*c87b03e5Sespie {
243*c87b03e5Sespie   edge e;
244*c87b03e5Sespie   int num_entries;
245*c87b03e5Sespie 
246*c87b03e5Sespie   num_entries = 0;
247*c87b03e5Sespie   for (e = loop->header->pred; e; e = e->pred_next)
248*c87b03e5Sespie     {
249*c87b03e5Sespie       if (flow_loop_outside_edge_p (loop, e))
250*c87b03e5Sespie 	num_entries++;
251*c87b03e5Sespie     }
252*c87b03e5Sespie 
253*c87b03e5Sespie   if (! num_entries)
254*c87b03e5Sespie     abort ();
255*c87b03e5Sespie 
256*c87b03e5Sespie   loop->entry_edges = (edge *) xmalloc (num_entries * sizeof (edge *));
257*c87b03e5Sespie 
258*c87b03e5Sespie   num_entries = 0;
259*c87b03e5Sespie   for (e = loop->header->pred; e; e = e->pred_next)
260*c87b03e5Sespie     {
261*c87b03e5Sespie       if (flow_loop_outside_edge_p (loop, e))
262*c87b03e5Sespie 	loop->entry_edges[num_entries++] = e;
263*c87b03e5Sespie     }
264*c87b03e5Sespie 
265*c87b03e5Sespie   loop->num_entries = num_entries;
266*c87b03e5Sespie }
267*c87b03e5Sespie 
268*c87b03e5Sespie /* Find the exit edges from the LOOP.  */
269*c87b03e5Sespie 
270*c87b03e5Sespie static void
flow_loop_exit_edges_find(loop)271*c87b03e5Sespie flow_loop_exit_edges_find (loop)
272*c87b03e5Sespie      struct loop *loop;
273*c87b03e5Sespie {
274*c87b03e5Sespie   edge e;
275*c87b03e5Sespie   basic_block node, *bbs;
276*c87b03e5Sespie   int num_exits, i;
277*c87b03e5Sespie 
278*c87b03e5Sespie   loop->exit_edges = NULL;
279*c87b03e5Sespie   loop->num_exits = 0;
280*c87b03e5Sespie 
281*c87b03e5Sespie   /* Check all nodes within the loop to see if there are any
282*c87b03e5Sespie      successors not in the loop.  Note that a node may have multiple
283*c87b03e5Sespie      exiting edges.  */
284*c87b03e5Sespie   num_exits = 0;
285*c87b03e5Sespie   bbs = get_loop_body (loop);
286*c87b03e5Sespie   for (i = 0; i < loop->num_nodes; i++)
287*c87b03e5Sespie     {
288*c87b03e5Sespie       node = bbs[i];
289*c87b03e5Sespie       for (e = node->succ; e; e = e->succ_next)
290*c87b03e5Sespie 	{
291*c87b03e5Sespie 	  basic_block dest = e->dest;
292*c87b03e5Sespie 
293*c87b03e5Sespie 	  if (!flow_bb_inside_loop_p (loop, dest))
294*c87b03e5Sespie 	    num_exits++;
295*c87b03e5Sespie 	}
296*c87b03e5Sespie     }
297*c87b03e5Sespie 
298*c87b03e5Sespie   if (! num_exits)
299*c87b03e5Sespie     {
300*c87b03e5Sespie       free (bbs);
301*c87b03e5Sespie       return;
302*c87b03e5Sespie     }
303*c87b03e5Sespie 
304*c87b03e5Sespie   loop->exit_edges = (edge *) xmalloc (num_exits * sizeof (edge *));
305*c87b03e5Sespie 
306*c87b03e5Sespie   /* Store all exiting edges into an array.  */
307*c87b03e5Sespie   num_exits = 0;
308*c87b03e5Sespie   for (i = 0; i < loop->num_nodes; i++)
309*c87b03e5Sespie     {
310*c87b03e5Sespie       node = bbs[i];
311*c87b03e5Sespie       for (e = node->succ; e; e = e->succ_next)
312*c87b03e5Sespie 	{
313*c87b03e5Sespie 	  basic_block dest = e->dest;
314*c87b03e5Sespie 
315*c87b03e5Sespie 	  if (!flow_bb_inside_loop_p (loop, dest))
316*c87b03e5Sespie 	    loop->exit_edges[num_exits++] = e;
317*c87b03e5Sespie       }
318*c87b03e5Sespie     }
319*c87b03e5Sespie   free (bbs);
320*c87b03e5Sespie   loop->num_exits = num_exits;
321*c87b03e5Sespie }
322*c87b03e5Sespie 
323*c87b03e5Sespie /* Find the nodes contained within the LOOP with header HEADER.
324*c87b03e5Sespie    Return the number of nodes within the loop.  */
325*c87b03e5Sespie 
326*c87b03e5Sespie static int
flow_loop_nodes_find(header,loop)327*c87b03e5Sespie flow_loop_nodes_find (header, loop)
328*c87b03e5Sespie      basic_block header;
329*c87b03e5Sespie      struct loop *loop;
330*c87b03e5Sespie {
331*c87b03e5Sespie   basic_block *stack;
332*c87b03e5Sespie   int sp;
333*c87b03e5Sespie   int num_nodes = 1;
334*c87b03e5Sespie   int findex, lindex;
335*c87b03e5Sespie 
336*c87b03e5Sespie   header->loop_father = loop;
337*c87b03e5Sespie   header->loop_depth = loop->depth;
338*c87b03e5Sespie   findex = lindex = header->index;
339*c87b03e5Sespie 
340*c87b03e5Sespie   if (loop->latch->loop_father != loop)
341*c87b03e5Sespie     {
342*c87b03e5Sespie       stack = (basic_block *) xmalloc (n_basic_blocks * sizeof (basic_block));
343*c87b03e5Sespie       sp = 0;
344*c87b03e5Sespie       num_nodes++;
345*c87b03e5Sespie       stack[sp++] = loop->latch;
346*c87b03e5Sespie       loop->latch->loop_father = loop;
347*c87b03e5Sespie       loop->latch->loop_depth = loop->depth;
348*c87b03e5Sespie 
349*c87b03e5Sespie       while (sp)
350*c87b03e5Sespie 	{
351*c87b03e5Sespie 	  basic_block node;
352*c87b03e5Sespie 	  edge e;
353*c87b03e5Sespie 
354*c87b03e5Sespie 	  node = stack[--sp];
355*c87b03e5Sespie 
356*c87b03e5Sespie 	  for (e = node->pred; e; e = e->pred_next)
357*c87b03e5Sespie 	    {
358*c87b03e5Sespie 	      basic_block ancestor = e->src;
359*c87b03e5Sespie 
360*c87b03e5Sespie 	      if (ancestor != ENTRY_BLOCK_PTR
361*c87b03e5Sespie 		  && ancestor->loop_father != loop)
362*c87b03e5Sespie 		{
363*c87b03e5Sespie 		  ancestor->loop_father = loop;
364*c87b03e5Sespie 		  ancestor->loop_depth = loop->depth;
365*c87b03e5Sespie 		  num_nodes++;
366*c87b03e5Sespie 		  stack[sp++] = ancestor;
367*c87b03e5Sespie 		}
368*c87b03e5Sespie 	    }
369*c87b03e5Sespie 	}
370*c87b03e5Sespie       free (stack);
371*c87b03e5Sespie     }
372*c87b03e5Sespie   return num_nodes;
373*c87b03e5Sespie }
374*c87b03e5Sespie 
375*c87b03e5Sespie /* Find the root node of the loop pre-header extended basic block and
376*c87b03e5Sespie    the edges along the trace from the root node to the loop header.  */
377*c87b03e5Sespie 
378*c87b03e5Sespie static void
flow_loop_pre_header_scan(loop)379*c87b03e5Sespie flow_loop_pre_header_scan (loop)
380*c87b03e5Sespie      struct loop *loop;
381*c87b03e5Sespie {
382*c87b03e5Sespie   int num;
383*c87b03e5Sespie   basic_block ebb;
384*c87b03e5Sespie   edge e;
385*c87b03e5Sespie 
386*c87b03e5Sespie   loop->num_pre_header_edges = 0;
387*c87b03e5Sespie   if (loop->num_entries != 1)
388*c87b03e5Sespie     return;
389*c87b03e5Sespie 
390*c87b03e5Sespie   ebb = loop->entry_edges[0]->src;
391*c87b03e5Sespie   if (ebb == ENTRY_BLOCK_PTR)
392*c87b03e5Sespie     return;
393*c87b03e5Sespie 
394*c87b03e5Sespie   /* Count number of edges along trace from loop header to
395*c87b03e5Sespie      root of pre-header extended basic block.  Usually this is
396*c87b03e5Sespie      only one or two edges.  */
397*c87b03e5Sespie   for (num = 1; ebb->pred->src != ENTRY_BLOCK_PTR && ! ebb->pred->pred_next;
398*c87b03e5Sespie        num++)
399*c87b03e5Sespie     ebb = ebb->pred->src;
400*c87b03e5Sespie 
401*c87b03e5Sespie   loop->pre_header_edges = (edge *) xmalloc (num * sizeof (edge));
402*c87b03e5Sespie   loop->num_pre_header_edges = num;
403*c87b03e5Sespie 
404*c87b03e5Sespie   /* Store edges in order that they are followed.  The source of the first edge
405*c87b03e5Sespie      is the root node of the pre-header extended basic block and the
406*c87b03e5Sespie      destination of the last last edge is the loop header.  */
407*c87b03e5Sespie   for (e = loop->entry_edges[0]; num; e = e->src->pred)
408*c87b03e5Sespie     loop->pre_header_edges[--num] = e;
409*c87b03e5Sespie }
410*c87b03e5Sespie 
411*c87b03e5Sespie /* Return the block for the pre-header of the loop with header
412*c87b03e5Sespie    HEADER where DOM specifies the dominator information.  Return NULL if
413*c87b03e5Sespie    there is no pre-header.  */
414*c87b03e5Sespie 
415*c87b03e5Sespie static basic_block
flow_loop_pre_header_find(header,dom)416*c87b03e5Sespie flow_loop_pre_header_find (header, dom)
417*c87b03e5Sespie      basic_block header;
418*c87b03e5Sespie      dominance_info dom;
419*c87b03e5Sespie {
420*c87b03e5Sespie   basic_block pre_header;
421*c87b03e5Sespie   edge e;
422*c87b03e5Sespie 
423*c87b03e5Sespie   /* If block p is a predecessor of the header and is the only block
424*c87b03e5Sespie      that the header does not dominate, then it is the pre-header.  */
425*c87b03e5Sespie   pre_header = NULL;
426*c87b03e5Sespie   for (e = header->pred; e; e = e->pred_next)
427*c87b03e5Sespie     {
428*c87b03e5Sespie       basic_block node = e->src;
429*c87b03e5Sespie 
430*c87b03e5Sespie       if (node != ENTRY_BLOCK_PTR
431*c87b03e5Sespie 	  && ! dominated_by_p (dom, node, header))
432*c87b03e5Sespie 	{
433*c87b03e5Sespie 	  if (pre_header == NULL)
434*c87b03e5Sespie 	    pre_header = node;
435*c87b03e5Sespie 	  else
436*c87b03e5Sespie 	    {
437*c87b03e5Sespie 	      /* There are multiple edges into the header from outside
438*c87b03e5Sespie 		 the loop so there is no pre-header block.  */
439*c87b03e5Sespie 	      pre_header = NULL;
440*c87b03e5Sespie 	      break;
441*c87b03e5Sespie 	    }
442*c87b03e5Sespie 	}
443*c87b03e5Sespie     }
444*c87b03e5Sespie 
445*c87b03e5Sespie   return pre_header;
446*c87b03e5Sespie }
447*c87b03e5Sespie 
448*c87b03e5Sespie /* Add LOOP to the loop hierarchy tree where FATHER is father of the
449*c87b03e5Sespie    added loop.  */
450*c87b03e5Sespie 
451*c87b03e5Sespie void
flow_loop_tree_node_add(father,loop)452*c87b03e5Sespie flow_loop_tree_node_add (father, loop)
453*c87b03e5Sespie      struct loop *father;
454*c87b03e5Sespie      struct loop *loop;
455*c87b03e5Sespie {
456*c87b03e5Sespie   loop->next = father->inner;
457*c87b03e5Sespie   father->inner = loop;
458*c87b03e5Sespie   loop->outer = father;
459*c87b03e5Sespie 
460*c87b03e5Sespie   loop->depth = father->depth + 1;
461*c87b03e5Sespie   loop->pred = xmalloc (sizeof (struct loop *) * loop->depth);
462*c87b03e5Sespie   memcpy (loop->pred, father->pred, sizeof (struct loop *) * father->depth);
463*c87b03e5Sespie   loop->pred[father->depth] = father;
464*c87b03e5Sespie }
465*c87b03e5Sespie 
466*c87b03e5Sespie /* Remove LOOP from the loop hierarchy tree.  */
467*c87b03e5Sespie 
468*c87b03e5Sespie void
flow_loop_tree_node_remove(loop)469*c87b03e5Sespie flow_loop_tree_node_remove (loop)
470*c87b03e5Sespie      struct loop *loop;
471*c87b03e5Sespie {
472*c87b03e5Sespie   struct loop *prev, *father;
473*c87b03e5Sespie 
474*c87b03e5Sespie   father = loop->outer;
475*c87b03e5Sespie   loop->outer = NULL;
476*c87b03e5Sespie 
477*c87b03e5Sespie   /* Remove loop from the list of sons.  */
478*c87b03e5Sespie   if (father->inner == loop)
479*c87b03e5Sespie     father->inner = loop->next;
480*c87b03e5Sespie   else
481*c87b03e5Sespie     {
482*c87b03e5Sespie       for (prev = father->inner; prev->next != loop; prev = prev->next);
483*c87b03e5Sespie       prev->next = loop->next;
484*c87b03e5Sespie     }
485*c87b03e5Sespie 
486*c87b03e5Sespie   loop->depth = -1;
487*c87b03e5Sespie   free (loop->pred);
488*c87b03e5Sespie   loop->pred = NULL;
489*c87b03e5Sespie }
490*c87b03e5Sespie 
491*c87b03e5Sespie /* Helper function to compute loop nesting depth and enclosed loop level
492*c87b03e5Sespie    for the natural loop specified by LOOP.  Returns the loop level.  */
493*c87b03e5Sespie 
494*c87b03e5Sespie static int
flow_loop_level_compute(loop)495*c87b03e5Sespie flow_loop_level_compute (loop)
496*c87b03e5Sespie      struct loop *loop;
497*c87b03e5Sespie {
498*c87b03e5Sespie   struct loop *inner;
499*c87b03e5Sespie   int level = 1;
500*c87b03e5Sespie 
501*c87b03e5Sespie   if (! loop)
502*c87b03e5Sespie     return 0;
503*c87b03e5Sespie 
504*c87b03e5Sespie   /* Traverse loop tree assigning depth and computing level as the
505*c87b03e5Sespie      maximum level of all the inner loops of this loop.  The loop
506*c87b03e5Sespie      level is equivalent to the height of the loop in the loop tree
507*c87b03e5Sespie      and corresponds to the number of enclosed loop levels (including
508*c87b03e5Sespie      itself).  */
509*c87b03e5Sespie   for (inner = loop->inner; inner; inner = inner->next)
510*c87b03e5Sespie     {
511*c87b03e5Sespie       int ilevel = flow_loop_level_compute (inner) + 1;
512*c87b03e5Sespie 
513*c87b03e5Sespie       if (ilevel > level)
514*c87b03e5Sespie 	level = ilevel;
515*c87b03e5Sespie     }
516*c87b03e5Sespie 
517*c87b03e5Sespie   loop->level = level;
518*c87b03e5Sespie   return level;
519*c87b03e5Sespie }
520*c87b03e5Sespie 
521*c87b03e5Sespie /* Compute the loop nesting depth and enclosed loop level for the loop
522*c87b03e5Sespie    hierarchy tree specified by LOOPS.  Return the maximum enclosed loop
523*c87b03e5Sespie    level.  */
524*c87b03e5Sespie 
525*c87b03e5Sespie static int
flow_loops_level_compute(loops)526*c87b03e5Sespie flow_loops_level_compute (loops)
527*c87b03e5Sespie      struct loops *loops;
528*c87b03e5Sespie {
529*c87b03e5Sespie   return flow_loop_level_compute (loops->tree_root);
530*c87b03e5Sespie }
531*c87b03e5Sespie 
532*c87b03e5Sespie /* Scan a single natural loop specified by LOOP collecting information
533*c87b03e5Sespie    about it specified by FLAGS.  */
534*c87b03e5Sespie 
535*c87b03e5Sespie int
flow_loop_scan(loops,loop,flags)536*c87b03e5Sespie flow_loop_scan (loops, loop, flags)
537*c87b03e5Sespie      struct loops *loops;
538*c87b03e5Sespie      struct loop *loop;
539*c87b03e5Sespie      int flags;
540*c87b03e5Sespie {
541*c87b03e5Sespie   if (flags & LOOP_ENTRY_EDGES)
542*c87b03e5Sespie     {
543*c87b03e5Sespie       /* Find edges which enter the loop header.
544*c87b03e5Sespie 	 Note that the entry edges should only
545*c87b03e5Sespie 	 enter the header of a natural loop.  */
546*c87b03e5Sespie       flow_loop_entry_edges_find (loop);
547*c87b03e5Sespie     }
548*c87b03e5Sespie 
549*c87b03e5Sespie   if (flags & LOOP_EXIT_EDGES)
550*c87b03e5Sespie     {
551*c87b03e5Sespie       /* Find edges which exit the loop.  */
552*c87b03e5Sespie       flow_loop_exit_edges_find (loop);
553*c87b03e5Sespie     }
554*c87b03e5Sespie 
555*c87b03e5Sespie   if (flags & LOOP_PRE_HEADER)
556*c87b03e5Sespie     {
557*c87b03e5Sespie       /* Look to see if the loop has a pre-header node.  */
558*c87b03e5Sespie       loop->pre_header
559*c87b03e5Sespie 	= flow_loop_pre_header_find (loop->header, loops->cfg.dom);
560*c87b03e5Sespie 
561*c87b03e5Sespie       /* Find the blocks within the extended basic block of
562*c87b03e5Sespie 	 the loop pre-header.  */
563*c87b03e5Sespie       flow_loop_pre_header_scan (loop);
564*c87b03e5Sespie     }
565*c87b03e5Sespie 
566*c87b03e5Sespie   return 1;
567*c87b03e5Sespie }
568*c87b03e5Sespie 
569*c87b03e5Sespie #define HEADER_BLOCK(B) (* (int *) (B)->aux)
570*c87b03e5Sespie #define LATCH_EDGE(E) (*(int *) (E)->aux)
571*c87b03e5Sespie 
572*c87b03e5Sespie /* Redirect edge and update latch and header info.  */
573*c87b03e5Sespie static void
redirect_edge_with_latch_update(e,to)574*c87b03e5Sespie redirect_edge_with_latch_update (e, to)
575*c87b03e5Sespie      edge e;
576*c87b03e5Sespie      basic_block to;
577*c87b03e5Sespie {
578*c87b03e5Sespie   basic_block jump;
579*c87b03e5Sespie 
580*c87b03e5Sespie   jump = redirect_edge_and_branch_force (e, to);
581*c87b03e5Sespie   if (jump)
582*c87b03e5Sespie     {
583*c87b03e5Sespie       alloc_aux_for_block (jump, sizeof (int));
584*c87b03e5Sespie       HEADER_BLOCK (jump) = 0;
585*c87b03e5Sespie       alloc_aux_for_edge (jump->pred, sizeof (int));
586*c87b03e5Sespie       LATCH_EDGE (jump->succ) = LATCH_EDGE (e);
587*c87b03e5Sespie       LATCH_EDGE (jump->pred) = 0;
588*c87b03e5Sespie     }
589*c87b03e5Sespie }
590*c87b03e5Sespie 
591*c87b03e5Sespie /* Split BB into entry part and rest; if REDIRECT_LATCH, redirect edges
592*c87b03e5Sespie    marked as latch into entry part, analogically for REDIRECT_NONLATCH.
593*c87b03e5Sespie    In both of these cases, ignore edge EXCEPT.  If CONN_LATCH, set edge
594*c87b03e5Sespie    between created entry part and BB as latch one.  Return created entry
595*c87b03e5Sespie    part.  */
596*c87b03e5Sespie 
597*c87b03e5Sespie static basic_block
make_forwarder_block(bb,redirect_latch,redirect_nonlatch,except,conn_latch)598*c87b03e5Sespie make_forwarder_block (bb, redirect_latch, redirect_nonlatch, except,
599*c87b03e5Sespie 		      conn_latch)
600*c87b03e5Sespie      basic_block bb;
601*c87b03e5Sespie      int redirect_latch;
602*c87b03e5Sespie      int redirect_nonlatch;
603*c87b03e5Sespie      edge except;
604*c87b03e5Sespie      int conn_latch;
605*c87b03e5Sespie {
606*c87b03e5Sespie   edge e, next_e, fallthru;
607*c87b03e5Sespie   basic_block dummy;
608*c87b03e5Sespie   rtx insn;
609*c87b03e5Sespie 
610*c87b03e5Sespie   insn = PREV_INSN (first_insn_after_basic_block_note (bb));
611*c87b03e5Sespie 
612*c87b03e5Sespie   fallthru = split_block (bb, insn);
613*c87b03e5Sespie   dummy = fallthru->src;
614*c87b03e5Sespie   bb = fallthru->dest;
615*c87b03e5Sespie 
616*c87b03e5Sespie   bb->aux = xmalloc (sizeof (int));
617*c87b03e5Sespie   HEADER_BLOCK (dummy) = 0;
618*c87b03e5Sespie   HEADER_BLOCK (bb) = 1;
619*c87b03e5Sespie 
620*c87b03e5Sespie   /* Redirect back edges we want to keep.  */
621*c87b03e5Sespie   for (e = dummy->pred; e; e = next_e)
622*c87b03e5Sespie     {
623*c87b03e5Sespie       next_e = e->pred_next;
624*c87b03e5Sespie       if (e == except
625*c87b03e5Sespie 	  || !((redirect_latch && LATCH_EDGE (e))
626*c87b03e5Sespie 	       || (redirect_nonlatch && !LATCH_EDGE (e))))
627*c87b03e5Sespie 	{
628*c87b03e5Sespie 	  dummy->frequency -= EDGE_FREQUENCY (e);
629*c87b03e5Sespie 	  dummy->count -= e->count;
630*c87b03e5Sespie 	  if (dummy->frequency < 0)
631*c87b03e5Sespie 	    dummy->frequency = 0;
632*c87b03e5Sespie 	  if (dummy->count < 0)
633*c87b03e5Sespie 	    dummy->count = 0;
634*c87b03e5Sespie 	  redirect_edge_with_latch_update (e, bb);
635*c87b03e5Sespie 	}
636*c87b03e5Sespie     }
637*c87b03e5Sespie 
638*c87b03e5Sespie   alloc_aux_for_edge (fallthru, sizeof (int));
639*c87b03e5Sespie   LATCH_EDGE (fallthru) = conn_latch;
640*c87b03e5Sespie 
641*c87b03e5Sespie   return dummy;
642*c87b03e5Sespie }
643*c87b03e5Sespie 
644*c87b03e5Sespie /* Takes care of merging natural loops with shared headers.  */
645*c87b03e5Sespie static void
canonicalize_loop_headers()646*c87b03e5Sespie canonicalize_loop_headers ()
647*c87b03e5Sespie {
648*c87b03e5Sespie   dominance_info dom;
649*c87b03e5Sespie   basic_block header;
650*c87b03e5Sespie   edge e;
651*c87b03e5Sespie 
652*c87b03e5Sespie   /* Compute the dominators.  */
653*c87b03e5Sespie   dom = calculate_dominance_info (CDI_DOMINATORS);
654*c87b03e5Sespie 
655*c87b03e5Sespie   alloc_aux_for_blocks (sizeof (int));
656*c87b03e5Sespie   alloc_aux_for_edges (sizeof (int));
657*c87b03e5Sespie 
658*c87b03e5Sespie   /* Split blocks so that each loop has only single latch.  */
659*c87b03e5Sespie   FOR_EACH_BB (header)
660*c87b03e5Sespie     {
661*c87b03e5Sespie       int num_latches = 0;
662*c87b03e5Sespie       int have_abnormal_edge = 0;
663*c87b03e5Sespie 
664*c87b03e5Sespie       for (e = header->pred; e; e = e->pred_next)
665*c87b03e5Sespie 	{
666*c87b03e5Sespie 	  basic_block latch = e->src;
667*c87b03e5Sespie 
668*c87b03e5Sespie 	  if (e->flags & EDGE_ABNORMAL)
669*c87b03e5Sespie 	    have_abnormal_edge = 1;
670*c87b03e5Sespie 
671*c87b03e5Sespie 	  if (latch != ENTRY_BLOCK_PTR
672*c87b03e5Sespie 	      && dominated_by_p (dom, latch, header))
673*c87b03e5Sespie 	    {
674*c87b03e5Sespie 	      num_latches++;
675*c87b03e5Sespie 	      LATCH_EDGE (e) = 1;
676*c87b03e5Sespie 	    }
677*c87b03e5Sespie 	}
678*c87b03e5Sespie       if (have_abnormal_edge)
679*c87b03e5Sespie 	HEADER_BLOCK (header) = 0;
680*c87b03e5Sespie       else
681*c87b03e5Sespie 	HEADER_BLOCK (header) = num_latches;
682*c87b03e5Sespie     }
683*c87b03e5Sespie 
684*c87b03e5Sespie   if (HEADER_BLOCK (ENTRY_BLOCK_PTR->succ->dest))
685*c87b03e5Sespie     {
686*c87b03e5Sespie       basic_block bb;
687*c87b03e5Sespie 
688*c87b03e5Sespie       /* We could not redirect edges freely here. On the other hand,
689*c87b03e5Sespie 	 we can simply split the edge from entry block.  */
690*c87b03e5Sespie       bb = split_edge (ENTRY_BLOCK_PTR->succ);
691*c87b03e5Sespie 
692*c87b03e5Sespie       alloc_aux_for_edge (bb->succ, sizeof (int));
693*c87b03e5Sespie       LATCH_EDGE (bb->succ) = 0;
694*c87b03e5Sespie       alloc_aux_for_block (bb, sizeof (int));
695*c87b03e5Sespie       HEADER_BLOCK (bb) = 0;
696*c87b03e5Sespie     }
697*c87b03e5Sespie 
698*c87b03e5Sespie   FOR_EACH_BB (header)
699*c87b03e5Sespie     {
700*c87b03e5Sespie       int num_latch;
701*c87b03e5Sespie       int want_join_latch;
702*c87b03e5Sespie       int max_freq, is_heavy;
703*c87b03e5Sespie       edge heavy;
704*c87b03e5Sespie 
705*c87b03e5Sespie       if (!HEADER_BLOCK (header))
706*c87b03e5Sespie 	continue;
707*c87b03e5Sespie 
708*c87b03e5Sespie       num_latch = HEADER_BLOCK (header);
709*c87b03e5Sespie 
710*c87b03e5Sespie       want_join_latch = (num_latch > 1);
711*c87b03e5Sespie 
712*c87b03e5Sespie       if (!want_join_latch)
713*c87b03e5Sespie 	continue;
714*c87b03e5Sespie 
715*c87b03e5Sespie       /* Find a heavy edge.  */
716*c87b03e5Sespie       is_heavy = 1;
717*c87b03e5Sespie       heavy = NULL;
718*c87b03e5Sespie       max_freq = 0;
719*c87b03e5Sespie       for (e = header->pred; e; e = e->pred_next)
720*c87b03e5Sespie 	if (LATCH_EDGE (e) &&
721*c87b03e5Sespie 	    EDGE_FREQUENCY (e) > max_freq)
722*c87b03e5Sespie 	  max_freq = EDGE_FREQUENCY (e);
723*c87b03e5Sespie       for (e = header->pred; e; e = e->pred_next)
724*c87b03e5Sespie 	if (LATCH_EDGE (e) &&
725*c87b03e5Sespie 	    EDGE_FREQUENCY (e) >= max_freq / HEAVY_EDGE_RATIO)
726*c87b03e5Sespie 	  {
727*c87b03e5Sespie 	    if (heavy)
728*c87b03e5Sespie 	      {
729*c87b03e5Sespie 		is_heavy = 0;
730*c87b03e5Sespie 		break;
731*c87b03e5Sespie 	      }
732*c87b03e5Sespie 	    else
733*c87b03e5Sespie 	      heavy = e;
734*c87b03e5Sespie 	  }
735*c87b03e5Sespie 
736*c87b03e5Sespie       if (is_heavy)
737*c87b03e5Sespie 	{
738*c87b03e5Sespie 	  basic_block new_header =
739*c87b03e5Sespie 	    make_forwarder_block (header, true, true, heavy, 0);
740*c87b03e5Sespie 	  if (num_latch > 2)
741*c87b03e5Sespie 	    make_forwarder_block (new_header, true, false, NULL, 1);
742*c87b03e5Sespie 	}
743*c87b03e5Sespie       else
744*c87b03e5Sespie 	make_forwarder_block (header, true, false, NULL, 1);
745*c87b03e5Sespie     }
746*c87b03e5Sespie 
747*c87b03e5Sespie   free_aux_for_blocks ();
748*c87b03e5Sespie   free_aux_for_edges ();
749*c87b03e5Sespie   free_dominance_info (dom);
750*c87b03e5Sespie }
751*c87b03e5Sespie 
752*c87b03e5Sespie /* Find all the natural loops in the function and save in LOOPS structure and
753*c87b03e5Sespie    recalculate loop_depth information in basic block structures.  FLAGS
754*c87b03e5Sespie    controls which loop information is collected.  Return the number of natural
755*c87b03e5Sespie    loops found.  */
756*c87b03e5Sespie 
757*c87b03e5Sespie int
flow_loops_find(loops,flags)758*c87b03e5Sespie flow_loops_find (loops, flags)
759*c87b03e5Sespie      struct loops *loops;
760*c87b03e5Sespie      int flags;
761*c87b03e5Sespie {
762*c87b03e5Sespie   int i;
763*c87b03e5Sespie   int b;
764*c87b03e5Sespie   int num_loops;
765*c87b03e5Sespie   edge e;
766*c87b03e5Sespie   sbitmap headers;
767*c87b03e5Sespie   dominance_info dom;
768*c87b03e5Sespie   int *dfs_order;
769*c87b03e5Sespie   int *rc_order;
770*c87b03e5Sespie   basic_block header;
771*c87b03e5Sespie   basic_block bb;
772*c87b03e5Sespie 
773*c87b03e5Sespie   /* This function cannot be repeatedly called with different
774*c87b03e5Sespie      flags to build up the loop information.  The loop tree
775*c87b03e5Sespie      must always be built if this function is called.  */
776*c87b03e5Sespie   if (! (flags & LOOP_TREE))
777*c87b03e5Sespie     abort ();
778*c87b03e5Sespie 
779*c87b03e5Sespie   memset (loops, 0, sizeof *loops);
780*c87b03e5Sespie 
781*c87b03e5Sespie   /* Taking care of this degenerate case makes the rest of
782*c87b03e5Sespie      this code simpler.  */
783*c87b03e5Sespie   if (n_basic_blocks == 0)
784*c87b03e5Sespie     return 0;
785*c87b03e5Sespie 
786*c87b03e5Sespie   dfs_order = NULL;
787*c87b03e5Sespie   rc_order = NULL;
788*c87b03e5Sespie 
789*c87b03e5Sespie   /* Join loops with shared headers.  */
790*c87b03e5Sespie   canonicalize_loop_headers ();
791*c87b03e5Sespie 
792*c87b03e5Sespie   /* Compute the dominators.  */
793*c87b03e5Sespie   dom = loops->cfg.dom = calculate_dominance_info (CDI_DOMINATORS);
794*c87b03e5Sespie 
795*c87b03e5Sespie   /* Count the number of loop headers.  This should be the
796*c87b03e5Sespie      same as the number of natural loops.  */
797*c87b03e5Sespie   headers = sbitmap_alloc (last_basic_block);
798*c87b03e5Sespie   sbitmap_zero (headers);
799*c87b03e5Sespie 
800*c87b03e5Sespie   num_loops = 0;
801*c87b03e5Sespie   FOR_EACH_BB (header)
802*c87b03e5Sespie     {
803*c87b03e5Sespie       int more_latches = 0;
804*c87b03e5Sespie 
805*c87b03e5Sespie       header->loop_depth = 0;
806*c87b03e5Sespie 
807*c87b03e5Sespie       /* If we have an abnormal predecessor, do not consider the
808*c87b03e5Sespie 	 loop (not worth the problems).  */
809*c87b03e5Sespie       for (e = header->pred; e; e = e->pred_next)
810*c87b03e5Sespie 	if (e->flags & EDGE_ABNORMAL)
811*c87b03e5Sespie 	  break;
812*c87b03e5Sespie       if (e)
813*c87b03e5Sespie 	continue;
814*c87b03e5Sespie 
815*c87b03e5Sespie       for (e = header->pred; e; e = e->pred_next)
816*c87b03e5Sespie 	{
817*c87b03e5Sespie 	  basic_block latch = e->src;
818*c87b03e5Sespie 
819*c87b03e5Sespie 	  if (e->flags & EDGE_ABNORMAL)
820*c87b03e5Sespie 	    abort ();
821*c87b03e5Sespie 
822*c87b03e5Sespie 	  /* Look for back edges where a predecessor is dominated
823*c87b03e5Sespie 	     by this block.  A natural loop has a single entry
824*c87b03e5Sespie 	     node (header) that dominates all the nodes in the
825*c87b03e5Sespie 	     loop.  It also has single back edge to the header
826*c87b03e5Sespie 	     from a latch node.  */
827*c87b03e5Sespie 	  if (latch != ENTRY_BLOCK_PTR && dominated_by_p (dom, latch, header))
828*c87b03e5Sespie 	    {
829*c87b03e5Sespie 	      /* Shared headers should be eliminated by now.  */
830*c87b03e5Sespie 	      if (more_latches)
831*c87b03e5Sespie 		abort ();
832*c87b03e5Sespie 	      more_latches = 1;
833*c87b03e5Sespie 	      SET_BIT (headers, header->index);
834*c87b03e5Sespie 	      num_loops++;
835*c87b03e5Sespie 	    }
836*c87b03e5Sespie 	}
837*c87b03e5Sespie     }
838*c87b03e5Sespie 
839*c87b03e5Sespie   /* Allocate loop structures.  */
840*c87b03e5Sespie   loops->parray = (struct loop **) xcalloc (num_loops + 1, sizeof (struct loop *));
841*c87b03e5Sespie 
842*c87b03e5Sespie   /* Dummy loop containing whole function.  */
843*c87b03e5Sespie   loops->parray[0] = xcalloc (1, sizeof (struct loop));
844*c87b03e5Sespie   loops->parray[0]->next = NULL;
845*c87b03e5Sespie   loops->parray[0]->inner = NULL;
846*c87b03e5Sespie   loops->parray[0]->outer = NULL;
847*c87b03e5Sespie   loops->parray[0]->depth = 0;
848*c87b03e5Sespie   loops->parray[0]->pred = NULL;
849*c87b03e5Sespie   loops->parray[0]->num_nodes = n_basic_blocks + 2;
850*c87b03e5Sespie   loops->parray[0]->latch = EXIT_BLOCK_PTR;
851*c87b03e5Sespie   loops->parray[0]->header = ENTRY_BLOCK_PTR;
852*c87b03e5Sespie   ENTRY_BLOCK_PTR->loop_father = loops->parray[0];
853*c87b03e5Sespie   EXIT_BLOCK_PTR->loop_father = loops->parray[0];
854*c87b03e5Sespie 
855*c87b03e5Sespie   loops->tree_root = loops->parray[0];
856*c87b03e5Sespie 
857*c87b03e5Sespie   /* Find and record information about all the natural loops
858*c87b03e5Sespie      in the CFG.  */
859*c87b03e5Sespie   loops->num = 1;
860*c87b03e5Sespie   FOR_EACH_BB (bb)
861*c87b03e5Sespie     bb->loop_father = loops->tree_root;
862*c87b03e5Sespie 
863*c87b03e5Sespie   if (num_loops)
864*c87b03e5Sespie     {
865*c87b03e5Sespie       /* Compute depth first search order of the CFG so that outer
866*c87b03e5Sespie 	 natural loops will be found before inner natural loops.  */
867*c87b03e5Sespie       dfs_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
868*c87b03e5Sespie       rc_order = (int *) xmalloc (n_basic_blocks * sizeof (int));
869*c87b03e5Sespie       flow_depth_first_order_compute (dfs_order, rc_order);
870*c87b03e5Sespie 
871*c87b03e5Sespie       /* Save CFG derived information to avoid recomputing it.  */
872*c87b03e5Sespie       loops->cfg.dom = dom;
873*c87b03e5Sespie       loops->cfg.dfs_order = dfs_order;
874*c87b03e5Sespie       loops->cfg.rc_order = rc_order;
875*c87b03e5Sespie 
876*c87b03e5Sespie       num_loops = 1;
877*c87b03e5Sespie 
878*c87b03e5Sespie       for (b = 0; b < n_basic_blocks; b++)
879*c87b03e5Sespie 	{
880*c87b03e5Sespie 	  struct loop *loop;
881*c87b03e5Sespie 
882*c87b03e5Sespie 	  /* Search the nodes of the CFG in reverse completion order
883*c87b03e5Sespie 	     so that we can find outer loops first.  */
884*c87b03e5Sespie 	  if (!TEST_BIT (headers, rc_order[b]))
885*c87b03e5Sespie 	    continue;
886*c87b03e5Sespie 
887*c87b03e5Sespie 	  header = BASIC_BLOCK (rc_order[b]);
888*c87b03e5Sespie 
889*c87b03e5Sespie 	  loop = loops->parray[num_loops] = xcalloc (1, sizeof (struct loop));
890*c87b03e5Sespie 
891*c87b03e5Sespie 	  loop->header = header;
892*c87b03e5Sespie 	  loop->num = num_loops;
893*c87b03e5Sespie 	  num_loops++;
894*c87b03e5Sespie 
895*c87b03e5Sespie 	  /* Look for the latch for this header block.  */
896*c87b03e5Sespie 	  for (e = header->pred; e; e = e->pred_next)
897*c87b03e5Sespie 	    {
898*c87b03e5Sespie 	      basic_block latch = e->src;
899*c87b03e5Sespie 
900*c87b03e5Sespie 	      if (latch != ENTRY_BLOCK_PTR
901*c87b03e5Sespie 		  && dominated_by_p (dom, latch, header))
902*c87b03e5Sespie 		{
903*c87b03e5Sespie 		  loop->latch = latch;
904*c87b03e5Sespie 		  break;
905*c87b03e5Sespie 		}
906*c87b03e5Sespie 	    }
907*c87b03e5Sespie 
908*c87b03e5Sespie 	  flow_loop_tree_node_add (header->loop_father, loop);
909*c87b03e5Sespie 	  loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
910*c87b03e5Sespie 	}
911*c87b03e5Sespie 
912*c87b03e5Sespie       sbitmap_free (headers);
913*c87b03e5Sespie 
914*c87b03e5Sespie       /* Assign the loop nesting depth and enclosed loop level for each
915*c87b03e5Sespie 	 loop.  */
916*c87b03e5Sespie       loops->levels = flow_loops_level_compute (loops);
917*c87b03e5Sespie 
918*c87b03e5Sespie       /* Scan the loops.  */
919*c87b03e5Sespie       for (i = 1; i < num_loops; i++)
920*c87b03e5Sespie 	flow_loop_scan (loops, loops->parray[i], flags);
921*c87b03e5Sespie 
922*c87b03e5Sespie       loops->num = num_loops;
923*c87b03e5Sespie     }
924*c87b03e5Sespie   else
925*c87b03e5Sespie     {
926*c87b03e5Sespie       loops->cfg.dom = NULL;
927*c87b03e5Sespie       free_dominance_info (dom);
928*c87b03e5Sespie     }
929*c87b03e5Sespie #ifdef ENABLE_CHECKING
930*c87b03e5Sespie   verify_flow_info ();
931*c87b03e5Sespie   verify_loop_structure (loops, 0);
932*c87b03e5Sespie #endif
933*c87b03e5Sespie 
934*c87b03e5Sespie   return loops->num;
935*c87b03e5Sespie }
936*c87b03e5Sespie 
937*c87b03e5Sespie /* Update the information regarding the loops in the CFG
938*c87b03e5Sespie    specified by LOOPS.  */
939*c87b03e5Sespie 
940*c87b03e5Sespie int
flow_loops_update(loops,flags)941*c87b03e5Sespie flow_loops_update (loops, flags)
942*c87b03e5Sespie      struct loops *loops;
943*c87b03e5Sespie      int flags;
944*c87b03e5Sespie {
945*c87b03e5Sespie   /* One day we may want to update the current loop data.  For now
946*c87b03e5Sespie      throw away the old stuff and rebuild what we need.  */
947*c87b03e5Sespie   if (loops->parray)
948*c87b03e5Sespie     flow_loops_free (loops);
949*c87b03e5Sespie 
950*c87b03e5Sespie   return flow_loops_find (loops, flags);
951*c87b03e5Sespie }
952*c87b03e5Sespie 
953*c87b03e5Sespie /* Return nonzero if basic block BB belongs to LOOP.  */
954*c87b03e5Sespie bool
flow_bb_inside_loop_p(loop,bb)955*c87b03e5Sespie flow_bb_inside_loop_p (loop, bb)
956*c87b03e5Sespie      const struct loop *loop;
957*c87b03e5Sespie      const basic_block bb;
958*c87b03e5Sespie {
959*c87b03e5Sespie   struct loop *source_loop;
960*c87b03e5Sespie 
961*c87b03e5Sespie   if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
962*c87b03e5Sespie     return 0;
963*c87b03e5Sespie 
964*c87b03e5Sespie   source_loop = bb->loop_father;
965*c87b03e5Sespie   return loop == source_loop || flow_loop_nested_p (loop, source_loop);
966*c87b03e5Sespie }
967*c87b03e5Sespie 
968*c87b03e5Sespie /* Return nonzero if edge E enters header of LOOP from outside of LOOP.  */
969*c87b03e5Sespie 
970*c87b03e5Sespie bool
flow_loop_outside_edge_p(loop,e)971*c87b03e5Sespie flow_loop_outside_edge_p (loop, e)
972*c87b03e5Sespie      const struct loop *loop;
973*c87b03e5Sespie      edge e;
974*c87b03e5Sespie {
975*c87b03e5Sespie   if (e->dest != loop->header)
976*c87b03e5Sespie     abort ();
977*c87b03e5Sespie   return !flow_bb_inside_loop_p (loop, e->src);
978*c87b03e5Sespie }
979*c87b03e5Sespie 
980*c87b03e5Sespie /* Enumeration predicate for get_loop_body.  */
981*c87b03e5Sespie static bool
glb_enum_p(bb,glb_header)982*c87b03e5Sespie glb_enum_p (bb, glb_header)
983*c87b03e5Sespie      basic_block bb;
984*c87b03e5Sespie      void *glb_header;
985*c87b03e5Sespie {
986*c87b03e5Sespie   return bb != (basic_block) glb_header;
987*c87b03e5Sespie }
988*c87b03e5Sespie 
989*c87b03e5Sespie /* Gets basic blocks of a loop.  */
990*c87b03e5Sespie basic_block *
get_loop_body(loop)991*c87b03e5Sespie get_loop_body (loop)
992*c87b03e5Sespie      const struct loop *loop;
993*c87b03e5Sespie {
994*c87b03e5Sespie   basic_block *tovisit, bb;
995*c87b03e5Sespie   int tv = 0;
996*c87b03e5Sespie 
997*c87b03e5Sespie   if (!loop->num_nodes)
998*c87b03e5Sespie     abort ();
999*c87b03e5Sespie 
1000*c87b03e5Sespie   tovisit = xcalloc (loop->num_nodes, sizeof (basic_block));
1001*c87b03e5Sespie   tovisit[tv++] = loop->header;
1002*c87b03e5Sespie 
1003*c87b03e5Sespie   if (loop->latch == EXIT_BLOCK_PTR)
1004*c87b03e5Sespie     {
1005*c87b03e5Sespie       /* There may be blocks unreachable from EXIT_BLOCK.  */
1006*c87b03e5Sespie       if (loop->num_nodes != n_basic_blocks + 2)
1007*c87b03e5Sespie 	abort ();
1008*c87b03e5Sespie       FOR_EACH_BB (bb)
1009*c87b03e5Sespie 	tovisit[tv++] = bb;
1010*c87b03e5Sespie       tovisit[tv++] = EXIT_BLOCK_PTR;
1011*c87b03e5Sespie     }
1012*c87b03e5Sespie   else if (loop->latch != loop->header)
1013*c87b03e5Sespie     {
1014*c87b03e5Sespie       tv = dfs_enumerate_from (loop->latch, 1, glb_enum_p,
1015*c87b03e5Sespie 			       tovisit + 1, loop->num_nodes - 1,
1016*c87b03e5Sespie 			       loop->header) + 1;
1017*c87b03e5Sespie     }
1018*c87b03e5Sespie 
1019*c87b03e5Sespie   if (tv != loop->num_nodes)
1020*c87b03e5Sespie     abort ();
1021*c87b03e5Sespie   return tovisit;
1022*c87b03e5Sespie }
1023*c87b03e5Sespie 
1024*c87b03e5Sespie /* Adds basic block BB to LOOP.  */
1025*c87b03e5Sespie void
add_bb_to_loop(bb,loop)1026*c87b03e5Sespie add_bb_to_loop (bb, loop)
1027*c87b03e5Sespie      basic_block bb;
1028*c87b03e5Sespie      struct loop *loop;
1029*c87b03e5Sespie  {
1030*c87b03e5Sespie    int i;
1031*c87b03e5Sespie 
1032*c87b03e5Sespie    bb->loop_father = loop;
1033*c87b03e5Sespie    bb->loop_depth = loop->depth;
1034*c87b03e5Sespie    loop->num_nodes++;
1035*c87b03e5Sespie    for (i = 0; i < loop->depth; i++)
1036*c87b03e5Sespie      loop->pred[i]->num_nodes++;
1037*c87b03e5Sespie  }
1038*c87b03e5Sespie 
1039*c87b03e5Sespie /* Remove basic block BB from loops.  */
1040*c87b03e5Sespie void
remove_bb_from_loops(bb)1041*c87b03e5Sespie remove_bb_from_loops (bb)
1042*c87b03e5Sespie      basic_block bb;
1043*c87b03e5Sespie  {
1044*c87b03e5Sespie    int i;
1045*c87b03e5Sespie    struct loop *loop = bb->loop_father;
1046*c87b03e5Sespie 
1047*c87b03e5Sespie    loop->num_nodes--;
1048*c87b03e5Sespie    for (i = 0; i < loop->depth; i++)
1049*c87b03e5Sespie      loop->pred[i]->num_nodes--;
1050*c87b03e5Sespie    bb->loop_father = NULL;
1051*c87b03e5Sespie    bb->loop_depth = 0;
1052*c87b03e5Sespie  }
1053*c87b03e5Sespie 
1054*c87b03e5Sespie /* Finds nearest common ancestor in loop tree for given loops.  */
1055*c87b03e5Sespie struct loop *
find_common_loop(loop_s,loop_d)1056*c87b03e5Sespie find_common_loop (loop_s, loop_d)
1057*c87b03e5Sespie     struct loop *loop_s;
1058*c87b03e5Sespie     struct loop *loop_d;
1059*c87b03e5Sespie {
1060*c87b03e5Sespie   if (!loop_s) return loop_d;
1061*c87b03e5Sespie   if (!loop_d) return loop_s;
1062*c87b03e5Sespie 
1063*c87b03e5Sespie   if (loop_s->depth < loop_d->depth)
1064*c87b03e5Sespie     loop_d = loop_d->pred[loop_s->depth];
1065*c87b03e5Sespie   else if (loop_s->depth > loop_d->depth)
1066*c87b03e5Sespie     loop_s = loop_s->pred[loop_d->depth];
1067*c87b03e5Sespie 
1068*c87b03e5Sespie   while (loop_s != loop_d)
1069*c87b03e5Sespie     {
1070*c87b03e5Sespie       loop_s = loop_s->outer;
1071*c87b03e5Sespie       loop_d = loop_d->outer;
1072*c87b03e5Sespie     }
1073*c87b03e5Sespie   return loop_s;
1074*c87b03e5Sespie }
1075*c87b03e5Sespie 
1076*c87b03e5Sespie /* Checks that LOOPS are allright:
1077*c87b03e5Sespie      -- sizes of loops are allright
1078*c87b03e5Sespie      -- results of get_loop_body really belong to the loop
1079*c87b03e5Sespie      -- loop header have just single entry edge and single latch edge
1080*c87b03e5Sespie      -- loop latches have only single successor that is header of their loop
1081*c87b03e5Sespie   */
1082*c87b03e5Sespie void
verify_loop_structure(loops,flags)1083*c87b03e5Sespie verify_loop_structure (loops, flags)
1084*c87b03e5Sespie      struct loops *loops;
1085*c87b03e5Sespie      int flags;
1086*c87b03e5Sespie {
1087*c87b03e5Sespie   int *sizes, i, j;
1088*c87b03e5Sespie   basic_block *bbs, bb;
1089*c87b03e5Sespie   struct loop *loop;
1090*c87b03e5Sespie   int err = 0;
1091*c87b03e5Sespie 
1092*c87b03e5Sespie   /* Check sizes.  */
1093*c87b03e5Sespie   sizes = xcalloc (loops->num, sizeof (int));
1094*c87b03e5Sespie   sizes[0] = 2;
1095*c87b03e5Sespie 
1096*c87b03e5Sespie   FOR_EACH_BB (bb)
1097*c87b03e5Sespie     for (loop = bb->loop_father; loop; loop = loop->outer)
1098*c87b03e5Sespie       sizes[loop->num]++;
1099*c87b03e5Sespie 
1100*c87b03e5Sespie   for (i = 0; i < loops->num; i++)
1101*c87b03e5Sespie     {
1102*c87b03e5Sespie       if (!loops->parray[i])
1103*c87b03e5Sespie         continue;
1104*c87b03e5Sespie 
1105*c87b03e5Sespie       if (loops->parray[i]->num_nodes != sizes[i])
1106*c87b03e5Sespie 	{
1107*c87b03e5Sespie 	  error ("Size of loop %d should be %d, not %d.",
1108*c87b03e5Sespie 		   i, sizes[i], loops->parray[i]->num_nodes);
1109*c87b03e5Sespie 	  err = 1;
1110*c87b03e5Sespie 	}
1111*c87b03e5Sespie     }
1112*c87b03e5Sespie 
1113*c87b03e5Sespie   free (sizes);
1114*c87b03e5Sespie 
1115*c87b03e5Sespie   /* Check get_loop_body.  */
1116*c87b03e5Sespie   for (i = 1; i < loops->num; i++)
1117*c87b03e5Sespie     {
1118*c87b03e5Sespie       loop = loops->parray[i];
1119*c87b03e5Sespie       if (!loop)
1120*c87b03e5Sespie 	continue;
1121*c87b03e5Sespie       bbs = get_loop_body (loop);
1122*c87b03e5Sespie 
1123*c87b03e5Sespie       for (j = 0; j < loop->num_nodes; j++)
1124*c87b03e5Sespie 	if (!flow_bb_inside_loop_p (loop, bbs[j]))
1125*c87b03e5Sespie 	  {
1126*c87b03e5Sespie 	    error ("Bb %d do not belong to loop %d.",
1127*c87b03e5Sespie 		    bbs[j]->index, i);
1128*c87b03e5Sespie 	    err = 1;
1129*c87b03e5Sespie 	  }
1130*c87b03e5Sespie       free (bbs);
1131*c87b03e5Sespie     }
1132*c87b03e5Sespie 
1133*c87b03e5Sespie   /* Check headers and latches.  */
1134*c87b03e5Sespie   for (i = 1; i < loops->num; i++)
1135*c87b03e5Sespie     {
1136*c87b03e5Sespie       loop = loops->parray[i];
1137*c87b03e5Sespie       if (!loop)
1138*c87b03e5Sespie 	continue;
1139*c87b03e5Sespie 
1140*c87b03e5Sespie       if ((flags & VLS_EXPECT_PREHEADERS)
1141*c87b03e5Sespie 	  && (!loop->header->pred->pred_next
1142*c87b03e5Sespie 	      || loop->header->pred->pred_next->pred_next))
1143*c87b03e5Sespie 	{
1144*c87b03e5Sespie 	  error ("Loop %d's header does not have exactly 2 entries.", i);
1145*c87b03e5Sespie 	  err = 1;
1146*c87b03e5Sespie 	}
1147*c87b03e5Sespie       if (flags & VLS_EXPECT_SIMPLE_LATCHES)
1148*c87b03e5Sespie 	{
1149*c87b03e5Sespie 	  if (!loop->latch->succ
1150*c87b03e5Sespie 	      || loop->latch->succ->succ_next)
1151*c87b03e5Sespie 	    {
1152*c87b03e5Sespie 	      error ("Loop %d's latch does not have exactly 1 successor.", i);
1153*c87b03e5Sespie 	      err = 1;
1154*c87b03e5Sespie 	    }
1155*c87b03e5Sespie 	  if (loop->latch->succ->dest != loop->header)
1156*c87b03e5Sespie 	    {
1157*c87b03e5Sespie 	      error ("Loop %d's latch does not have header as successor.", i);
1158*c87b03e5Sespie 	      err = 1;
1159*c87b03e5Sespie 	    }
1160*c87b03e5Sespie 	  if (loop->latch->loop_father != loop)
1161*c87b03e5Sespie 	    {
1162*c87b03e5Sespie 	      error ("Loop %d's latch does not belong directly to it.", i);
1163*c87b03e5Sespie 	      err = 1;
1164*c87b03e5Sespie 	    }
1165*c87b03e5Sespie 	}
1166*c87b03e5Sespie       if (loop->header->loop_father != loop)
1167*c87b03e5Sespie 	{
1168*c87b03e5Sespie 	  error ("Loop %d's header does not belong directly to it.", i);
1169*c87b03e5Sespie 	  err = 1;
1170*c87b03e5Sespie 	}
1171*c87b03e5Sespie     }
1172*c87b03e5Sespie 
1173*c87b03e5Sespie   if (err)
1174*c87b03e5Sespie     abort ();
1175*c87b03e5Sespie }
1176*c87b03e5Sespie 
1177*c87b03e5Sespie /* Returns latch edge of LOOP.  */
1178*c87b03e5Sespie edge
loop_latch_edge(loop)1179*c87b03e5Sespie loop_latch_edge (loop)
1180*c87b03e5Sespie      struct loop *loop;
1181*c87b03e5Sespie {
1182*c87b03e5Sespie   edge e;
1183*c87b03e5Sespie 
1184*c87b03e5Sespie   for (e = loop->header->pred; e->src != loop->latch; e = e->pred_next)
1185*c87b03e5Sespie     continue;
1186*c87b03e5Sespie 
1187*c87b03e5Sespie   return e;
1188*c87b03e5Sespie }
1189*c87b03e5Sespie 
1190*c87b03e5Sespie /* Returns preheader edge of LOOP.  */
1191*c87b03e5Sespie edge
loop_preheader_edge(loop)1192*c87b03e5Sespie loop_preheader_edge (loop)
1193*c87b03e5Sespie      struct loop *loop;
1194*c87b03e5Sespie {
1195*c87b03e5Sespie   edge e;
1196*c87b03e5Sespie 
1197*c87b03e5Sespie   for (e = loop->header->pred; e->src == loop->latch; e = e->pred_next)
1198*c87b03e5Sespie     continue;
1199*c87b03e5Sespie 
1200*c87b03e5Sespie   return e;
1201*c87b03e5Sespie }
1202*c87b03e5Sespie 
1203