1 /* Control flow graph manipulation code for GNU compiler.
2    Copyright (C) 1987-2021 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 /* This file contains low level functions to manipulate the CFG and
21    analyze it.  All other modules should not transform the data structure
22    directly and use abstraction instead.  The file is supposed to be
23    ordered bottom-up and should not contain any code dependent on a
24    particular intermediate language (RTL or trees).
25 
26    Available functionality:
27      - Initialization/deallocation
28 	 init_flow, free_cfg
29      - Low level basic block manipulation
30 	 alloc_block, expunge_block
31      - Edge manipulation
32 	 make_edge, make_single_succ_edge, cached_make_edge, remove_edge
33 	 - Low level edge redirection (without updating instruction chain)
34 	     redirect_edge_succ, redirect_edge_succ_nodup, redirect_edge_pred
35      - Dumping and debugging
36 	 dump_flow_info, debug_flow_info, dump_edge_info
37      - Allocation of AUX fields for basic blocks
38 	 alloc_aux_for_blocks, free_aux_for_blocks, alloc_aux_for_block
39      - clear_bb_flags
40      - Consistency checking
41 	 verify_flow_info
42      - Dumping and debugging
43 	 print_rtl_with_bb, dump_bb, debug_bb, debug_bb_n
44 
45    TODO: Document these "Available functionality" functions in the files
46    that implement them.
47  */
48 
49 #include "config.h"
50 #include "system.h"
51 #include "coretypes.h"
52 #include "backend.h"
53 #include "hard-reg-set.h"
54 #include "tree.h"
55 #include "cfghooks.h"
56 #include "df.h"
57 #include "cfganal.h"
58 #include "cfgloop.h" /* FIXME: For struct loop.  */
59 #include "dumpfile.h"
60 
61 
62 
63 /* Called once at initialization time.  */
64 
65 void
init_flow(struct function * the_fun)66 init_flow (struct function *the_fun)
67 {
68   if (!the_fun->cfg)
69     the_fun->cfg = ggc_cleared_alloc<control_flow_graph> ();
70   n_edges_for_fn (the_fun) = 0;
71   the_fun->cfg->count_max = profile_count::uninitialized ();
72   ENTRY_BLOCK_PTR_FOR_FN (the_fun)
73     = alloc_block ();
74   ENTRY_BLOCK_PTR_FOR_FN (the_fun)->index = ENTRY_BLOCK;
75   EXIT_BLOCK_PTR_FOR_FN (the_fun)
76     = alloc_block ();
77   EXIT_BLOCK_PTR_FOR_FN (the_fun)->index = EXIT_BLOCK;
78   ENTRY_BLOCK_PTR_FOR_FN (the_fun)->next_bb
79     = EXIT_BLOCK_PTR_FOR_FN (the_fun);
80   EXIT_BLOCK_PTR_FOR_FN (the_fun)->prev_bb
81     = ENTRY_BLOCK_PTR_FOR_FN (the_fun);
82   the_fun->cfg->edge_flags_allocated = EDGE_ALL_FLAGS;
83   the_fun->cfg->bb_flags_allocated = BB_ALL_FLAGS;
84 }
85 
86 /* Helper function for remove_edge and free_cffg.  Frees edge structure
87    without actually removing it from the pred/succ arrays.  */
88 
89 static void
free_edge(function * fn,edge e)90 free_edge (function *fn, edge e)
91 {
92   n_edges_for_fn (fn)--;
93   ggc_free (e);
94 }
95 
96 /* Free basic block BB.  */
97 
98 static void
free_block(basic_block bb)99 free_block (basic_block bb)
100 {
101    vec_free (bb->succs);
102    bb->succs = NULL;
103    vec_free (bb->preds);
104    bb->preds = NULL;
105    ggc_free (bb);
106 }
107 
108 /* Free the memory associated with the CFG in FN.  */
109 
110 void
free_cfg(struct function * fn)111 free_cfg (struct function *fn)
112 {
113   edge e;
114   edge_iterator ei;
115   basic_block next;
116 
117   for (basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (fn); bb; bb = next)
118     {
119       next = bb->next_bb;
120       FOR_EACH_EDGE (e, ei, bb->succs)
121 	free_edge (fn, e);
122       free_block (bb);
123     }
124 
125   gcc_assert (!n_edges_for_fn (fn));
126   /* Sanity check that dominance tree is freed.  */
127   gcc_assert (!fn->cfg->x_dom_computed[0] && !fn->cfg->x_dom_computed[1]);
128 
129   vec_free (fn->cfg->x_label_to_block_map);
130   vec_free (basic_block_info_for_fn (fn));
131   ggc_free (fn->cfg);
132   fn->cfg = NULL;
133 }
134 
135 /* Allocate memory for basic_block.  */
136 
137 basic_block
alloc_block(void)138 alloc_block (void)
139 {
140   basic_block bb;
141   bb = ggc_cleared_alloc<basic_block_def> ();
142   bb->count = profile_count::uninitialized ();
143   return bb;
144 }
145 
146 /* Link block B to chain after AFTER.  */
147 void
link_block(basic_block b,basic_block after)148 link_block (basic_block b, basic_block after)
149 {
150   b->next_bb = after->next_bb;
151   b->prev_bb = after;
152   after->next_bb = b;
153   b->next_bb->prev_bb = b;
154 }
155 
156 /* Unlink block B from chain.  */
157 void
unlink_block(basic_block b)158 unlink_block (basic_block b)
159 {
160   b->next_bb->prev_bb = b->prev_bb;
161   b->prev_bb->next_bb = b->next_bb;
162   b->prev_bb = NULL;
163   b->next_bb = NULL;
164 }
165 
166 /* Sequentially order blocks and compact the arrays.  */
167 void
compact_blocks(void)168 compact_blocks (void)
169 {
170   int i;
171 
172   SET_BASIC_BLOCK_FOR_FN (cfun, ENTRY_BLOCK, ENTRY_BLOCK_PTR_FOR_FN (cfun));
173   SET_BASIC_BLOCK_FOR_FN (cfun, EXIT_BLOCK, EXIT_BLOCK_PTR_FOR_FN (cfun));
174 
175   if (df)
176     df_compact_blocks ();
177   else
178     {
179       basic_block bb;
180 
181       i = NUM_FIXED_BLOCKS;
182       FOR_EACH_BB_FN (bb, cfun)
183 	{
184 	  SET_BASIC_BLOCK_FOR_FN (cfun, i, bb);
185 	  bb->index = i;
186 	  i++;
187 	}
188       gcc_assert (i == n_basic_blocks_for_fn (cfun));
189 
190       for (; i < last_basic_block_for_fn (cfun); i++)
191 	SET_BASIC_BLOCK_FOR_FN (cfun, i, NULL);
192     }
193   last_basic_block_for_fn (cfun) = n_basic_blocks_for_fn (cfun);
194 }
195 
196 /* Remove block B from the basic block array.  */
197 
198 void
expunge_block(basic_block b)199 expunge_block (basic_block b)
200 {
201   unlink_block (b);
202   SET_BASIC_BLOCK_FOR_FN (cfun, b->index, NULL);
203   n_basic_blocks_for_fn (cfun)--;
204   /* We should be able to ggc_free here, but we are not.
205      The dead SSA_NAMES are left pointing to dead statements that are pointing
206      to dead basic blocks making garbage collector to die.
207      We should be able to release all dead SSA_NAMES and at the same time we
208      should clear out BB pointer of dead statements consistently.  */
209 }
210 
211 /* Connect E to E->src.  */
212 
213 static inline void
connect_src(edge e)214 connect_src (edge e)
215 {
216   vec_safe_push (e->src->succs, e);
217   df_mark_solutions_dirty ();
218 }
219 
220 /* Connect E to E->dest.  */
221 
222 static inline void
connect_dest(edge e)223 connect_dest (edge e)
224 {
225   basic_block dest = e->dest;
226   vec_safe_push (dest->preds, e);
227   e->dest_idx = EDGE_COUNT (dest->preds) - 1;
228   df_mark_solutions_dirty ();
229 }
230 
231 /* Disconnect edge E from E->src.  */
232 
233 static inline void
disconnect_src(edge e)234 disconnect_src (edge e)
235 {
236   basic_block src = e->src;
237   edge_iterator ei;
238   edge tmp;
239 
240   for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
241     {
242       if (tmp == e)
243 	{
244 	  src->succs->unordered_remove (ei.index);
245 	  df_mark_solutions_dirty ();
246 	  return;
247 	}
248       else
249 	ei_next (&ei);
250     }
251 
252   gcc_unreachable ();
253 }
254 
255 /* Disconnect edge E from E->dest.  */
256 
257 static inline void
disconnect_dest(edge e)258 disconnect_dest (edge e)
259 {
260   basic_block dest = e->dest;
261   unsigned int dest_idx = e->dest_idx;
262 
263   dest->preds->unordered_remove (dest_idx);
264 
265   /* If we removed an edge in the middle of the edge vector, we need
266      to update dest_idx of the edge that moved into the "hole".  */
267   if (dest_idx < EDGE_COUNT (dest->preds))
268     EDGE_PRED (dest, dest_idx)->dest_idx = dest_idx;
269   df_mark_solutions_dirty ();
270 }
271 
272 /* Create an edge connecting SRC and DEST with flags FLAGS.  Return newly
273    created edge.  Use this only if you are sure that this edge can't
274    possibly already exist.  */
275 
276 edge
unchecked_make_edge(basic_block src,basic_block dst,int flags)277 unchecked_make_edge (basic_block src, basic_block dst, int flags)
278 {
279   edge e;
280   e = ggc_cleared_alloc<edge_def> ();
281   n_edges_for_fn (cfun)++;
282 
283   e->probability = profile_probability::uninitialized ();
284   e->src = src;
285   e->dest = dst;
286   e->flags = flags;
287 
288   connect_src (e);
289   connect_dest (e);
290 
291   execute_on_growing_pred (e);
292   return e;
293 }
294 
295 /* Create an edge connecting SRC and DST with FLAGS optionally using
296    edge cache CACHE.  Return the new edge, NULL if already exist.  */
297 
298 edge
cached_make_edge(sbitmap edge_cache,basic_block src,basic_block dst,int flags)299 cached_make_edge (sbitmap edge_cache, basic_block src, basic_block dst, int flags)
300 {
301   if (edge_cache == NULL
302       || src == ENTRY_BLOCK_PTR_FOR_FN (cfun)
303       || dst == EXIT_BLOCK_PTR_FOR_FN (cfun))
304     return make_edge (src, dst, flags);
305 
306   /* Does the requested edge already exist?  */
307   if (! bitmap_bit_p (edge_cache, dst->index))
308     {
309       /* The edge does not exist.  Create one and update the
310 	 cache.  */
311       bitmap_set_bit (edge_cache, dst->index);
312       return unchecked_make_edge (src, dst, flags);
313     }
314 
315   /* At this point, we know that the requested edge exists.  Adjust
316      flags if necessary.  */
317   if (flags)
318     {
319       edge e = find_edge (src, dst);
320       e->flags |= flags;
321     }
322 
323   return NULL;
324 }
325 
326 /* Create an edge connecting SRC and DEST with flags FLAGS.  Return newly
327    created edge or NULL if already exist.  */
328 
329 edge
make_edge(basic_block src,basic_block dest,int flags)330 make_edge (basic_block src, basic_block dest, int flags)
331 {
332   edge e = find_edge (src, dest);
333 
334   /* Make sure we don't add duplicate edges.  */
335   if (e)
336     {
337       e->flags |= flags;
338       return NULL;
339     }
340 
341   return unchecked_make_edge (src, dest, flags);
342 }
343 
344 /* Create an edge connecting SRC to DEST and set probability by knowing
345    that it is the single edge leaving SRC.  */
346 
347 edge
make_single_succ_edge(basic_block src,basic_block dest,int flags)348 make_single_succ_edge (basic_block src, basic_block dest, int flags)
349 {
350   edge e = make_edge (src, dest, flags);
351 
352   e->probability = profile_probability::always ();
353   return e;
354 }
355 
356 /* This function will remove an edge from the flow graph.  */
357 
358 void
remove_edge_raw(edge e)359 remove_edge_raw (edge e)
360 {
361   remove_predictions_associated_with_edge (e);
362   execute_on_shrinking_pred (e);
363 
364   disconnect_src (e);
365   disconnect_dest (e);
366 
367   free_edge (cfun, e);
368 }
369 
370 /* Redirect an edge's successor from one block to another.  */
371 
372 void
redirect_edge_succ(edge e,basic_block new_succ)373 redirect_edge_succ (edge e, basic_block new_succ)
374 {
375   execute_on_shrinking_pred (e);
376 
377   disconnect_dest (e);
378 
379   e->dest = new_succ;
380 
381   /* Reconnect the edge to the new successor block.  */
382   connect_dest (e);
383 
384   execute_on_growing_pred (e);
385 }
386 
387 /* Redirect an edge's predecessor from one block to another.  */
388 
389 void
redirect_edge_pred(edge e,basic_block new_pred)390 redirect_edge_pred (edge e, basic_block new_pred)
391 {
392   disconnect_src (e);
393 
394   e->src = new_pred;
395 
396   /* Reconnect the edge to the new predecessor block.  */
397   connect_src (e);
398 }
399 
400 /* Clear all basic block flags that do not have to be preserved.  */
401 void
clear_bb_flags(void)402 clear_bb_flags (void)
403 {
404   basic_block bb;
405   int flags_to_preserve = BB_FLAGS_TO_PRESERVE;
406   if (current_loops
407       && loops_state_satisfies_p (cfun, LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS))
408     flags_to_preserve |= BB_IRREDUCIBLE_LOOP;
409 
410   FOR_ALL_BB_FN (bb, cfun)
411     bb->flags &= flags_to_preserve;
412 }
413 
414 /* Check the consistency of profile information.  We can't do that
415    in verify_flow_info, as the counts may get invalid for incompletely
416    solved graphs, later eliminating of conditionals or roundoff errors.
417    It is still practical to have them reported for debugging of simple
418    testcases.  */
419 static void
check_bb_profile(basic_block bb,FILE * file,int indent)420 check_bb_profile (basic_block bb, FILE * file, int indent)
421 {
422   edge e;
423   edge_iterator ei;
424   struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
425   char *s_indent = (char *) alloca ((size_t) indent + 1);
426   memset ((void *) s_indent, ' ', (size_t) indent);
427   s_indent[indent] = '\0';
428 
429   if (profile_status_for_fn (fun) == PROFILE_ABSENT)
430     return;
431 
432   if (bb != EXIT_BLOCK_PTR_FOR_FN (fun))
433     {
434       bool found = false;
435       profile_probability sum = profile_probability::never ();
436       int isum = 0;
437 
438       FOR_EACH_EDGE (e, ei, bb->succs)
439 	{
440 	  if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
441 	    found = true;
442 	  sum += e->probability;
443 	  if (e->probability.initialized_p ())
444 	    isum += e->probability.to_reg_br_prob_base ();
445 	}
446       /* Only report mismatches for non-EH control flow. If there are only EH
447 	 edges it means that the BB ends by noreturn call.  Here the control
448 	 flow may just terminate.  */
449       if (found)
450 	{
451 	  if (sum.differs_from_p (profile_probability::always ()))
452 	    {
453 	      fprintf (file,
454 		       ";; %sInvalid sum of outgoing probabilities ",
455 		       s_indent);
456 	      sum.dump (file);
457 	      fprintf (file, "\n");
458 	    }
459 	  /* Probabilities caps to 100% and thus the previous test will never
460 	     fire if the sum of probabilities is too large.  */
461 	  else if (isum > REG_BR_PROB_BASE + 100)
462 	    {
463 	      fprintf (file,
464 		       ";; %sInvalid sum of outgoing probabilities %.1f%%\n",
465 		       s_indent, isum * 100.0 / REG_BR_PROB_BASE);
466 	    }
467 	}
468     }
469   if (bb != ENTRY_BLOCK_PTR_FOR_FN (fun))
470     {
471       profile_count sum = profile_count::zero ();
472       FOR_EACH_EDGE (e, ei, bb->preds)
473 	sum += e->count ();
474       if (sum.differs_from_p (bb->count))
475 	{
476 	  fprintf (file, ";; %sInvalid sum of incoming counts ",
477 		   s_indent);
478 	  sum.dump (file);
479 	  fprintf (file, ", should be ");
480 	  bb->count.dump (file);
481 	  fprintf (file, "\n");
482 	}
483     }
484   if (BB_PARTITION (bb) == BB_COLD_PARTITION)
485     {
486       /* Warn about inconsistencies in the partitioning that are
487          currently caused by profile insanities created via optimization.  */
488       if (!probably_never_executed_bb_p (fun, bb))
489 	fprintf (file, ";; %sBlock in cold partition with hot count\n",
490 		 s_indent);
491       FOR_EACH_EDGE (e, ei, bb->preds)
492         {
493           if (!probably_never_executed_edge_p (fun, e))
494             fprintf (file,
495 		     ";; %sBlock in cold partition with incoming hot edge\n",
496 		     s_indent);
497         }
498     }
499 }
500 
501 void
dump_edge_info(FILE * file,edge e,dump_flags_t flags,int do_succ)502 dump_edge_info (FILE *file, edge e, dump_flags_t flags, int do_succ)
503 {
504   basic_block side = (do_succ ? e->dest : e->src);
505   bool do_details = false;
506 
507   if ((flags & TDF_DETAILS) != 0
508       && (flags & TDF_SLIM) == 0)
509     do_details = true;
510 
511   if (side->index == ENTRY_BLOCK)
512     fputs (" ENTRY", file);
513   else if (side->index == EXIT_BLOCK)
514     fputs (" EXIT", file);
515   else
516     fprintf (file, " %d", side->index);
517 
518   if (e->probability.initialized_p () && do_details)
519     {
520       fprintf (file, " [");
521       e->probability.dump (file);
522       fprintf (file, "] ");
523     }
524 
525   if (e->count ().initialized_p () && do_details)
526     {
527       fputs (" count:", file);
528       e->count ().dump (file);
529     }
530 
531   if (e->flags && do_details)
532     {
533       static const char * const bitnames[] =
534 	{
535 #define DEF_EDGE_FLAG(NAME,IDX) #NAME ,
536 #include "cfg-flags.def"
537 	  NULL
538 #undef DEF_EDGE_FLAG
539 	};
540       bool comma = false;
541       int i, flags = e->flags;
542 
543       gcc_assert (e->flags <= EDGE_ALL_FLAGS);
544       fputs (" (", file);
545       for (i = 0; flags; i++)
546 	if (flags & (1 << i))
547 	  {
548 	    flags &= ~(1 << i);
549 
550 	    if (comma)
551 	      fputc (',', file);
552 	    fputs (bitnames[i], file);
553 	    comma = true;
554 	  }
555 
556       fputc (')', file);
557     }
558 }
559 
560 DEBUG_FUNCTION void
debug(edge_def & ref)561 debug (edge_def &ref)
562 {
563   fprintf (stderr, "<edge (%d -> %d)>\n",
564 	   ref.src->index, ref.dest->index);
565   dump_edge_info (stderr, &ref, TDF_DETAILS, false);
566   fprintf (stderr, "\n");
567 }
568 
569 DEBUG_FUNCTION void
debug(edge_def * ptr)570 debug (edge_def *ptr)
571 {
572   if (ptr)
573     debug (*ptr);
574   else
575     fprintf (stderr, "<nil>\n");
576 }
577 
578 static void
debug_slim(edge e)579 debug_slim (edge e)
580 {
581   fprintf (stderr, "<edge 0x%p (%d -> %d)>", (void *) e,
582 	   e->src->index, e->dest->index);
583 }
584 
585 DEFINE_DEBUG_VEC (edge)
586 DEFINE_DEBUG_HASH_SET (edge)
587 
588 /* Simple routines to easily allocate AUX fields of basic blocks.  */
589 
590 static struct obstack block_aux_obstack;
591 static void *first_block_aux_obj = 0;
592 static struct obstack edge_aux_obstack;
593 static void *first_edge_aux_obj = 0;
594 
595 /* Allocate a memory block of SIZE as BB->aux.  The obstack must
596    be first initialized by alloc_aux_for_blocks.  */
597 
598 static void
alloc_aux_for_block(basic_block bb,int size)599 alloc_aux_for_block (basic_block bb, int size)
600 {
601   /* Verify that aux field is clear.  */
602   gcc_assert (!bb->aux && first_block_aux_obj);
603   bb->aux = obstack_alloc (&block_aux_obstack, size);
604   memset (bb->aux, 0, size);
605 }
606 
607 /* Initialize the block_aux_obstack and if SIZE is nonzero, call
608    alloc_aux_for_block for each basic block.  */
609 
610 void
alloc_aux_for_blocks(int size)611 alloc_aux_for_blocks (int size)
612 {
613   static int initialized;
614 
615   if (!initialized)
616     {
617       gcc_obstack_init (&block_aux_obstack);
618       initialized = 1;
619     }
620   else
621     /* Check whether AUX data are still allocated.  */
622     gcc_assert (!first_block_aux_obj);
623 
624   first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
625   if (size)
626     {
627       basic_block bb;
628 
629       FOR_ALL_BB_FN (bb, cfun)
630 	alloc_aux_for_block (bb, size);
631     }
632 }
633 
634 /* Clear AUX pointers of all blocks.  */
635 
636 void
clear_aux_for_blocks(void)637 clear_aux_for_blocks (void)
638 {
639   basic_block bb;
640 
641   FOR_ALL_BB_FN (bb, cfun)
642     bb->aux = NULL;
643 }
644 
645 /* Free data allocated in block_aux_obstack and clear AUX pointers
646    of all blocks.  */
647 
648 void
free_aux_for_blocks(void)649 free_aux_for_blocks (void)
650 {
651   gcc_assert (first_block_aux_obj);
652   obstack_free (&block_aux_obstack, first_block_aux_obj);
653   first_block_aux_obj = NULL;
654 
655   clear_aux_for_blocks ();
656 }
657 
658 /* Allocate a memory edge of SIZE as E->aux.  The obstack must
659    be first initialized by alloc_aux_for_edges.  */
660 
661 void
alloc_aux_for_edge(edge e,int size)662 alloc_aux_for_edge (edge e, int size)
663 {
664   /* Verify that aux field is clear.  */
665   gcc_assert (!e->aux && first_edge_aux_obj);
666   e->aux = obstack_alloc (&edge_aux_obstack, size);
667   memset (e->aux, 0, size);
668 }
669 
670 /* Initialize the edge_aux_obstack and if SIZE is nonzero, call
671    alloc_aux_for_edge for each basic edge.  */
672 
673 void
alloc_aux_for_edges(int size)674 alloc_aux_for_edges (int size)
675 {
676   static int initialized;
677 
678   if (!initialized)
679     {
680       gcc_obstack_init (&edge_aux_obstack);
681       initialized = 1;
682     }
683   else
684     /* Check whether AUX data are still allocated.  */
685     gcc_assert (!first_edge_aux_obj);
686 
687   first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
688   if (size)
689     {
690       basic_block bb;
691 
692       FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
693 		      EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
694 	{
695 	  edge e;
696 	  edge_iterator ei;
697 
698 	  FOR_EACH_EDGE (e, ei, bb->succs)
699 	    alloc_aux_for_edge (e, size);
700 	}
701     }
702 }
703 
704 /* Clear AUX pointers of all edges.  */
705 
706 void
clear_aux_for_edges(void)707 clear_aux_for_edges (void)
708 {
709   basic_block bb;
710   edge e;
711 
712   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
713 		  EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
714     {
715       edge_iterator ei;
716       FOR_EACH_EDGE (e, ei, bb->succs)
717 	e->aux = NULL;
718     }
719 }
720 
721 /* Free data allocated in edge_aux_obstack and clear AUX pointers
722    of all edges.  */
723 
724 void
free_aux_for_edges(void)725 free_aux_for_edges (void)
726 {
727   gcc_assert (first_edge_aux_obj);
728   obstack_free (&edge_aux_obstack, first_edge_aux_obj);
729   first_edge_aux_obj = NULL;
730 
731   clear_aux_for_edges ();
732 }
733 
734 DEBUG_FUNCTION void
debug_bb(basic_block bb)735 debug_bb (basic_block bb)
736 {
737   debug_bb (bb, dump_flags);
738 }
739 
740 DEBUG_FUNCTION basic_block
debug_bb_n(int n)741 debug_bb_n (int n)
742 {
743   basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
744   debug_bb (bb);
745   return bb;
746 }
747 
748 /* Print BB with specified FLAGS.  */
749 
750 DEBUG_FUNCTION void
debug_bb(basic_block bb,dump_flags_t flags)751 debug_bb (basic_block bb, dump_flags_t flags)
752 {
753   dump_bb (stderr, bb, 0, flags);
754 }
755 
756 /* Print basic block numbered N with specified FLAGS.  */
757 
758 DEBUG_FUNCTION basic_block
debug_bb_n(int n,dump_flags_t flags)759 debug_bb_n (int n, dump_flags_t flags)
760 {
761   basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
762   debug_bb (bb, flags);
763   return bb;
764 }
765 
766 /* Dumps cfg related information about basic block BB to OUTF.
767    If HEADER is true, dump things that appear before the instructions
768    contained in BB.  If FOOTER is true, dump things that appear after.
769    Flags are the TDF_* masks as documented in dumpfile.h.
770    NB: With TDF_DETAILS, it is assumed that cfun is available, so
771    that maybe_hot_bb_p and probably_never_executed_bb_p don't ICE.  */
772 
773 void
dump_bb_info(FILE * outf,basic_block bb,int indent,dump_flags_t flags,bool do_header,bool do_footer)774 dump_bb_info (FILE *outf, basic_block bb, int indent, dump_flags_t flags,
775 	      bool do_header, bool do_footer)
776 {
777   edge_iterator ei;
778   edge e;
779   static const char * const bb_bitnames[] =
780     {
781 #define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
782 #include "cfg-flags.def"
783       NULL
784 #undef DEF_BASIC_BLOCK_FLAG
785     };
786   const unsigned n_bitnames = sizeof (bb_bitnames) / sizeof (char *);
787   bool first;
788   char *s_indent = (char *) alloca ((size_t) indent + 1);
789   memset ((void *) s_indent, ' ', (size_t) indent);
790   s_indent[indent] = '\0';
791 
792   gcc_assert (bb->flags <= BB_ALL_FLAGS);
793 
794   if (do_header)
795     {
796       unsigned i;
797 
798       fputs (";; ", outf);
799       fprintf (outf, "%sbasic block %d, loop depth %d",
800 	       s_indent, bb->index, bb_loop_depth (bb));
801       if (flags & TDF_DETAILS)
802 	{
803 	  struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
804 	  if (bb->count.initialized_p ())
805 	    {
806 	      fputs (", count ", outf);
807 	      bb->count.dump (outf);
808 	    }
809 	  if (maybe_hot_bb_p (fun, bb))
810 	    fputs (", maybe hot", outf);
811 	  if (probably_never_executed_bb_p (fun, bb))
812 	    fputs (", probably never executed", outf);
813 	}
814       fputc ('\n', outf);
815 
816       if (flags & TDF_DETAILS)
817 	{
818 	  check_bb_profile (bb, outf, indent);
819 	  fputs (";; ", outf);
820 	  fprintf (outf, "%s prev block ", s_indent);
821 	  if (bb->prev_bb)
822 	    fprintf (outf, "%d", bb->prev_bb->index);
823 	  else
824 	    fprintf (outf, "(nil)");
825 	  fprintf (outf, ", next block ");
826 	  if (bb->next_bb)
827 	    fprintf (outf, "%d", bb->next_bb->index);
828 	  else
829 	    fprintf (outf, "(nil)");
830 
831 	  fputs (", flags:", outf);
832 	  first = true;
833 	  for (i = 0; i < n_bitnames; i++)
834 	    if (bb->flags & (1 << i))
835 	      {
836 		if (first)
837 		  fputs (" (", outf);
838 		else
839 		  fputs (", ", outf);
840 		first = false;
841 		fputs (bb_bitnames[i], outf);
842 	      }
843 	  if (!first)
844 	    fputc (')', outf);
845 	  fputc ('\n', outf);
846 	}
847 
848       fputs (";; ", outf);
849       fprintf (outf, "%s pred:      ", s_indent);
850       first = true;
851       FOR_EACH_EDGE (e, ei, bb->preds)
852 	{
853 	  if (! first)
854 	    {
855 	      fputs (";; ", outf);
856 	      fprintf (outf, "%s            ", s_indent);
857 	    }
858 	  first = false;
859 	  dump_edge_info (outf, e, flags, 0);
860 	  fputc ('\n', outf);
861 	}
862       if (first)
863 	fputc ('\n', outf);
864     }
865 
866   if (do_footer)
867     {
868       fputs (";; ", outf);
869       fprintf (outf, "%s succ:      ", s_indent);
870       first = true;
871       FOR_EACH_EDGE (e, ei, bb->succs)
872         {
873 	  if (! first)
874 	    {
875 	      fputs (";; ", outf);
876 	      fprintf (outf, "%s            ", s_indent);
877 	    }
878 	  first = false;
879 	  dump_edge_info (outf, e, flags, 1);
880 	  fputc ('\n', outf);
881 	}
882       if (first)
883 	fputc ('\n', outf);
884     }
885 }
886 
887 /* Dumps a brief description of cfg to FILE.  */
888 
889 void
brief_dump_cfg(FILE * file,dump_flags_t flags)890 brief_dump_cfg (FILE *file, dump_flags_t flags)
891 {
892   basic_block bb;
893 
894   FOR_EACH_BB_FN (bb, cfun)
895     {
896       dump_bb_info (file, bb, 0, flags & TDF_DETAILS, true, true);
897     }
898 }
899 
900 /* An edge originally destinating BB of COUNT has been proved to
901    leave the block by TAKEN_EDGE.  Update profile of BB such that edge E can be
902    redirected to destination of TAKEN_EDGE.
903 
904    This function may leave the profile inconsistent in the case TAKEN_EDGE
905    frequency or count is believed to be lower than COUNT
906    respectively.  */
907 void
update_bb_profile_for_threading(basic_block bb,profile_count count,edge taken_edge)908 update_bb_profile_for_threading (basic_block bb,
909 				 profile_count count, edge taken_edge)
910 {
911   edge c;
912   profile_probability prob;
913   edge_iterator ei;
914 
915   if (bb->count < count)
916     {
917       if (dump_file)
918 	fprintf (dump_file, "bb %i count became negative after threading",
919 		 bb->index);
920     }
921   bb->count -= count;
922 
923   /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
924      Watch for overflows.  */
925   if (bb->count.nonzero_p ())
926     prob = count.probability_in (bb->count);
927   else
928     prob = profile_probability::never ();
929   if (prob > taken_edge->probability)
930     {
931       if (dump_file)
932 	{
933 	  fprintf (dump_file, "Jump threading proved probability of edge "
934 		   "%i->%i too small (it is ",
935 		   taken_edge->src->index, taken_edge->dest->index);
936 	  taken_edge->probability.dump (dump_file);
937 	  fprintf (dump_file, " should be ");
938 	  prob.dump (dump_file);
939 	  fprintf (dump_file, ")\n");
940 	}
941       prob = taken_edge->probability.apply_scale (6, 8);
942     }
943 
944   /* Now rescale the probabilities.  */
945   taken_edge->probability -= prob;
946   prob = prob.invert ();
947   if (prob == profile_probability::never ())
948     {
949       if (dump_file)
950 	fprintf (dump_file, "Edge probabilities of bb %i has been reset, "
951 		 "count of block should end up being 0, it is non-zero\n",
952 		 bb->index);
953       EDGE_SUCC (bb, 0)->probability = profile_probability::guessed_always ();
954       ei = ei_start (bb->succs);
955       ei_next (&ei);
956       for (; (c = ei_safe_edge (ei)); ei_next (&ei))
957 	c->probability = profile_probability::guessed_never ();
958     }
959   else if (!(prob == profile_probability::always ()))
960     {
961       FOR_EACH_EDGE (c, ei, bb->succs)
962 	c->probability /= prob;
963     }
964 
965   gcc_assert (bb == taken_edge->src);
966 }
967 
968 /* Multiply all frequencies of basic blocks in array BBS of length NBBS
969    by NUM/DEN, in profile_count arithmetic.  More accurate than previous
970    function but considerably slower.  */
971 void
scale_bbs_frequencies_profile_count(basic_block * bbs,int nbbs,profile_count num,profile_count den)972 scale_bbs_frequencies_profile_count (basic_block *bbs, int nbbs,
973 				     profile_count num, profile_count den)
974 {
975   int i;
976   if (num == profile_count::zero () || den.nonzero_p ())
977     for (i = 0; i < nbbs; i++)
978       bbs[i]->count = bbs[i]->count.apply_scale (num, den);
979 }
980 
981 /* Multiply all frequencies of basic blocks in array BBS of length NBBS
982    by NUM/DEN, in profile_count arithmetic.  More accurate than previous
983    function but considerably slower.  */
984 void
scale_bbs_frequencies(basic_block * bbs,int nbbs,profile_probability p)985 scale_bbs_frequencies (basic_block *bbs, int nbbs,
986 		       profile_probability p)
987 {
988   int i;
989 
990   for (i = 0; i < nbbs; i++)
991     bbs[i]->count = bbs[i]->count.apply_probability (p);
992 }
993 
994 /* Data structures used to maintain mapping between basic blocks and
995    copies.  */
996 typedef hash_map<int_hash<int, -1, -2>, int> copy_map_t;
997 static copy_map_t *bb_original;
998 static copy_map_t *bb_copy;
999 
1000 /* And between loops and copies.  */
1001 static copy_map_t *loop_copy;
1002 
1003 /* Initialize the data structures to maintain mapping between blocks
1004    and its copies.  */
1005 void
initialize_original_copy_tables(void)1006 initialize_original_copy_tables (void)
1007 {
1008   bb_original = new copy_map_t (10);
1009   bb_copy = new copy_map_t (10);
1010   loop_copy = new copy_map_t (10);
1011 }
1012 
1013 /* Reset the data structures to maintain mapping between blocks and
1014    its copies.  */
1015 
1016 void
reset_original_copy_tables(void)1017 reset_original_copy_tables (void)
1018 {
1019   bb_original->empty ();
1020   bb_copy->empty ();
1021   loop_copy->empty ();
1022 }
1023 
1024 /* Free the data structures to maintain mapping between blocks and
1025    its copies.  */
1026 void
free_original_copy_tables(void)1027 free_original_copy_tables (void)
1028 {
1029   delete bb_copy;
1030   bb_copy = NULL;
1031   delete bb_original;
1032   bb_original = NULL;
1033   delete loop_copy;
1034   loop_copy = NULL;
1035 }
1036 
1037 /* Return true iff we have had a call to initialize_original_copy_tables
1038    without a corresponding call to free_original_copy_tables.  */
1039 
1040 bool
original_copy_tables_initialized_p(void)1041 original_copy_tables_initialized_p (void)
1042 {
1043   return bb_copy != NULL;
1044 }
1045 
1046 /* Removes the value associated with OBJ from table TAB.  */
1047 
1048 static void
copy_original_table_clear(copy_map_t * tab,unsigned obj)1049 copy_original_table_clear (copy_map_t *tab, unsigned obj)
1050 {
1051   if (!original_copy_tables_initialized_p ())
1052     return;
1053 
1054   tab->remove (obj);
1055 }
1056 
1057 /* Sets the value associated with OBJ in table TAB to VAL.
1058    Do nothing when data structures are not initialized.  */
1059 
1060 static void
copy_original_table_set(copy_map_t * tab,unsigned obj,unsigned val)1061 copy_original_table_set (copy_map_t *tab,
1062 			 unsigned obj, unsigned val)
1063 {
1064   if (!original_copy_tables_initialized_p ())
1065     return;
1066 
1067   tab->put (obj, val);
1068 }
1069 
1070 /* Set original for basic block.  Do nothing when data structures are not
1071    initialized so passes not needing this don't need to care.  */
1072 void
set_bb_original(basic_block bb,basic_block original)1073 set_bb_original (basic_block bb, basic_block original)
1074 {
1075   copy_original_table_set (bb_original, bb->index, original->index);
1076 }
1077 
1078 /* Get the original basic block.  */
1079 basic_block
get_bb_original(basic_block bb)1080 get_bb_original (basic_block bb)
1081 {
1082   gcc_assert (original_copy_tables_initialized_p ());
1083 
1084   int *entry = bb_original->get (bb->index);
1085   if (entry)
1086     return BASIC_BLOCK_FOR_FN (cfun, *entry);
1087   else
1088     return NULL;
1089 }
1090 
1091 /* Set copy for basic block.  Do nothing when data structures are not
1092    initialized so passes not needing this don't need to care.  */
1093 void
set_bb_copy(basic_block bb,basic_block copy)1094 set_bb_copy (basic_block bb, basic_block copy)
1095 {
1096   copy_original_table_set (bb_copy, bb->index, copy->index);
1097 }
1098 
1099 /* Get the copy of basic block.  */
1100 basic_block
get_bb_copy(basic_block bb)1101 get_bb_copy (basic_block bb)
1102 {
1103   gcc_assert (original_copy_tables_initialized_p ());
1104 
1105   int *entry = bb_copy->get (bb->index);
1106   if (entry)
1107     return BASIC_BLOCK_FOR_FN (cfun, *entry);
1108   else
1109     return NULL;
1110 }
1111 
1112 /* Set copy for LOOP to COPY.  Do nothing when data structures are not
1113    initialized so passes not needing this don't need to care.  */
1114 
1115 void
set_loop_copy(class loop * loop,class loop * copy)1116 set_loop_copy (class loop *loop, class loop *copy)
1117 {
1118   if (!copy)
1119     copy_original_table_clear (loop_copy, loop->num);
1120   else
1121     copy_original_table_set (loop_copy, loop->num, copy->num);
1122 }
1123 
1124 /* Get the copy of LOOP.  */
1125 
1126 class loop *
get_loop_copy(class loop * loop)1127 get_loop_copy (class loop *loop)
1128 {
1129   gcc_assert (original_copy_tables_initialized_p ());
1130 
1131   int *entry = loop_copy->get (loop->num);
1132   if (entry)
1133     return get_loop (cfun, *entry);
1134   else
1135     return NULL;
1136 }
1137