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