xref: /netbsd-src/external/gpl3/gcc/dist/gcc/cfgloop.cc (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1 /* Natural loop discovery code for GNU compiler.
2    Copyright (C) 2000-2022 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 3, 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 COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19 
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "rtl.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "cfghooks.h"
28 #include "gimple-ssa.h"
29 #include "diagnostic-core.h"
30 #include "cfganal.h"
31 #include "cfgloop.h"
32 #include "gimple-iterator.h"
33 #include "dumpfile.h"
34 #include "tree-ssa.h"
35 #include "tree-pretty-print.h"
36 
37 static void flow_loops_cfg_dump (FILE *);
38 
39 /* Dump loop related CFG information.  */
40 
41 static void
flow_loops_cfg_dump(FILE * file)42 flow_loops_cfg_dump (FILE *file)
43 {
44   basic_block bb;
45 
46   if (!file)
47     return;
48 
49   FOR_EACH_BB_FN (bb, cfun)
50     {
51       edge succ;
52       edge_iterator ei;
53 
54       fprintf (file, ";; %d succs { ", bb->index);
55       FOR_EACH_EDGE (succ, ei, bb->succs)
56 	fprintf (file, "%d ", succ->dest->index);
57       fprintf (file, "}\n");
58     }
59 }
60 
61 /* Return nonzero if the nodes of LOOP are a subset of OUTER.  */
62 
63 bool
flow_loop_nested_p(const class loop * outer,const class loop * loop)64 flow_loop_nested_p (const class loop *outer, const class loop *loop)
65 {
66   unsigned odepth = loop_depth (outer);
67 
68   return (loop_depth (loop) > odepth
69 	  && (*loop->superloops)[odepth] == outer);
70 }
71 
72 /* Returns the loop such that LOOP is nested DEPTH (indexed from zero)
73    loops within LOOP.  */
74 
75 class loop *
superloop_at_depth(class loop * loop,unsigned depth)76 superloop_at_depth (class loop *loop, unsigned depth)
77 {
78   unsigned ldepth = loop_depth (loop);
79 
80   gcc_assert (depth <= ldepth);
81 
82   if (depth == ldepth)
83     return loop;
84 
85   return (*loop->superloops)[depth];
86 }
87 
88 /* Returns the list of the latch edges of LOOP.  */
89 
90 static vec<edge>
get_loop_latch_edges(const class loop * loop)91 get_loop_latch_edges (const class loop *loop)
92 {
93   edge_iterator ei;
94   edge e;
95   vec<edge> ret = vNULL;
96 
97   FOR_EACH_EDGE (e, ei, loop->header->preds)
98     {
99       if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header))
100 	ret.safe_push (e);
101     }
102 
103   return ret;
104 }
105 
106 /* Dump the loop information specified by LOOP to the stream FILE
107    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
108 
109 void
flow_loop_dump(const class loop * loop,FILE * file,void (* loop_dump_aux)(const class loop *,FILE *,int),int verbose)110 flow_loop_dump (const class loop *loop, FILE *file,
111 		void (*loop_dump_aux) (const class loop *, FILE *, int),
112 		int verbose)
113 {
114   basic_block *bbs;
115   unsigned i;
116   vec<edge> latches;
117   edge e;
118 
119   if (! loop || ! loop->header)
120     return;
121 
122   fprintf (file, ";;\n;; Loop %d\n", loop->num);
123 
124   fprintf (file, ";;  header %d, ", loop->header->index);
125   if (loop->latch)
126     fprintf (file, "latch %d\n", loop->latch->index);
127   else
128     {
129       fprintf (file, "multiple latches:");
130       latches = get_loop_latch_edges (loop);
131       FOR_EACH_VEC_ELT (latches, i, e)
132 	fprintf (file, " %d", e->src->index);
133       latches.release ();
134       fprintf (file, "\n");
135     }
136 
137   fprintf (file, ";;  depth %d, outer %ld\n",
138 	   loop_depth (loop), (long) (loop_outer (loop)
139 				      ? loop_outer (loop)->num : -1));
140 
141   if (loop->latch)
142     {
143       bool read_profile_p;
144       gcov_type nit = expected_loop_iterations_unbounded (loop, &read_profile_p);
145       if (read_profile_p && !loop->any_estimate)
146 	fprintf (file, ";;  profile-based iteration count: %" PRIu64 "\n",
147 		 (uint64_t) nit);
148     }
149 
150   fprintf (file, ";;  nodes:");
151   bbs = get_loop_body (loop);
152   for (i = 0; i < loop->num_nodes; i++)
153     fprintf (file, " %d", bbs[i]->index);
154   free (bbs);
155   fprintf (file, "\n");
156 
157   if (loop_dump_aux)
158     loop_dump_aux (loop, file, verbose);
159 }
160 
161 /* Dump the loop information about loops to the stream FILE,
162    using auxiliary dump callback function LOOP_DUMP_AUX if non null.  */
163 
164 void
flow_loops_dump(FILE * file,void (* loop_dump_aux)(const class loop *,FILE *,int),int verbose)165 flow_loops_dump (FILE *file, void (*loop_dump_aux) (const class loop *, FILE *, int), int verbose)
166 {
167   if (!current_loops || ! file)
168     return;
169 
170   fprintf (file, ";; %d loops found\n", number_of_loops (cfun));
171 
172   for (auto loop : loops_list (cfun, LI_INCLUDE_ROOT))
173     {
174       flow_loop_dump (loop, file, loop_dump_aux, verbose);
175     }
176 
177   if (verbose)
178     flow_loops_cfg_dump (file);
179 }
180 
181 /* Free data allocated for LOOP.  */
182 
183 void
flow_loop_free(class loop * loop)184 flow_loop_free (class loop *loop)
185 {
186   struct loop_exit *exit, *next;
187 
188   vec_free (loop->superloops);
189 
190   /* Break the list of the loop exit records.  They will be freed when the
191      corresponding edge is rescanned or removed, and this avoids
192      accessing the (already released) head of the list stored in the
193      loop structure.  */
194   for (exit = loop->exits->next; exit != loop->exits; exit = next)
195     {
196       next = exit->next;
197       exit->next = exit;
198       exit->prev = exit;
199     }
200 
201   ggc_free (loop->exits);
202   ggc_free (loop);
203 }
204 
205 /* Free all the memory allocated for LOOPS.  */
206 
207 void
flow_loops_free(struct loops * loops)208 flow_loops_free (struct loops *loops)
209 {
210   if (loops->larray)
211     {
212       unsigned i;
213       loop_p loop;
214 
215       /* Free the loop descriptors.  */
216       FOR_EACH_VEC_SAFE_ELT (loops->larray, i, loop)
217 	{
218 	  if (!loop)
219 	    continue;
220 
221 	  flow_loop_free (loop);
222 	}
223 
224       vec_free (loops->larray);
225     }
226 }
227 
228 /* Find the nodes contained within the LOOP with header HEADER.
229    Return the number of nodes within the loop.  */
230 
231 int
flow_loop_nodes_find(basic_block header,class loop * loop)232 flow_loop_nodes_find (basic_block header, class loop *loop)
233 {
234   vec<basic_block> stack = vNULL;
235   int num_nodes = 1;
236   edge latch;
237   edge_iterator latch_ei;
238 
239   header->loop_father = loop;
240 
241   FOR_EACH_EDGE (latch, latch_ei, loop->header->preds)
242     {
243       if (latch->src->loop_father == loop
244 	  || !dominated_by_p (CDI_DOMINATORS, latch->src, loop->header))
245 	continue;
246 
247       num_nodes++;
248       stack.safe_push (latch->src);
249       latch->src->loop_father = loop;
250 
251       while (!stack.is_empty ())
252 	{
253 	  basic_block node;
254 	  edge e;
255 	  edge_iterator ei;
256 
257 	  node = stack.pop ();
258 
259 	  FOR_EACH_EDGE (e, ei, node->preds)
260 	    {
261 	      basic_block ancestor = e->src;
262 
263 	      if (ancestor->loop_father != loop)
264 		{
265 		  ancestor->loop_father = loop;
266 		  num_nodes++;
267 		  stack.safe_push (ancestor);
268 		}
269 	    }
270 	}
271     }
272   stack.release ();
273 
274   return num_nodes;
275 }
276 
277 /* Records the vector of superloops of the loop LOOP, whose immediate
278    superloop is FATHER.  */
279 
280 static void
establish_preds(class loop * loop,class loop * father)281 establish_preds (class loop *loop, class loop *father)
282 {
283   loop_p ploop;
284   unsigned depth = loop_depth (father) + 1;
285   unsigned i;
286 
287   loop->superloops = 0;
288   vec_alloc (loop->superloops, depth);
289   FOR_EACH_VEC_SAFE_ELT (father->superloops, i, ploop)
290     loop->superloops->quick_push (ploop);
291   loop->superloops->quick_push (father);
292 
293   for (ploop = loop->inner; ploop; ploop = ploop->next)
294     establish_preds (ploop, loop);
295 }
296 
297 /* Add LOOP to the loop hierarchy tree where FATHER is father of the
298    added loop.  If LOOP has some children, take care of that their
299    pred field will be initialized correctly.  If AFTER is non-null
300    then it's expected it's a pointer into FATHERs inner sibling
301    list and LOOP is added behind AFTER, otherwise it's added in front
302    of FATHERs siblings.  */
303 
304 void
flow_loop_tree_node_add(class loop * father,class loop * loop,class loop * after)305 flow_loop_tree_node_add (class loop *father, class loop *loop,
306 			 class loop *after)
307 {
308   if (after)
309     {
310       loop->next = after->next;
311       after->next = loop;
312     }
313   else
314     {
315       loop->next = father->inner;
316       father->inner = loop;
317     }
318 
319   establish_preds (loop, father);
320 }
321 
322 /* Remove LOOP from the loop hierarchy tree.  */
323 
324 void
flow_loop_tree_node_remove(class loop * loop)325 flow_loop_tree_node_remove (class loop *loop)
326 {
327   class loop *prev, *father;
328 
329   father = loop_outer (loop);
330 
331   /* Remove loop from the list of sons.  */
332   if (father->inner == loop)
333     father->inner = loop->next;
334   else
335     {
336       for (prev = father->inner; prev->next != loop; prev = prev->next)
337 	continue;
338       prev->next = loop->next;
339     }
340 
341   loop->superloops = NULL;
342 }
343 
344 /* Allocates and returns new loop structure.  */
345 
346 class loop *
alloc_loop(void)347 alloc_loop (void)
348 {
349   class loop *loop = ggc_cleared_alloc<class loop> ();
350 
351   loop->exits = ggc_cleared_alloc<loop_exit> ();
352   loop->exits->next = loop->exits->prev = loop->exits;
353   loop->can_be_parallel = false;
354   loop->constraints = 0;
355   loop->nb_iterations_upper_bound = 0;
356   loop->nb_iterations_likely_upper_bound = 0;
357   loop->nb_iterations_estimate = 0;
358   return loop;
359 }
360 
361 /* Initializes loops structure LOOPS, reserving place for NUM_LOOPS loops
362    (including the root of the loop tree).  */
363 
364 void
init_loops_structure(struct function * fn,struct loops * loops,unsigned num_loops)365 init_loops_structure (struct function *fn,
366 		      struct loops *loops, unsigned num_loops)
367 {
368   class loop *root;
369 
370   memset (loops, 0, sizeof *loops);
371   vec_alloc (loops->larray, num_loops);
372 
373   /* Dummy loop containing whole function.  */
374   root = alloc_loop ();
375   root->num_nodes = n_basic_blocks_for_fn (fn);
376   root->latch = EXIT_BLOCK_PTR_FOR_FN (fn);
377   root->header = ENTRY_BLOCK_PTR_FOR_FN (fn);
378   ENTRY_BLOCK_PTR_FOR_FN (fn)->loop_father = root;
379   EXIT_BLOCK_PTR_FOR_FN (fn)->loop_father = root;
380 
381   loops->larray->quick_push (root);
382   loops->tree_root = root;
383 }
384 
385 /* Returns whether HEADER is a loop header.  */
386 
387 bool
bb_loop_header_p(basic_block header)388 bb_loop_header_p (basic_block header)
389 {
390   edge_iterator ei;
391   edge e;
392 
393   /* If we have an abnormal predecessor, do not consider the
394      loop (not worth the problems).  */
395   if (bb_has_abnormal_pred (header))
396     return false;
397 
398   /* Look for back edges where a predecessor is dominated
399      by this block.  A natural loop has a single entry
400      node (header) that dominates all the nodes in the
401      loop.  It also has single back edge to the header
402      from a latch node.  */
403   FOR_EACH_EDGE (e, ei, header->preds)
404     {
405       basic_block latch = e->src;
406       if (latch != ENTRY_BLOCK_PTR_FOR_FN (cfun)
407 	  && dominated_by_p (CDI_DOMINATORS, latch, header))
408 	return true;
409     }
410 
411   return false;
412 }
413 
414 /* Find all the natural loops in the function and save in LOOPS structure and
415    recalculate loop_father information in basic block structures.
416    If LOOPS is non-NULL then the loop structures for already recorded loops
417    will be re-used and their number will not change.  We assume that no
418    stale loops exist in LOOPS.
419    When LOOPS is NULL it is allocated and re-built from scratch.
420    Return the built LOOPS structure.  */
421 
422 struct loops *
flow_loops_find(struct loops * loops)423 flow_loops_find (struct loops *loops)
424 {
425   bool from_scratch = (loops == NULL);
426   int *rc_order;
427   int b;
428   unsigned i;
429 
430   /* Ensure that the dominators are computed.  */
431   calculate_dominance_info (CDI_DOMINATORS);
432 
433   if (!loops)
434     {
435       loops = ggc_cleared_alloc<struct loops> ();
436       init_loops_structure (cfun, loops, 1);
437     }
438 
439   /* Ensure that loop exits were released.  */
440   gcc_assert (loops->exits == NULL);
441 
442   /* Taking care of this degenerate case makes the rest of
443      this code simpler.  */
444   if (n_basic_blocks_for_fn (cfun) == NUM_FIXED_BLOCKS)
445     return loops;
446 
447   /* The root loop node contains all basic-blocks.  */
448   loops->tree_root->num_nodes = n_basic_blocks_for_fn (cfun);
449 
450   /* Compute depth first search order of the CFG so that outer
451      natural loops will be found before inner natural loops.  */
452   rc_order = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
453   pre_and_rev_post_order_compute (NULL, rc_order, false);
454 
455   /* Gather all loop headers in reverse completion order and allocate
456      loop structures for loops that are not already present.  */
457   auto_vec<loop_p> larray (loops->larray->length ());
458   for (b = 0; b < n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS; b++)
459     {
460       basic_block header = BASIC_BLOCK_FOR_FN (cfun, rc_order[b]);
461       if (bb_loop_header_p (header))
462 	{
463 	  class loop *loop;
464 
465 	  /* The current active loop tree has valid loop-fathers for
466 	     header blocks.  */
467 	  if (!from_scratch
468 	      && header->loop_father->header == header)
469 	    {
470 	      loop = header->loop_father;
471 	      /* If we found an existing loop remove it from the
472 		 loop tree.  It is going to be inserted again
473 		 below.  */
474 	      flow_loop_tree_node_remove (loop);
475 	    }
476 	  else
477 	    {
478 	      /* Otherwise allocate a new loop structure for the loop.  */
479 	      loop = alloc_loop ();
480 	      /* ???  We could re-use unused loop slots here.  */
481 	      loop->num = loops->larray->length ();
482 	      vec_safe_push (loops->larray, loop);
483 	      loop->header = header;
484 
485 	      if (!from_scratch
486 		  && dump_file && (dump_flags & TDF_DETAILS))
487 		fprintf (dump_file, "flow_loops_find: discovered new "
488 			 "loop %d with header %d\n",
489 			 loop->num, header->index);
490 	    }
491 	  /* Reset latch, we recompute it below.  */
492 	  loop->latch = NULL;
493 	  larray.safe_push (loop);
494 	}
495 
496       /* Make blocks part of the loop root node at start.  */
497       header->loop_father = loops->tree_root;
498     }
499 
500   free (rc_order);
501 
502   /* Now iterate over the loops found, insert them into the loop tree
503      and assign basic-block ownership.  */
504   for (i = 0; i < larray.length (); ++i)
505     {
506       class loop *loop = larray[i];
507       basic_block header = loop->header;
508       edge_iterator ei;
509       edge e;
510 
511       flow_loop_tree_node_add (header->loop_father, loop);
512       loop->num_nodes = flow_loop_nodes_find (loop->header, loop);
513 
514       /* Look for the latch for this header block, if it has just a
515 	 single one.  */
516       FOR_EACH_EDGE (e, ei, header->preds)
517 	{
518 	  basic_block latch = e->src;
519 
520 	  if (flow_bb_inside_loop_p (loop, latch))
521 	    {
522 	      if (loop->latch != NULL)
523 		{
524 		  /* More than one latch edge.  */
525 		  loop->latch = NULL;
526 		  break;
527 		}
528 	      loop->latch = latch;
529 	    }
530 	}
531     }
532 
533   return loops;
534 }
535 
536 /* qsort helper for sort_sibling_loops.  */
537 
538 static int *sort_sibling_loops_cmp_rpo;
539 static int
sort_sibling_loops_cmp(const void * la_,const void * lb_)540 sort_sibling_loops_cmp (const void *la_, const void *lb_)
541 {
542   const class loop *la = *(const class loop * const *)la_;
543   const class loop *lb = *(const class loop * const *)lb_;
544   return (sort_sibling_loops_cmp_rpo[la->header->index]
545 	  - sort_sibling_loops_cmp_rpo[lb->header->index]);
546 }
547 
548 /* Sort sibling loops in RPO order.  */
549 
550 void
sort_sibling_loops(function * fn)551 sort_sibling_loops (function *fn)
552 {
553   /* Match flow_loops_find in the order we sort sibling loops.  */
554   sort_sibling_loops_cmp_rpo = XNEWVEC (int, last_basic_block_for_fn (cfun));
555   int *rc_order = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
556   pre_and_rev_post_order_compute_fn (fn, NULL, rc_order, false);
557   for (int i = 0; i < n_basic_blocks_for_fn (cfun) - NUM_FIXED_BLOCKS; ++i)
558     sort_sibling_loops_cmp_rpo[rc_order[i]] = i;
559   free (rc_order);
560 
561   auto_vec<loop_p, 3> siblings;
562   for (auto loop : loops_list (fn, LI_INCLUDE_ROOT))
563     if (loop->inner && loop->inner->next)
564       {
565 	loop_p sibling = loop->inner;
566 	do
567 	  {
568 	    siblings.safe_push (sibling);
569 	    sibling = sibling->next;
570 	  }
571 	while (sibling);
572 	siblings.qsort (sort_sibling_loops_cmp);
573 	loop_p *siblingp = &loop->inner;
574 	for (unsigned i = 0; i < siblings.length (); ++i)
575 	  {
576 	    *siblingp = siblings[i];
577 	    siblingp = &(*siblingp)->next;
578 	  }
579 	*siblingp = NULL;
580 	siblings.truncate (0);
581       }
582 
583   free (sort_sibling_loops_cmp_rpo);
584   sort_sibling_loops_cmp_rpo = NULL;
585 }
586 
587 /* Ratio of frequencies of edges so that one of more latch edges is
588    considered to belong to inner loop with same header.  */
589 #define HEAVY_EDGE_RATIO 8
590 
591 /* Minimum number of samples for that we apply
592    find_subloop_latch_edge_by_profile heuristics.  */
593 #define HEAVY_EDGE_MIN_SAMPLES 10
594 
595 /* If the profile info is available, finds an edge in LATCHES that much more
596    frequent than the remaining edges.  Returns such an edge, or NULL if we do
597    not find one.
598 
599    We do not use guessed profile here, only the measured one.  The guessed
600    profile is usually too flat and unreliable for this (and it is mostly based
601    on the loop structure of the program, so it does not make much sense to
602    derive the loop structure from it).  */
603 
604 static edge
find_subloop_latch_edge_by_profile(vec<edge> latches)605 find_subloop_latch_edge_by_profile (vec<edge> latches)
606 {
607   unsigned i;
608   edge e, me = NULL;
609   profile_count mcount = profile_count::zero (), tcount = profile_count::zero ();
610 
611   FOR_EACH_VEC_ELT (latches, i, e)
612     {
613       if (e->count ()> mcount)
614 	{
615 	  me = e;
616 	  mcount = e->count();
617 	}
618       tcount += e->count();
619     }
620 
621   if (!tcount.initialized_p () || !(tcount.ipa () > HEAVY_EDGE_MIN_SAMPLES)
622       || (tcount - mcount).apply_scale (HEAVY_EDGE_RATIO, 1) > tcount)
623     return NULL;
624 
625   if (dump_file)
626     fprintf (dump_file,
627 	     "Found latch edge %d -> %d using profile information.\n",
628 	     me->src->index, me->dest->index);
629   return me;
630 }
631 
632 /* Among LATCHES, guesses a latch edge of LOOP corresponding to subloop, based
633    on the structure of induction variables.  Returns this edge, or NULL if we
634    do not find any.
635 
636    We are quite conservative, and look just for an obvious simple innermost
637    loop (which is the case where we would lose the most performance by not
638    disambiguating the loop).  More precisely, we look for the following
639    situation: The source of the chosen latch edge dominates sources of all
640    the other latch edges.  Additionally, the header does not contain a phi node
641    such that the argument from the chosen edge is equal to the argument from
642    another edge.  */
643 
644 static edge
find_subloop_latch_edge_by_ivs(class loop * loop ATTRIBUTE_UNUSED,vec<edge> latches)645 find_subloop_latch_edge_by_ivs (class loop *loop ATTRIBUTE_UNUSED, vec<edge> latches)
646 {
647   edge e, latch = latches[0];
648   unsigned i;
649   gphi *phi;
650   gphi_iterator psi;
651   tree lop;
652   basic_block bb;
653 
654   /* Find the candidate for the latch edge.  */
655   for (i = 1; latches.iterate (i, &e); i++)
656     if (dominated_by_p (CDI_DOMINATORS, latch->src, e->src))
657       latch = e;
658 
659   /* Verify that it dominates all the latch edges.  */
660   FOR_EACH_VEC_ELT (latches, i, e)
661     if (!dominated_by_p (CDI_DOMINATORS, e->src, latch->src))
662       return NULL;
663 
664   /* Check for a phi node that would deny that this is a latch edge of
665      a subloop.  */
666   for (psi = gsi_start_phis (loop->header); !gsi_end_p (psi); gsi_next (&psi))
667     {
668       phi = psi.phi ();
669       lop = PHI_ARG_DEF_FROM_EDGE (phi, latch);
670 
671       /* Ignore the values that are not changed inside the subloop.  */
672       if (TREE_CODE (lop) != SSA_NAME
673 	  || SSA_NAME_DEF_STMT (lop) == phi)
674 	continue;
675       bb = gimple_bb (SSA_NAME_DEF_STMT (lop));
676       if (!bb || !flow_bb_inside_loop_p (loop, bb))
677 	continue;
678 
679       FOR_EACH_VEC_ELT (latches, i, e)
680 	if (e != latch
681 	    && PHI_ARG_DEF_FROM_EDGE (phi, e) == lop)
682 	  return NULL;
683     }
684 
685   if (dump_file)
686     fprintf (dump_file,
687 	     "Found latch edge %d -> %d using iv structure.\n",
688 	     latch->src->index, latch->dest->index);
689   return latch;
690 }
691 
692 /* If we can determine that one of the several latch edges of LOOP behaves
693    as a latch edge of a separate subloop, returns this edge.  Otherwise
694    returns NULL.  */
695 
696 static edge
find_subloop_latch_edge(class loop * loop)697 find_subloop_latch_edge (class loop *loop)
698 {
699   vec<edge> latches = get_loop_latch_edges (loop);
700   edge latch = NULL;
701 
702   if (latches.length () > 1)
703     {
704       latch = find_subloop_latch_edge_by_profile (latches);
705 
706       if (!latch
707 	  /* We consider ivs to guess the latch edge only in SSA.  Perhaps we
708 	     should use cfghook for this, but it is hard to imagine it would
709 	     be useful elsewhere.  */
710 	  && current_ir_type () == IR_GIMPLE)
711 	latch = find_subloop_latch_edge_by_ivs (loop, latches);
712     }
713 
714   latches.release ();
715   return latch;
716 }
717 
718 /* Callback for make_forwarder_block.  Returns true if the edge E is marked
719    in the set MFB_REIS_SET.  */
720 
721 static hash_set<edge> *mfb_reis_set;
722 static bool
mfb_redirect_edges_in_set(edge e)723 mfb_redirect_edges_in_set (edge e)
724 {
725   return mfb_reis_set->contains (e);
726 }
727 
728 /* Creates a subloop of LOOP with latch edge LATCH.  */
729 
730 static void
form_subloop(class loop * loop,edge latch)731 form_subloop (class loop *loop, edge latch)
732 {
733   edge_iterator ei;
734   edge e, new_entry;
735   class loop *new_loop;
736 
737   mfb_reis_set = new hash_set<edge>;
738   FOR_EACH_EDGE (e, ei, loop->header->preds)
739     {
740       if (e != latch)
741 	mfb_reis_set->add (e);
742     }
743   new_entry = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
744 				    NULL);
745   delete mfb_reis_set;
746 
747   loop->header = new_entry->src;
748 
749   /* Find the blocks and subloops that belong to the new loop, and add it to
750      the appropriate place in the loop tree.  */
751   new_loop = alloc_loop ();
752   new_loop->header = new_entry->dest;
753   new_loop->latch = latch->src;
754   add_loop (new_loop, loop);
755 }
756 
757 /* Make all the latch edges of LOOP to go to a single forwarder block --
758    a new latch of LOOP.  */
759 
760 static void
merge_latch_edges(class loop * loop)761 merge_latch_edges (class loop *loop)
762 {
763   vec<edge> latches = get_loop_latch_edges (loop);
764   edge latch, e;
765   unsigned i;
766 
767   gcc_assert (latches.length () > 0);
768 
769   if (latches.length () == 1)
770     loop->latch = latches[0]->src;
771   else
772     {
773       if (dump_file)
774 	fprintf (dump_file, "Merged latch edges of loop %d\n", loop->num);
775 
776       mfb_reis_set = new hash_set<edge>;
777       FOR_EACH_VEC_ELT (latches, i, e)
778 	mfb_reis_set->add (e);
779       latch = make_forwarder_block (loop->header, mfb_redirect_edges_in_set,
780 				    NULL);
781       delete mfb_reis_set;
782 
783       loop->header = latch->dest;
784       loop->latch = latch->src;
785     }
786 
787   latches.release ();
788 }
789 
790 /* LOOP may have several latch edges.  Transform it into (possibly several)
791    loops with single latch edge.  */
792 
793 static void
disambiguate_multiple_latches(class loop * loop)794 disambiguate_multiple_latches (class loop *loop)
795 {
796   edge e;
797 
798   /* We eliminate the multiple latches by splitting the header to the forwarder
799      block F and the rest R, and redirecting the edges.  There are two cases:
800 
801      1) If there is a latch edge E that corresponds to a subloop (we guess
802         that based on profile -- if it is taken much more often than the
803 	remaining edges; and on trees, using the information about induction
804 	variables of the loops), we redirect E to R, all the remaining edges to
805 	F, then rescan the loops and try again for the outer loop.
806      2) If there is no such edge, we redirect all latch edges to F, and the
807         entry edges to R, thus making F the single latch of the loop.  */
808 
809   if (dump_file)
810     fprintf (dump_file, "Disambiguating loop %d with multiple latches\n",
811 	     loop->num);
812 
813   /* During latch merging, we may need to redirect the entry edges to a new
814      block.  This would cause problems if the entry edge was the one from the
815      entry block.  To avoid having to handle this case specially, split
816      such entry edge.  */
817   e = find_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun), loop->header);
818   if (e)
819     split_edge (e);
820 
821   while (1)
822     {
823       e = find_subloop_latch_edge (loop);
824       if (!e)
825 	break;
826 
827       form_subloop (loop, e);
828     }
829 
830   merge_latch_edges (loop);
831 }
832 
833 /* Split loops with multiple latch edges.  */
834 
835 void
disambiguate_loops_with_multiple_latches(void)836 disambiguate_loops_with_multiple_latches (void)
837 {
838   for (auto loop : loops_list (cfun, 0))
839     {
840       if (!loop->latch)
841 	disambiguate_multiple_latches (loop);
842     }
843 }
844 
845 /* Return nonzero if basic block BB belongs to LOOP.  */
846 bool
flow_bb_inside_loop_p(const class loop * loop,const_basic_block bb)847 flow_bb_inside_loop_p (const class loop *loop, const_basic_block bb)
848 {
849   class loop *source_loop;
850 
851   if (bb == ENTRY_BLOCK_PTR_FOR_FN (cfun)
852       || bb == EXIT_BLOCK_PTR_FOR_FN (cfun))
853     return 0;
854 
855   source_loop = bb->loop_father;
856   return loop == source_loop || flow_loop_nested_p (loop, source_loop);
857 }
858 
859 /* Enumeration predicate for get_loop_body_with_size.  */
860 static bool
glb_enum_p(const_basic_block bb,const void * glb_loop)861 glb_enum_p (const_basic_block bb, const void *glb_loop)
862 {
863   const class loop *const loop = (const class loop *) glb_loop;
864   return (bb != loop->header
865 	  && dominated_by_p (CDI_DOMINATORS, bb, loop->header));
866 }
867 
868 /* Gets basic blocks of a LOOP.  Header is the 0-th block, rest is in dfs
869    order against direction of edges from latch.  Specially, if
870    header != latch, latch is the 1-st block.  LOOP cannot be the fake
871    loop tree root, and its size must be at most MAX_SIZE.  The blocks
872    in the LOOP body are stored to BODY, and the size of the LOOP is
873    returned.  */
874 
875 unsigned
get_loop_body_with_size(const class loop * loop,basic_block * body,unsigned max_size)876 get_loop_body_with_size (const class loop *loop, basic_block *body,
877 			 unsigned max_size)
878 {
879   return dfs_enumerate_from (loop->header, 1, glb_enum_p,
880 			     body, max_size, loop);
881 }
882 
883 /* Gets basic blocks of a LOOP.  Header is the 0-th block, rest is in dfs
884    order against direction of edges from latch.  Specially, if
885    header != latch, latch is the 1-st block.  */
886 
887 basic_block *
get_loop_body(const class loop * loop)888 get_loop_body (const class loop *loop)
889 {
890   basic_block *body, bb;
891   unsigned tv = 0;
892 
893   gcc_assert (loop->num_nodes);
894 
895   body = XNEWVEC (basic_block, loop->num_nodes);
896 
897   if (loop->latch == EXIT_BLOCK_PTR_FOR_FN (cfun))
898     {
899       /* There may be blocks unreachable from EXIT_BLOCK, hence we need to
900 	 special-case the fake loop that contains the whole function.  */
901       gcc_assert (loop->num_nodes == (unsigned) n_basic_blocks_for_fn (cfun));
902       body[tv++] = loop->header;
903       body[tv++] = EXIT_BLOCK_PTR_FOR_FN (cfun);
904       FOR_EACH_BB_FN (bb, cfun)
905 	body[tv++] = bb;
906     }
907   else
908     tv = get_loop_body_with_size (loop, body, loop->num_nodes);
909 
910   gcc_assert (tv == loop->num_nodes);
911   return body;
912 }
913 
914 /* Fills dominance descendants inside LOOP of the basic block BB into
915    array TOVISIT from index *TV.  */
916 
917 static void
fill_sons_in_loop(const class loop * loop,basic_block bb,basic_block * tovisit,int * tv)918 fill_sons_in_loop (const class loop *loop, basic_block bb,
919 		   basic_block *tovisit, int *tv)
920 {
921   basic_block son, postpone = NULL;
922 
923   tovisit[(*tv)++] = bb;
924   for (son = first_dom_son (CDI_DOMINATORS, bb);
925        son;
926        son = next_dom_son (CDI_DOMINATORS, son))
927     {
928       if (!flow_bb_inside_loop_p (loop, son))
929 	continue;
930 
931       if (dominated_by_p (CDI_DOMINATORS, loop->latch, son))
932 	{
933 	  postpone = son;
934 	  continue;
935 	}
936       fill_sons_in_loop (loop, son, tovisit, tv);
937     }
938 
939   if (postpone)
940     fill_sons_in_loop (loop, postpone, tovisit, tv);
941 }
942 
943 /* Gets body of a LOOP (that must be different from the outermost loop)
944    sorted by dominance relation.  Additionally, if a basic block s dominates
945    the latch, then only blocks dominated by s are be after it.  */
946 
947 basic_block *
get_loop_body_in_dom_order(const class loop * loop)948 get_loop_body_in_dom_order (const class loop *loop)
949 {
950   basic_block *tovisit;
951   int tv;
952 
953   gcc_assert (loop->num_nodes);
954 
955   tovisit = XNEWVEC (basic_block, loop->num_nodes);
956 
957   gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
958 
959   tv = 0;
960   fill_sons_in_loop (loop, loop->header, tovisit, &tv);
961 
962   gcc_assert (tv == (int) loop->num_nodes);
963 
964   return tovisit;
965 }
966 
967 /* Gets body of a LOOP sorted via provided BB_COMPARATOR.  */
968 
969 basic_block *
get_loop_body_in_custom_order(const class loop * loop,int (* bb_comparator)(const void *,const void *))970 get_loop_body_in_custom_order (const class loop *loop,
971 			       int (*bb_comparator) (const void *, const void *))
972 {
973   basic_block *bbs = get_loop_body (loop);
974 
975   qsort (bbs, loop->num_nodes, sizeof (basic_block), bb_comparator);
976 
977   return bbs;
978 }
979 
980 /* Same as above, but use gcc_sort_r instead of qsort.  */
981 
982 basic_block *
get_loop_body_in_custom_order(const class loop * loop,void * data,int (* bb_comparator)(const void *,const void *,void *))983 get_loop_body_in_custom_order (const class loop *loop, void *data,
984 			       int (*bb_comparator) (const void *, const void *, void *))
985 {
986   basic_block *bbs = get_loop_body (loop);
987 
988   gcc_sort_r (bbs, loop->num_nodes, sizeof (basic_block), bb_comparator, data);
989 
990   return bbs;
991 }
992 
993 /* Get body of a LOOP in breadth first sort order.  */
994 
995 basic_block *
get_loop_body_in_bfs_order(const class loop * loop)996 get_loop_body_in_bfs_order (const class loop *loop)
997 {
998   basic_block *blocks;
999   basic_block bb;
1000   unsigned int i = 1;
1001   unsigned int vc = 0;
1002 
1003   gcc_assert (loop->num_nodes);
1004   gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
1005 
1006   blocks = XNEWVEC (basic_block, loop->num_nodes);
1007   auto_bitmap visited;
1008   blocks[0] = loop->header;
1009   bitmap_set_bit (visited, loop->header->index);
1010   while (i < loop->num_nodes)
1011     {
1012       edge e;
1013       edge_iterator ei;
1014       gcc_assert (i > vc);
1015       bb = blocks[vc++];
1016 
1017       FOR_EACH_EDGE (e, ei, bb->succs)
1018 	{
1019 	  if (flow_bb_inside_loop_p (loop, e->dest))
1020 	    {
1021 	      /* This bb is now visited.  */
1022 	      if (bitmap_set_bit (visited, e->dest->index))
1023 		blocks[i++] = e->dest;
1024 	    }
1025 	}
1026     }
1027 
1028   return blocks;
1029 }
1030 
1031 /* Hash function for struct loop_exit.  */
1032 
1033 hashval_t
hash(loop_exit * exit)1034 loop_exit_hasher::hash (loop_exit *exit)
1035 {
1036   return htab_hash_pointer (exit->e);
1037 }
1038 
1039 /* Equality function for struct loop_exit.  Compares with edge.  */
1040 
1041 bool
equal(loop_exit * exit,edge e)1042 loop_exit_hasher::equal (loop_exit *exit, edge e)
1043 {
1044   return exit->e == e;
1045 }
1046 
1047 /* Frees the list of loop exit descriptions EX.  */
1048 
1049 void
remove(loop_exit * exit)1050 loop_exit_hasher::remove (loop_exit *exit)
1051 {
1052   loop_exit *next;
1053   for (; exit; exit = next)
1054     {
1055       next = exit->next_e;
1056 
1057       exit->next->prev = exit->prev;
1058       exit->prev->next = exit->next;
1059 
1060       ggc_free (exit);
1061     }
1062 }
1063 
1064 /* Returns the list of records for E as an exit of a loop.  */
1065 
1066 static struct loop_exit *
get_exit_descriptions(edge e)1067 get_exit_descriptions (edge e)
1068 {
1069   return current_loops->exits->find_with_hash (e, htab_hash_pointer (e));
1070 }
1071 
1072 /* Updates the lists of loop exits in that E appears.
1073    If REMOVED is true, E is being removed, and we
1074    just remove it from the lists of exits.
1075    If NEW_EDGE is true and E is not a loop exit, we
1076    do not try to remove it from loop exit lists.  */
1077 
1078 void
rescan_loop_exit(edge e,bool new_edge,bool removed)1079 rescan_loop_exit (edge e, bool new_edge, bool removed)
1080 {
1081   struct loop_exit *exits = NULL, *exit;
1082   class loop *aloop, *cloop;
1083 
1084   if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1085     return;
1086 
1087   if (!removed
1088       && e->src->loop_father != NULL
1089       && e->dest->loop_father != NULL
1090       && !flow_bb_inside_loop_p (e->src->loop_father, e->dest))
1091     {
1092       cloop = find_common_loop (e->src->loop_father, e->dest->loop_father);
1093       for (aloop = e->src->loop_father;
1094 	   aloop != cloop;
1095 	   aloop = loop_outer (aloop))
1096 	{
1097 	  exit = ggc_alloc<loop_exit> ();
1098 	  exit->e = e;
1099 
1100 	  exit->next = aloop->exits->next;
1101 	  exit->prev = aloop->exits;
1102 	  exit->next->prev = exit;
1103 	  exit->prev->next = exit;
1104 
1105 	  exit->next_e = exits;
1106 	  exits = exit;
1107 	}
1108     }
1109 
1110   if (!exits && new_edge)
1111     return;
1112 
1113   loop_exit **slot
1114     = current_loops->exits->find_slot_with_hash (e, htab_hash_pointer (e),
1115 						 exits ? INSERT : NO_INSERT);
1116   if (!slot)
1117     return;
1118 
1119   if (exits)
1120     {
1121       if (*slot)
1122 	loop_exit_hasher::remove (*slot);
1123       *slot = exits;
1124     }
1125   else
1126     current_loops->exits->clear_slot (slot);
1127 }
1128 
1129 /* For each loop, record list of exit edges, and start maintaining these
1130    lists.  */
1131 
1132 void
record_loop_exits(void)1133 record_loop_exits (void)
1134 {
1135   basic_block bb;
1136   edge_iterator ei;
1137   edge e;
1138 
1139   if (!current_loops)
1140     return;
1141 
1142   if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1143     return;
1144   loops_state_set (LOOPS_HAVE_RECORDED_EXITS);
1145 
1146   gcc_assert (current_loops->exits == NULL);
1147   current_loops->exits
1148     = hash_table<loop_exit_hasher>::create_ggc (2 * number_of_loops (cfun));
1149 
1150   FOR_EACH_BB_FN (bb, cfun)
1151     {
1152       FOR_EACH_EDGE (e, ei, bb->succs)
1153 	{
1154 	  rescan_loop_exit (e, true, false);
1155 	}
1156     }
1157 }
1158 
1159 /* Dumps information about the exit in *SLOT to FILE.
1160    Callback for htab_traverse.  */
1161 
1162 int
dump_recorded_exit(loop_exit ** slot,FILE * file)1163 dump_recorded_exit (loop_exit **slot, FILE *file)
1164 {
1165   struct loop_exit *exit = *slot;
1166   unsigned n = 0;
1167   edge e = exit->e;
1168 
1169   for (; exit != NULL; exit = exit->next_e)
1170     n++;
1171 
1172   fprintf (file, "Edge %d->%d exits %u loops\n",
1173 	   e->src->index, e->dest->index, n);
1174 
1175   return 1;
1176 }
1177 
1178 /* Dumps the recorded exits of loops to FILE.  */
1179 
1180 extern void dump_recorded_exits (FILE *);
1181 void
dump_recorded_exits(FILE * file)1182 dump_recorded_exits (FILE *file)
1183 {
1184   if (!current_loops->exits)
1185     return;
1186   current_loops->exits->traverse<FILE *, dump_recorded_exit> (file);
1187 }
1188 
1189 /* Releases lists of loop exits.  */
1190 
1191 void
release_recorded_exits(function * fn)1192 release_recorded_exits (function *fn)
1193 {
1194   gcc_assert (loops_state_satisfies_p (fn, LOOPS_HAVE_RECORDED_EXITS));
1195   loops_for_fn (fn)->exits->empty ();
1196   loops_for_fn (fn)->exits = NULL;
1197   loops_state_clear (fn, LOOPS_HAVE_RECORDED_EXITS);
1198 }
1199 
1200 /* Returns the list of the exit edges of a LOOP.  */
1201 
1202 auto_vec<edge>
get_loop_exit_edges(const class loop * loop,basic_block * body)1203 get_loop_exit_edges (const class loop *loop, basic_block *body)
1204 {
1205   auto_vec<edge> edges;
1206   edge e;
1207   unsigned i;
1208   edge_iterator ei;
1209   struct loop_exit *exit;
1210 
1211   gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
1212 
1213   /* If we maintain the lists of exits, use them.  Otherwise we must
1214      scan the body of the loop.  */
1215   if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1216     {
1217       for (exit = loop->exits->next; exit->e; exit = exit->next)
1218 	edges.safe_push (exit->e);
1219     }
1220   else
1221     {
1222       bool body_from_caller = true;
1223       if (!body)
1224 	{
1225 	  body = get_loop_body (loop);
1226 	  body_from_caller = false;
1227 	}
1228       for (i = 0; i < loop->num_nodes; i++)
1229 	FOR_EACH_EDGE (e, ei, body[i]->succs)
1230 	  {
1231 	    if (!flow_bb_inside_loop_p (loop, e->dest))
1232 	      edges.safe_push (e);
1233 	  }
1234       if (!body_from_caller)
1235 	free (body);
1236     }
1237 
1238   return edges;
1239 }
1240 
1241 /* Counts the number of conditional branches inside LOOP.  */
1242 
1243 unsigned
num_loop_branches(const class loop * loop)1244 num_loop_branches (const class loop *loop)
1245 {
1246   unsigned i, n;
1247   basic_block * body;
1248 
1249   gcc_assert (loop->latch != EXIT_BLOCK_PTR_FOR_FN (cfun));
1250 
1251   body = get_loop_body (loop);
1252   n = 0;
1253   for (i = 0; i < loop->num_nodes; i++)
1254     if (EDGE_COUNT (body[i]->succs) >= 2)
1255       n++;
1256   free (body);
1257 
1258   return n;
1259 }
1260 
1261 /* Adds basic block BB to LOOP.  */
1262 void
add_bb_to_loop(basic_block bb,class loop * loop)1263 add_bb_to_loop (basic_block bb, class loop *loop)
1264 {
1265   unsigned i;
1266   loop_p ploop;
1267   edge_iterator ei;
1268   edge e;
1269 
1270   gcc_assert (bb->loop_father == NULL);
1271   bb->loop_father = loop;
1272   loop->num_nodes++;
1273   FOR_EACH_VEC_SAFE_ELT (loop->superloops, i, ploop)
1274     ploop->num_nodes++;
1275 
1276   FOR_EACH_EDGE (e, ei, bb->succs)
1277     {
1278       rescan_loop_exit (e, true, false);
1279     }
1280   FOR_EACH_EDGE (e, ei, bb->preds)
1281     {
1282       rescan_loop_exit (e, true, false);
1283     }
1284 }
1285 
1286 /* Remove basic block BB from loops.  */
1287 void
remove_bb_from_loops(basic_block bb)1288 remove_bb_from_loops (basic_block bb)
1289 {
1290   unsigned i;
1291   class loop *loop = bb->loop_father;
1292   loop_p ploop;
1293   edge_iterator ei;
1294   edge e;
1295 
1296   gcc_assert (loop != NULL);
1297   loop->num_nodes--;
1298   FOR_EACH_VEC_SAFE_ELT (loop->superloops, i, ploop)
1299     ploop->num_nodes--;
1300   bb->loop_father = NULL;
1301 
1302   FOR_EACH_EDGE (e, ei, bb->succs)
1303     {
1304       rescan_loop_exit (e, false, true);
1305     }
1306   FOR_EACH_EDGE (e, ei, bb->preds)
1307     {
1308       rescan_loop_exit (e, false, true);
1309     }
1310 }
1311 
1312 /* Finds nearest common ancestor in loop tree for given loops.  */
1313 class loop *
find_common_loop(class loop * loop_s,class loop * loop_d)1314 find_common_loop (class loop *loop_s, class loop *loop_d)
1315 {
1316   unsigned sdepth, ddepth;
1317 
1318   if (!loop_s) return loop_d;
1319   if (!loop_d) return loop_s;
1320 
1321   sdepth = loop_depth (loop_s);
1322   ddepth = loop_depth (loop_d);
1323 
1324   if (sdepth < ddepth)
1325     loop_d = (*loop_d->superloops)[sdepth];
1326   else if (sdepth > ddepth)
1327     loop_s = (*loop_s->superloops)[ddepth];
1328 
1329   while (loop_s != loop_d)
1330     {
1331       loop_s = loop_outer (loop_s);
1332       loop_d = loop_outer (loop_d);
1333     }
1334   return loop_s;
1335 }
1336 
1337 /* Removes LOOP from structures and frees its data.  */
1338 
1339 void
delete_loop(class loop * loop)1340 delete_loop (class loop *loop)
1341 {
1342   /* Remove the loop from structure.  */
1343   flow_loop_tree_node_remove (loop);
1344 
1345   /* Remove loop from loops array.  */
1346   (*current_loops->larray)[loop->num] = NULL;
1347 
1348   /* Free loop data.  */
1349   flow_loop_free (loop);
1350 }
1351 
1352 /* Cancels the LOOP; it must be innermost one.  */
1353 
1354 static void
cancel_loop(class loop * loop)1355 cancel_loop (class loop *loop)
1356 {
1357   basic_block *bbs;
1358   unsigned i;
1359   class loop *outer = loop_outer (loop);
1360 
1361   gcc_assert (!loop->inner);
1362 
1363   /* Move blocks up one level (they should be removed as soon as possible).  */
1364   bbs = get_loop_body (loop);
1365   for (i = 0; i < loop->num_nodes; i++)
1366     bbs[i]->loop_father = outer;
1367 
1368   free (bbs);
1369   delete_loop (loop);
1370 }
1371 
1372 /* Cancels LOOP and all its subloops.  */
1373 void
cancel_loop_tree(class loop * loop)1374 cancel_loop_tree (class loop *loop)
1375 {
1376   while (loop->inner)
1377     cancel_loop_tree (loop->inner);
1378   cancel_loop (loop);
1379 }
1380 
1381 /* Disable warnings about missing quoting in GCC diagnostics for
1382    the verification errors.  Their format strings don't follow GCC
1383    diagnostic conventions and the calls are ultimately followed by
1384    a deliberate ICE triggered by a failed assertion.  */
1385 #if __GNUC__ >= 10
1386 #  pragma GCC diagnostic push
1387 #  pragma GCC diagnostic ignored "-Wformat-diag"
1388 #endif
1389 
1390 /* Checks that information about loops is correct
1391      -- sizes of loops are all right
1392      -- results of get_loop_body really belong to the loop
1393      -- loop header have just single entry edge and single latch edge
1394      -- loop latches have only single successor that is header of their loop
1395      -- irreducible loops are correctly marked
1396      -- the cached loop depth and loop father of each bb is correct
1397   */
1398 DEBUG_FUNCTION void
verify_loop_structure(void)1399 verify_loop_structure (void)
1400 {
1401   unsigned *sizes, i, j;
1402   basic_block bb, *bbs;
1403   int err = 0;
1404   edge e;
1405   unsigned num = number_of_loops (cfun);
1406   struct loop_exit *exit, *mexit;
1407   bool dom_available = dom_info_available_p (CDI_DOMINATORS);
1408 
1409   if (loops_state_satisfies_p (LOOPS_NEED_FIXUP))
1410     {
1411       error ("loop verification on loop tree that needs fixup");
1412       err = 1;
1413     }
1414 
1415   /* We need up-to-date dominators, compute or verify them.  */
1416   if (!dom_available)
1417     calculate_dominance_info (CDI_DOMINATORS);
1418   else
1419     verify_dominators (CDI_DOMINATORS);
1420 
1421   /* Check the loop tree root.  */
1422   if (current_loops->tree_root->header != ENTRY_BLOCK_PTR_FOR_FN (cfun)
1423       || current_loops->tree_root->latch != EXIT_BLOCK_PTR_FOR_FN (cfun)
1424       || (current_loops->tree_root->num_nodes
1425 	  != (unsigned) n_basic_blocks_for_fn (cfun)))
1426     {
1427       error ("corrupt loop tree root");
1428       err = 1;
1429     }
1430 
1431   /* Check the headers.  */
1432   FOR_EACH_BB_FN (bb, cfun)
1433     if (bb_loop_header_p (bb))
1434       {
1435 	if (bb->loop_father->header == NULL)
1436 	  {
1437 	    error ("loop with header %d marked for removal", bb->index);
1438 	    err = 1;
1439 	  }
1440 	else if (bb->loop_father->header != bb)
1441 	  {
1442 	    error ("loop with header %d not in loop tree", bb->index);
1443 	    err = 1;
1444 	  }
1445       }
1446     else if (bb->loop_father->header == bb)
1447       {
1448 	error ("non-loop with header %d not marked for removal", bb->index);
1449 	err = 1;
1450       }
1451 
1452   /* Check the recorded loop father and sizes of loops.  */
1453   auto_sbitmap visited (last_basic_block_for_fn (cfun));
1454   bitmap_clear (visited);
1455   bbs = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
1456   for (auto loop : loops_list (cfun, LI_FROM_INNERMOST))
1457     {
1458       unsigned n;
1459 
1460       if (loop->header == NULL)
1461 	{
1462 	  error ("removed loop %d in loop tree", loop->num);
1463 	  err = 1;
1464 	  continue;
1465 	}
1466 
1467       n = get_loop_body_with_size (loop, bbs, n_basic_blocks_for_fn (cfun));
1468       if (loop->num_nodes != n)
1469 	{
1470 	  error ("size of loop %d should be %d, not %d",
1471 		 loop->num, n, loop->num_nodes);
1472 	  err = 1;
1473 	}
1474 
1475       for (j = 0; j < n; j++)
1476 	{
1477 	  bb = bbs[j];
1478 
1479 	  if (!flow_bb_inside_loop_p (loop, bb))
1480 	    {
1481 	      error ("bb %d does not belong to loop %d",
1482 		     bb->index, loop->num);
1483 	      err = 1;
1484 	    }
1485 
1486 	  /* Ignore this block if it is in an inner loop.  */
1487 	  if (bitmap_bit_p (visited, bb->index))
1488 	    continue;
1489 	  bitmap_set_bit (visited, bb->index);
1490 
1491 	  if (bb->loop_father != loop)
1492 	    {
1493 	      error ("bb %d has father loop %d, should be loop %d",
1494 		     bb->index, bb->loop_father->num, loop->num);
1495 	      err = 1;
1496 	    }
1497 	}
1498     }
1499   free (bbs);
1500 
1501   /* Check headers and latches.  */
1502   for (auto loop : loops_list (cfun, 0))
1503     {
1504       i = loop->num;
1505       if (loop->header == NULL)
1506 	continue;
1507       if (!bb_loop_header_p (loop->header))
1508 	{
1509 	  error ("loop %d%'s header is not a loop header", i);
1510 	  err = 1;
1511 	}
1512       if (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
1513 	  && EDGE_COUNT (loop->header->preds) != 2)
1514 	{
1515 	  error ("loop %d%'s header does not have exactly 2 entries", i);
1516 	  err = 1;
1517 	}
1518       if (loop->latch)
1519 	{
1520 	  if (!find_edge (loop->latch, loop->header))
1521 	    {
1522 	      error ("loop %d%'s latch does not have an edge to its header", i);
1523 	      err = 1;
1524 	    }
1525 	  if (!dominated_by_p (CDI_DOMINATORS, loop->latch, loop->header))
1526 	    {
1527 	      error ("loop %d%'s latch is not dominated by its header", i);
1528 	      err = 1;
1529 	    }
1530 	}
1531       if (loops_state_satisfies_p (LOOPS_HAVE_SIMPLE_LATCHES))
1532 	{
1533 	  if (!single_succ_p (loop->latch))
1534 	    {
1535 	      error ("loop %d%'s latch does not have exactly 1 successor", i);
1536 	      err = 1;
1537 	    }
1538 	  if (single_succ (loop->latch) != loop->header)
1539 	    {
1540 	      error ("loop %d%'s latch does not have header as successor", i);
1541 	      err = 1;
1542 	    }
1543 	  if (loop->latch->loop_father != loop)
1544 	    {
1545 	      error ("loop %d%'s latch does not belong directly to it", i);
1546 	      err = 1;
1547 	    }
1548 	}
1549       if (loop->header->loop_father != loop)
1550 	{
1551 	  error ("loop %d%'s header does not belong directly to it", i);
1552 	  err = 1;
1553 	}
1554       if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
1555 	{
1556 	  edge_iterator ei;
1557 	  FOR_EACH_EDGE (e, ei, loop->header->preds)
1558 	    if (dominated_by_p (CDI_DOMINATORS, e->src, loop->header)
1559 		&& e->flags & EDGE_IRREDUCIBLE_LOOP)
1560 	      {
1561 		error ("loop %d%'s latch is marked as part of irreducible"
1562 		       " region", i);
1563 		err = 1;
1564 	      }
1565 	}
1566 
1567       /* Check cached number of iterations for released SSA names.  */
1568       tree ref;
1569       if (loop->nb_iterations
1570 	  && (ref = walk_tree (&loop->nb_iterations,
1571 			       find_released_ssa_name, NULL, NULL)))
1572 	{
1573 	  error ("loop %d%'s number of iterations %qE references the"
1574 		 " released SSA name %qE", i, loop->nb_iterations, ref);
1575 	  err = 1;
1576 	}
1577     }
1578 
1579   /* Check irreducible loops.  */
1580   if (loops_state_satisfies_p (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
1581     {
1582       auto_edge_flag saved_edge_irr (cfun);
1583       auto_bb_flag saved_bb_irr (cfun);
1584       /* Save old info.  */
1585       FOR_EACH_BB_FN (bb, cfun)
1586 	{
1587 	  edge_iterator ei;
1588 	  if (bb->flags & BB_IRREDUCIBLE_LOOP)
1589 	    bb->flags |= saved_bb_irr;
1590 	  FOR_EACH_EDGE (e, ei, bb->succs)
1591 	    if (e->flags & EDGE_IRREDUCIBLE_LOOP)
1592 	      e->flags |= saved_edge_irr;
1593 	}
1594 
1595       /* Recount it.  */
1596       mark_irreducible_loops ();
1597 
1598       /* Compare.  */
1599       FOR_EACH_BB_FN (bb, cfun)
1600 	{
1601 	  edge_iterator ei;
1602 
1603 	  if ((bb->flags & BB_IRREDUCIBLE_LOOP)
1604 	      && !(bb->flags & saved_bb_irr))
1605 	    {
1606 	      error ("basic block %d should be marked irreducible", bb->index);
1607 	      err = 1;
1608 	    }
1609 	  else if (!(bb->flags & BB_IRREDUCIBLE_LOOP)
1610 		   && (bb->flags & saved_bb_irr))
1611 	    {
1612 	      error ("basic block %d should not be marked irreducible", bb->index);
1613 	      err = 1;
1614 	    }
1615 	  bb->flags &= ~saved_bb_irr;
1616 	  FOR_EACH_EDGE (e, ei, bb->succs)
1617 	    {
1618 	      if ((e->flags & EDGE_IRREDUCIBLE_LOOP)
1619 		  && !(e->flags & saved_edge_irr))
1620 		{
1621 		  error ("edge from %d to %d should be marked irreducible",
1622 			 e->src->index, e->dest->index);
1623 		  err = 1;
1624 		}
1625 	      else if (!(e->flags & EDGE_IRREDUCIBLE_LOOP)
1626 		       && (e->flags & saved_edge_irr))
1627 		{
1628 		  error ("edge from %d to %d should not be marked irreducible",
1629 			 e->src->index, e->dest->index);
1630 		  err = 1;
1631 		}
1632 	      e->flags &= ~saved_edge_irr;
1633 	    }
1634 	}
1635     }
1636 
1637   /* Check the recorded loop exits.  */
1638   for (auto loop : loops_list (cfun, 0))
1639     {
1640       if (!loop->exits || loop->exits->e != NULL)
1641 	{
1642 	  error ("corrupted head of the exits list of loop %d",
1643 		 loop->num);
1644 	  err = 1;
1645 	}
1646       else
1647 	{
1648 	  /* Check that the list forms a cycle, and all elements except
1649 	     for the head are nonnull.  */
1650 	  for (mexit = loop->exits, exit = mexit->next, i = 0;
1651 	       exit->e && exit != mexit;
1652 	       exit = exit->next)
1653 	    {
1654 	      if (i++ & 1)
1655 		mexit = mexit->next;
1656 	    }
1657 
1658 	  if (exit != loop->exits)
1659 	    {
1660 	      error ("corrupted exits list of loop %d", loop->num);
1661 	      err = 1;
1662 	    }
1663 	}
1664 
1665       if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1666 	{
1667 	  if (loop->exits->next != loop->exits)
1668 	    {
1669 	      error ("nonempty exits list of loop %d, but exits are not recorded",
1670 		     loop->num);
1671 	      err = 1;
1672 	    }
1673 	}
1674     }
1675 
1676   if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1677     {
1678       unsigned n_exits = 0, eloops;
1679 
1680       sizes = XCNEWVEC (unsigned, num);
1681       memset (sizes, 0, sizeof (unsigned) * num);
1682       FOR_EACH_BB_FN (bb, cfun)
1683 	{
1684 	  edge_iterator ei;
1685 	  if (bb->loop_father == current_loops->tree_root)
1686 	    continue;
1687 	  FOR_EACH_EDGE (e, ei, bb->succs)
1688 	    {
1689 	      if (flow_bb_inside_loop_p (bb->loop_father, e->dest))
1690 		continue;
1691 
1692 	      n_exits++;
1693 	      exit = get_exit_descriptions (e);
1694 	      if (!exit)
1695 		{
1696 		  error ("exit %d->%d not recorded",
1697 			 e->src->index, e->dest->index);
1698 		  err = 1;
1699 		}
1700 	      eloops = 0;
1701 	      for (; exit; exit = exit->next_e)
1702 		eloops++;
1703 
1704 	      for (class loop *loop = bb->loop_father;
1705 		   loop != e->dest->loop_father
1706 		   /* When a loop exit is also an entry edge which
1707 		      can happen when avoiding CFG manipulations
1708 		      then the last loop exited is the outer loop
1709 		      of the loop entered.  */
1710 		   && loop != loop_outer (e->dest->loop_father);
1711 		   loop = loop_outer (loop))
1712 		{
1713 		  eloops--;
1714 		  sizes[loop->num]++;
1715 		}
1716 
1717 	      if (eloops != 0)
1718 		{
1719 		  error ("wrong list of exited loops for edge %d->%d",
1720 			 e->src->index, e->dest->index);
1721 		  err = 1;
1722 		}
1723 	    }
1724 	}
1725 
1726       if (n_exits != current_loops->exits->elements ())
1727 	{
1728 	  error ("too many loop exits recorded");
1729 	  err = 1;
1730 	}
1731 
1732       for (auto loop : loops_list (cfun, 0))
1733 	{
1734 	  eloops = 0;
1735 	  for (exit = loop->exits->next; exit->e; exit = exit->next)
1736 	    eloops++;
1737 	  if (eloops != sizes[loop->num])
1738 	    {
1739 	      error ("%d exits recorded for loop %d (having %d exits)",
1740 		     eloops, loop->num, sizes[loop->num]);
1741 	      err = 1;
1742 	    }
1743 	}
1744 
1745       free (sizes);
1746     }
1747 
1748   gcc_assert (!err);
1749 
1750   if (!dom_available)
1751     free_dominance_info (CDI_DOMINATORS);
1752 }
1753 
1754 #if __GNUC__ >= 10
1755 #  pragma GCC diagnostic pop
1756 #endif
1757 
1758 /* Returns latch edge of LOOP.  */
1759 edge
loop_latch_edge(const class loop * loop)1760 loop_latch_edge (const class loop *loop)
1761 {
1762   return find_edge (loop->latch, loop->header);
1763 }
1764 
1765 /* Returns preheader edge of LOOP.  */
1766 edge
loop_preheader_edge(const class loop * loop)1767 loop_preheader_edge (const class loop *loop)
1768 {
1769   edge e;
1770   edge_iterator ei;
1771 
1772   gcc_assert (loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS)
1773 	      && ! loops_state_satisfies_p (LOOPS_MAY_HAVE_MULTIPLE_LATCHES));
1774 
1775   FOR_EACH_EDGE (e, ei, loop->header->preds)
1776     if (e->src != loop->latch)
1777       break;
1778 
1779   if (! e)
1780     {
1781       gcc_assert (! loop_outer (loop));
1782       return single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun));
1783     }
1784 
1785   return e;
1786 }
1787 
1788 /* Returns true if E is an exit of LOOP.  */
1789 
1790 bool
loop_exit_edge_p(const class loop * loop,const_edge e)1791 loop_exit_edge_p (const class loop *loop, const_edge e)
1792 {
1793   return (flow_bb_inside_loop_p (loop, e->src)
1794 	  && !flow_bb_inside_loop_p (loop, e->dest));
1795 }
1796 
1797 /* Returns the single exit edge of LOOP, or NULL if LOOP has either no exit
1798    or more than one exit.  If loops do not have the exits recorded, NULL
1799    is returned always.  */
1800 
1801 edge
single_exit(const class loop * loop)1802 single_exit (const class loop *loop)
1803 {
1804   struct loop_exit *exit = loop->exits->next;
1805 
1806   if (!loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS))
1807     return NULL;
1808 
1809   if (exit->e && exit->next == loop->exits)
1810     return exit->e;
1811   else
1812     return NULL;
1813 }
1814 
1815 /* Returns true when BB has an incoming edge exiting LOOP.  */
1816 
1817 bool
loop_exits_to_bb_p(class loop * loop,basic_block bb)1818 loop_exits_to_bb_p (class loop *loop, basic_block bb)
1819 {
1820   edge e;
1821   edge_iterator ei;
1822 
1823   FOR_EACH_EDGE (e, ei, bb->preds)
1824     if (loop_exit_edge_p (loop, e))
1825       return true;
1826 
1827   return false;
1828 }
1829 
1830 /* Returns true when BB has an outgoing edge exiting LOOP.  */
1831 
1832 bool
loop_exits_from_bb_p(class loop * loop,basic_block bb)1833 loop_exits_from_bb_p (class loop *loop, basic_block bb)
1834 {
1835   edge e;
1836   edge_iterator ei;
1837 
1838   FOR_EACH_EDGE (e, ei, bb->succs)
1839     if (loop_exit_edge_p (loop, e))
1840       return true;
1841 
1842   return false;
1843 }
1844 
1845 /* Return location corresponding to the loop control condition if possible.  */
1846 
1847 dump_user_location_t
get_loop_location(class loop * loop)1848 get_loop_location (class loop *loop)
1849 {
1850   rtx_insn *insn = NULL;
1851   class niter_desc *desc = NULL;
1852   edge exit;
1853 
1854   /* For a for or while loop, we would like to return the location
1855      of the for or while statement, if possible.  To do this, look
1856      for the branch guarding the loop back-edge.  */
1857 
1858   /* If this is a simple loop with an in_edge, then the loop control
1859      branch is typically at the end of its source.  */
1860   desc = get_simple_loop_desc (loop);
1861   if (desc->in_edge)
1862     {
1863       FOR_BB_INSNS_REVERSE (desc->in_edge->src, insn)
1864         {
1865           if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1866             return insn;
1867         }
1868     }
1869   /* If loop has a single exit, then the loop control branch
1870      must be at the end of its source.  */
1871   if ((exit = single_exit (loop)))
1872     {
1873       FOR_BB_INSNS_REVERSE (exit->src, insn)
1874         {
1875           if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1876             return insn;
1877         }
1878     }
1879   /* Next check the latch, to see if it is non-empty.  */
1880   FOR_BB_INSNS_REVERSE (loop->latch, insn)
1881     {
1882       if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1883         return insn;
1884     }
1885   /* Finally, if none of the above identifies the loop control branch,
1886      return the first location in the loop header.  */
1887   FOR_BB_INSNS (loop->header, insn)
1888     {
1889       if (INSN_P (insn) && INSN_HAS_LOCATION (insn))
1890         return insn;
1891     }
1892   /* If all else fails, simply return the current function location.  */
1893   return dump_user_location_t::from_function_decl (current_function_decl);
1894 }
1895 
1896 /* Records that every statement in LOOP is executed I_BOUND times.
1897    REALISTIC is true if I_BOUND is expected to be close to the real number
1898    of iterations.  UPPER is true if we are sure the loop iterates at most
1899    I_BOUND times.  */
1900 
1901 void
record_niter_bound(class loop * loop,const widest_int & i_bound,bool realistic,bool upper)1902 record_niter_bound (class loop *loop, const widest_int &i_bound,
1903 		    bool realistic, bool upper)
1904 {
1905   /* Update the bounds only when there is no previous estimation, or when the
1906      current estimation is smaller.  */
1907   if (upper
1908       && (!loop->any_upper_bound
1909 	  || wi::ltu_p (i_bound, loop->nb_iterations_upper_bound)))
1910     {
1911       loop->any_upper_bound = true;
1912       loop->nb_iterations_upper_bound = i_bound;
1913       if (!loop->any_likely_upper_bound)
1914 	{
1915 	  loop->any_likely_upper_bound = true;
1916 	  loop->nb_iterations_likely_upper_bound = i_bound;
1917 	}
1918     }
1919   if (realistic
1920       && (!loop->any_estimate
1921 	  || wi::ltu_p (i_bound, loop->nb_iterations_estimate)))
1922     {
1923       loop->any_estimate = true;
1924       loop->nb_iterations_estimate = i_bound;
1925     }
1926   if (!realistic
1927       && (!loop->any_likely_upper_bound
1928           || wi::ltu_p (i_bound, loop->nb_iterations_likely_upper_bound)))
1929     {
1930       loop->any_likely_upper_bound = true;
1931       loop->nb_iterations_likely_upper_bound = i_bound;
1932     }
1933 
1934   /* If an upper bound is smaller than the realistic estimate of the
1935      number of iterations, use the upper bound instead.  */
1936   if (loop->any_upper_bound
1937       && loop->any_estimate
1938       && wi::ltu_p (loop->nb_iterations_upper_bound,
1939 		    loop->nb_iterations_estimate))
1940     loop->nb_iterations_estimate = loop->nb_iterations_upper_bound;
1941   if (loop->any_upper_bound
1942       && loop->any_likely_upper_bound
1943       && wi::ltu_p (loop->nb_iterations_upper_bound,
1944 		    loop->nb_iterations_likely_upper_bound))
1945     loop->nb_iterations_likely_upper_bound = loop->nb_iterations_upper_bound;
1946 }
1947 
1948 /* Similar to get_estimated_loop_iterations, but returns the estimate only
1949    if it fits to HOST_WIDE_INT.  If this is not the case, or the estimate
1950    on the number of iterations of LOOP could not be derived, returns -1.  */
1951 
1952 HOST_WIDE_INT
get_estimated_loop_iterations_int(class loop * loop)1953 get_estimated_loop_iterations_int (class loop *loop)
1954 {
1955   widest_int nit;
1956   HOST_WIDE_INT hwi_nit;
1957 
1958   if (!get_estimated_loop_iterations (loop, &nit))
1959     return -1;
1960 
1961   if (!wi::fits_shwi_p (nit))
1962     return -1;
1963   hwi_nit = nit.to_shwi ();
1964 
1965   return hwi_nit < 0 ? -1 : hwi_nit;
1966 }
1967 
1968 /* Returns an upper bound on the number of executions of statements
1969    in the LOOP.  For statements before the loop exit, this exceeds
1970    the number of execution of the latch by one.  */
1971 
1972 HOST_WIDE_INT
max_stmt_executions_int(class loop * loop)1973 max_stmt_executions_int (class loop *loop)
1974 {
1975   HOST_WIDE_INT nit = get_max_loop_iterations_int (loop);
1976   HOST_WIDE_INT snit;
1977 
1978   if (nit == -1)
1979     return -1;
1980 
1981   snit = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) nit + 1);
1982 
1983   /* If the computation overflows, return -1.  */
1984   return snit < 0 ? -1 : snit;
1985 }
1986 
1987 /* Returns an likely upper bound on the number of executions of statements
1988    in the LOOP.  For statements before the loop exit, this exceeds
1989    the number of execution of the latch by one.  */
1990 
1991 HOST_WIDE_INT
likely_max_stmt_executions_int(class loop * loop)1992 likely_max_stmt_executions_int (class loop *loop)
1993 {
1994   HOST_WIDE_INT nit = get_likely_max_loop_iterations_int (loop);
1995   HOST_WIDE_INT snit;
1996 
1997   if (nit == -1)
1998     return -1;
1999 
2000   snit = (HOST_WIDE_INT) ((unsigned HOST_WIDE_INT) nit + 1);
2001 
2002   /* If the computation overflows, return -1.  */
2003   return snit < 0 ? -1 : snit;
2004 }
2005 
2006 /* Sets NIT to the estimated number of executions of the latch of the
2007    LOOP.  If we have no reliable estimate, the function returns false, otherwise
2008    returns true.  */
2009 
2010 bool
get_estimated_loop_iterations(class loop * loop,widest_int * nit)2011 get_estimated_loop_iterations (class loop *loop, widest_int *nit)
2012 {
2013   /* Even if the bound is not recorded, possibly we can derrive one from
2014      profile.  */
2015   if (!loop->any_estimate)
2016     {
2017       if (loop->header->count.reliable_p ())
2018 	{
2019           *nit = gcov_type_to_wide_int
2020 		   (expected_loop_iterations_unbounded (loop) + 1);
2021 	  return true;
2022 	}
2023       return false;
2024     }
2025 
2026   *nit = loop->nb_iterations_estimate;
2027   return true;
2028 }
2029 
2030 /* Sets NIT to an upper bound for the maximum number of executions of the
2031    latch of the LOOP.  If we have no reliable estimate, the function returns
2032    false, otherwise returns true.  */
2033 
2034 bool
get_max_loop_iterations(const class loop * loop,widest_int * nit)2035 get_max_loop_iterations (const class loop *loop, widest_int *nit)
2036 {
2037   if (!loop->any_upper_bound)
2038     return false;
2039 
2040   *nit = loop->nb_iterations_upper_bound;
2041   return true;
2042 }
2043 
2044 /* Similar to get_max_loop_iterations, but returns the estimate only
2045    if it fits to HOST_WIDE_INT.  If this is not the case, or the estimate
2046    on the number of iterations of LOOP could not be derived, returns -1.  */
2047 
2048 HOST_WIDE_INT
get_max_loop_iterations_int(const class loop * loop)2049 get_max_loop_iterations_int (const class loop *loop)
2050 {
2051   widest_int nit;
2052   HOST_WIDE_INT hwi_nit;
2053 
2054   if (!get_max_loop_iterations (loop, &nit))
2055     return -1;
2056 
2057   if (!wi::fits_shwi_p (nit))
2058     return -1;
2059   hwi_nit = nit.to_shwi ();
2060 
2061   return hwi_nit < 0 ? -1 : hwi_nit;
2062 }
2063 
2064 /* Sets NIT to an upper bound for the maximum number of executions of the
2065    latch of the LOOP.  If we have no reliable estimate, the function returns
2066    false, otherwise returns true.  */
2067 
2068 bool
get_likely_max_loop_iterations(class loop * loop,widest_int * nit)2069 get_likely_max_loop_iterations (class loop *loop, widest_int *nit)
2070 {
2071   if (!loop->any_likely_upper_bound)
2072     return false;
2073 
2074   *nit = loop->nb_iterations_likely_upper_bound;
2075   return true;
2076 }
2077 
2078 /* Similar to get_max_loop_iterations, but returns the estimate only
2079    if it fits to HOST_WIDE_INT.  If this is not the case, or the estimate
2080    on the number of iterations of LOOP could not be derived, returns -1.  */
2081 
2082 HOST_WIDE_INT
get_likely_max_loop_iterations_int(class loop * loop)2083 get_likely_max_loop_iterations_int (class loop *loop)
2084 {
2085   widest_int nit;
2086   HOST_WIDE_INT hwi_nit;
2087 
2088   if (!get_likely_max_loop_iterations (loop, &nit))
2089     return -1;
2090 
2091   if (!wi::fits_shwi_p (nit))
2092     return -1;
2093   hwi_nit = nit.to_shwi ();
2094 
2095   return hwi_nit < 0 ? -1 : hwi_nit;
2096 }
2097 
2098 /* Returns the loop depth of the loop BB belongs to.  */
2099 
2100 int
bb_loop_depth(const_basic_block bb)2101 bb_loop_depth (const_basic_block bb)
2102 {
2103   return bb->loop_father ? loop_depth (bb->loop_father) : 0;
2104 }
2105 
2106 /* Marks LOOP for removal and sets LOOPS_NEED_FIXUP.  */
2107 
2108 void
mark_loop_for_removal(loop_p loop)2109 mark_loop_for_removal (loop_p loop)
2110 {
2111   if (loop->header == NULL)
2112     return;
2113   loop->former_header = loop->header;
2114   loop->header = NULL;
2115   loop->latch = NULL;
2116   loops_state_set (LOOPS_NEED_FIXUP);
2117 }
2118 
2119 /* Starting from loop tree ROOT, walk loop tree as the visiting
2120    order specified by FLAGS.  The supported visiting orders
2121    are:
2122      - LI_ONLY_INNERMOST
2123      - LI_FROM_INNERMOST
2124      - Preorder (if neither of above is specified)  */
2125 
2126 void
walk_loop_tree(class loop * root,unsigned flags)2127 loops_list::walk_loop_tree (class loop *root, unsigned flags)
2128 {
2129   bool only_innermost_p = flags & LI_ONLY_INNERMOST;
2130   bool from_innermost_p = flags & LI_FROM_INNERMOST;
2131   bool preorder_p = !(only_innermost_p || from_innermost_p);
2132 
2133   /* Early handle root without any inner loops, make later
2134      processing simpler, that is all loops processed in the
2135      following while loop are impossible to be root.  */
2136   if (!root->inner)
2137     {
2138       if (flags & LI_INCLUDE_ROOT)
2139 	this->to_visit.quick_push (root->num);
2140       return;
2141     }
2142   else if (preorder_p && flags & LI_INCLUDE_ROOT)
2143     this->to_visit.quick_push (root->num);
2144 
2145   class loop *aloop;
2146   for (aloop = root->inner;
2147        aloop->inner != NULL;
2148        aloop = aloop->inner)
2149     {
2150       if (preorder_p)
2151 	this->to_visit.quick_push (aloop->num);
2152       continue;
2153     }
2154 
2155   while (1)
2156     {
2157       gcc_assert (aloop != root);
2158       if (from_innermost_p || aloop->inner == NULL)
2159 	this->to_visit.quick_push (aloop->num);
2160 
2161       if (aloop->next)
2162 	{
2163 	  for (aloop = aloop->next;
2164 	       aloop->inner != NULL;
2165 	       aloop = aloop->inner)
2166 	    {
2167 	      if (preorder_p)
2168 		this->to_visit.quick_push (aloop->num);
2169 	      continue;
2170 	    }
2171 	}
2172       else if (loop_outer (aloop) == root)
2173 	break;
2174       else
2175 	aloop = loop_outer (aloop);
2176     }
2177 
2178   /* When visiting from innermost, we need to consider root here
2179      since the previous while loop doesn't handle it.  */
2180   if (from_innermost_p && flags & LI_INCLUDE_ROOT)
2181     this->to_visit.quick_push (root->num);
2182 }
2183 
2184