Fix typo in t-dimode
[official-gcc.git] / gcc / cfg.c
bloba36cdb49fe626e6ec662a7ed0cd6baf3131fce8f
1 /* Control flow graph manipulation code for GNU compiler.
2 Copyright (C) 1987-2021 Free Software Foundation, Inc.
4 This file is part of GCC.
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.
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.
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/>. */
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).
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
45 TODO: Document these "Available functionality" functions in the files
46 that implement them.
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"
63 /* Called once at initialization time. */
65 void
66 init_flow (struct function *the_fun)
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;
86 /* Helper function for remove_edge and free_cffg. Frees edge structure
87 without actually removing it from the pred/succ arrays. */
89 static void
90 free_edge (function *fn, edge e)
92 n_edges_for_fn (fn)--;
93 ggc_free (e);
96 /* Free basic block BB. */
98 static void
99 free_block (basic_block bb)
101 vec_free (bb->succs);
102 bb->succs = NULL;
103 vec_free (bb->preds);
104 bb->preds = NULL;
105 ggc_free (bb);
108 /* Free the memory associated with the CFG in FN. */
110 void
111 free_cfg (struct function *fn)
113 edge e;
114 edge_iterator ei;
115 basic_block next;
117 for (basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (fn); bb; bb = next)
119 next = bb->next_bb;
120 FOR_EACH_EDGE (e, ei, bb->succs)
121 free_edge (fn, e);
122 free_block (bb);
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]);
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;
135 /* Allocate memory for basic_block. */
137 basic_block
138 alloc_block (void)
140 basic_block bb;
141 bb = ggc_cleared_alloc<basic_block_def> ();
142 bb->count = profile_count::uninitialized ();
143 return bb;
146 /* Link block B to chain after AFTER. */
147 void
148 link_block (basic_block b, basic_block after)
150 b->next_bb = after->next_bb;
151 b->prev_bb = after;
152 after->next_bb = b;
153 b->next_bb->prev_bb = b;
156 /* Unlink block B from chain. */
157 void
158 unlink_block (basic_block b)
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;
166 /* Sequentially order blocks and compact the arrays. */
167 void
168 compact_blocks (void)
170 int i;
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));
175 if (df)
176 df_compact_blocks ();
177 else
179 basic_block bb;
181 i = NUM_FIXED_BLOCKS;
182 FOR_EACH_BB_FN (bb, cfun)
184 SET_BASIC_BLOCK_FOR_FN (cfun, i, bb);
185 bb->index = i;
186 i++;
188 gcc_assert (i == n_basic_blocks_for_fn (cfun));
190 for (; i < last_basic_block_for_fn (cfun); i++)
191 SET_BASIC_BLOCK_FOR_FN (cfun, i, NULL);
193 last_basic_block_for_fn (cfun) = n_basic_blocks_for_fn (cfun);
196 /* Remove block B from the basic block array. */
198 void
199 expunge_block (basic_block b)
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. */
211 /* Connect E to E->src. */
213 static inline void
214 connect_src (edge e)
216 vec_safe_push (e->src->succs, e);
217 df_mark_solutions_dirty ();
220 /* Connect E to E->dest. */
222 static inline void
223 connect_dest (edge e)
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 ();
231 /* Disconnect edge E from E->src. */
233 static inline void
234 disconnect_src (edge e)
236 basic_block src = e->src;
237 edge_iterator ei;
238 edge tmp;
240 for (ei = ei_start (src->succs); (tmp = ei_safe_edge (ei)); )
242 if (tmp == e)
244 src->succs->unordered_remove (ei.index);
245 df_mark_solutions_dirty ();
246 return;
248 else
249 ei_next (&ei);
252 gcc_unreachable ();
255 /* Disconnect edge E from E->dest. */
257 static inline void
258 disconnect_dest (edge e)
260 basic_block dest = e->dest;
261 unsigned int dest_idx = e->dest_idx;
263 dest->preds->unordered_remove (dest_idx);
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 ();
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. */
276 edge
277 unchecked_make_edge (basic_block src, basic_block dst, int flags)
279 edge e;
280 e = ggc_cleared_alloc<edge_def> ();
281 n_edges_for_fn (cfun)++;
283 e->probability = profile_probability::uninitialized ();
284 e->src = src;
285 e->dest = dst;
286 e->flags = flags;
288 connect_src (e);
289 connect_dest (e);
291 execute_on_growing_pred (e);
292 return e;
295 /* Create an edge connecting SRC and DST with FLAGS optionally using
296 edge cache CACHE. Return the new edge, NULL if already exist. */
298 edge
299 cached_make_edge (sbitmap edge_cache, basic_block src, basic_block dst, int flags)
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);
306 /* Does the requested edge already exist? */
307 if (! bitmap_bit_p (edge_cache, dst->index))
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);
315 /* At this point, we know that the requested edge exists. Adjust
316 flags if necessary. */
317 if (flags)
319 edge e = find_edge (src, dst);
320 e->flags |= flags;
323 return NULL;
326 /* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
327 created edge or NULL if already exist. */
329 edge
330 make_edge (basic_block src, basic_block dest, int flags)
332 edge e = find_edge (src, dest);
334 /* Make sure we don't add duplicate edges. */
335 if (e)
337 e->flags |= flags;
338 return NULL;
341 return unchecked_make_edge (src, dest, flags);
344 /* Create an edge connecting SRC to DEST and set probability by knowing
345 that it is the single edge leaving SRC. */
347 edge
348 make_single_succ_edge (basic_block src, basic_block dest, int flags)
350 edge e = make_edge (src, dest, flags);
352 e->probability = profile_probability::always ();
353 return e;
356 /* This function will remove an edge from the flow graph. */
358 void
359 remove_edge_raw (edge e)
361 remove_predictions_associated_with_edge (e);
362 execute_on_shrinking_pred (e);
364 disconnect_src (e);
365 disconnect_dest (e);
367 free_edge (cfun, e);
370 /* Redirect an edge's successor from one block to another. */
372 void
373 redirect_edge_succ (edge e, basic_block new_succ)
375 execute_on_shrinking_pred (e);
377 disconnect_dest (e);
379 e->dest = new_succ;
381 /* Reconnect the edge to the new successor block. */
382 connect_dest (e);
384 execute_on_growing_pred (e);
387 /* Redirect an edge's predecessor from one block to another. */
389 void
390 redirect_edge_pred (edge e, basic_block new_pred)
392 disconnect_src (e);
394 e->src = new_pred;
396 /* Reconnect the edge to the new predecessor block. */
397 connect_src (e);
400 /* Clear all basic block flags that do not have to be preserved. */
401 void
402 clear_bb_flags (void)
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;
410 FOR_ALL_BB_FN (bb, cfun)
411 bb->flags &= flags_to_preserve;
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
420 check_bb_profile (basic_block bb, FILE * file, int indent)
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';
429 if (profile_status_for_fn (fun) == PROFILE_ABSENT)
430 return;
432 if (bb != EXIT_BLOCK_PTR_FOR_FN (fun))
434 bool found = false;
435 profile_probability sum = profile_probability::never ();
436 int isum = 0;
438 FOR_EACH_EDGE (e, ei, bb->succs)
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 ();
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)
451 if (sum.differs_from_p (profile_probability::always ()))
453 fprintf (file,
454 ";; %sInvalid sum of outgoing probabilities ",
455 s_indent);
456 sum.dump (file);
457 fprintf (file, "\n");
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)
463 fprintf (file,
464 ";; %sInvalid sum of outgoing probabilities %.1f%%\n",
465 s_indent, isum * 100.0 / REG_BR_PROB_BASE);
469 if (bb != ENTRY_BLOCK_PTR_FOR_FN (fun))
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))
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");
484 if (BB_PARTITION (bb) == BB_COLD_PARTITION)
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)
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);
501 void
502 dump_edge_info (FILE *file, edge e, dump_flags_t flags, int do_succ)
504 basic_block side = (do_succ ? e->dest : e->src);
505 bool do_details = false;
507 if ((flags & TDF_DETAILS) != 0
508 && (flags & TDF_SLIM) == 0)
509 do_details = true;
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);
518 if (e->probability.initialized_p () && do_details)
520 fprintf (file, " [");
521 e->probability.dump (file);
522 fprintf (file, "] ");
525 if (e->count ().initialized_p () && do_details)
527 fputs (" count:", file);
528 e->count ().dump (file);
531 if (e->flags && do_details)
533 static const char * const bitnames[] =
535 #define DEF_EDGE_FLAG(NAME,IDX) #NAME ,
536 #include "cfg-flags.def"
537 NULL
538 #undef DEF_EDGE_FLAG
540 bool comma = false;
541 int i, flags = e->flags;
543 gcc_assert (e->flags <= EDGE_ALL_FLAGS);
544 fputs (" (", file);
545 for (i = 0; flags; i++)
546 if (flags & (1 << i))
548 flags &= ~(1 << i);
550 if (comma)
551 fputc (',', file);
552 fputs (bitnames[i], file);
553 comma = true;
556 fputc (')', file);
560 DEBUG_FUNCTION void
561 debug (edge_def &ref)
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");
569 DEBUG_FUNCTION void
570 debug (edge_def *ptr)
572 if (ptr)
573 debug (*ptr);
574 else
575 fprintf (stderr, "<nil>\n");
578 static void
579 debug_slim (edge e)
581 fprintf (stderr, "<edge 0x%p (%d -> %d)>", (void *) e,
582 e->src->index, e->dest->index);
585 DEFINE_DEBUG_VEC (edge)
586 DEFINE_DEBUG_HASH_SET (edge)
588 /* Simple routines to easily allocate AUX fields of basic blocks. */
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;
595 /* Allocate a memory block of SIZE as BB->aux. The obstack must
596 be first initialized by alloc_aux_for_blocks. */
598 static void
599 alloc_aux_for_block (basic_block bb, int size)
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);
607 /* Initialize the block_aux_obstack and if SIZE is nonzero, call
608 alloc_aux_for_block for each basic block. */
610 void
611 alloc_aux_for_blocks (int size)
613 static int initialized;
615 if (!initialized)
617 gcc_obstack_init (&block_aux_obstack);
618 initialized = 1;
620 else
621 /* Check whether AUX data are still allocated. */
622 gcc_assert (!first_block_aux_obj);
624 first_block_aux_obj = obstack_alloc (&block_aux_obstack, 0);
625 if (size)
627 basic_block bb;
629 FOR_ALL_BB_FN (bb, cfun)
630 alloc_aux_for_block (bb, size);
634 /* Clear AUX pointers of all blocks. */
636 void
637 clear_aux_for_blocks (void)
639 basic_block bb;
641 FOR_ALL_BB_FN (bb, cfun)
642 bb->aux = NULL;
645 /* Free data allocated in block_aux_obstack and clear AUX pointers
646 of all blocks. */
648 void
649 free_aux_for_blocks (void)
651 gcc_assert (first_block_aux_obj);
652 obstack_free (&block_aux_obstack, first_block_aux_obj);
653 first_block_aux_obj = NULL;
655 clear_aux_for_blocks ();
658 /* Allocate a memory edge of SIZE as E->aux. The obstack must
659 be first initialized by alloc_aux_for_edges. */
661 void
662 alloc_aux_for_edge (edge e, int size)
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);
670 /* Initialize the edge_aux_obstack and if SIZE is nonzero, call
671 alloc_aux_for_edge for each basic edge. */
673 void
674 alloc_aux_for_edges (int size)
676 static int initialized;
678 if (!initialized)
680 gcc_obstack_init (&edge_aux_obstack);
681 initialized = 1;
683 else
684 /* Check whether AUX data are still allocated. */
685 gcc_assert (!first_edge_aux_obj);
687 first_edge_aux_obj = obstack_alloc (&edge_aux_obstack, 0);
688 if (size)
690 basic_block bb;
692 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
693 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
695 edge e;
696 edge_iterator ei;
698 FOR_EACH_EDGE (e, ei, bb->succs)
699 alloc_aux_for_edge (e, size);
704 /* Clear AUX pointers of all edges. */
706 void
707 clear_aux_for_edges (void)
709 basic_block bb;
710 edge e;
712 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (cfun),
713 EXIT_BLOCK_PTR_FOR_FN (cfun), next_bb)
715 edge_iterator ei;
716 FOR_EACH_EDGE (e, ei, bb->succs)
717 e->aux = NULL;
721 /* Free data allocated in edge_aux_obstack and clear AUX pointers
722 of all edges. */
724 void
725 free_aux_for_edges (void)
727 gcc_assert (first_edge_aux_obj);
728 obstack_free (&edge_aux_obstack, first_edge_aux_obj);
729 first_edge_aux_obj = NULL;
731 clear_aux_for_edges ();
734 DEBUG_FUNCTION void
735 debug_bb (basic_block bb)
737 debug_bb (bb, dump_flags);
740 DEBUG_FUNCTION basic_block
741 debug_bb_n (int n)
743 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
744 debug_bb (bb);
745 return bb;
748 /* Print BB with specified FLAGS. */
750 DEBUG_FUNCTION void
751 debug_bb (basic_block bb, dump_flags_t flags)
753 dump_bb (stderr, bb, 0, flags);
756 /* Print basic block numbered N with specified FLAGS. */
758 DEBUG_FUNCTION basic_block
759 debug_bb_n (int n, dump_flags_t flags)
761 basic_block bb = BASIC_BLOCK_FOR_FN (cfun, n);
762 debug_bb (bb, flags);
763 return bb;
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. */
773 void
774 dump_bb_info (FILE *outf, basic_block bb, int indent, dump_flags_t flags,
775 bool do_header, bool do_footer)
777 edge_iterator ei;
778 edge e;
779 static const char * const bb_bitnames[] =
781 #define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
782 #include "cfg-flags.def"
783 NULL
784 #undef DEF_BASIC_BLOCK_FLAG
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';
792 gcc_assert (bb->flags <= BB_ALL_FLAGS);
794 if (do_header)
796 unsigned i;
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)
803 struct function *fun = DECL_STRUCT_FUNCTION (current_function_decl);
804 if (bb->count.initialized_p ())
806 fputs (", count ", outf);
807 bb->count.dump (outf);
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);
814 fputc ('\n', outf);
816 if (flags & TDF_DETAILS)
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)");
831 fputs (", flags:", outf);
832 first = true;
833 for (i = 0; i < n_bitnames; i++)
834 if (bb->flags & (1 << i))
836 if (first)
837 fputs (" (", outf);
838 else
839 fputs (", ", outf);
840 first = false;
841 fputs (bb_bitnames[i], outf);
843 if (!first)
844 fputc (')', outf);
845 fputc ('\n', outf);
848 fputs (";; ", outf);
849 fprintf (outf, "%s pred: ", s_indent);
850 first = true;
851 FOR_EACH_EDGE (e, ei, bb->preds)
853 if (! first)
855 fputs (";; ", outf);
856 fprintf (outf, "%s ", s_indent);
858 first = false;
859 dump_edge_info (outf, e, flags, 0);
860 fputc ('\n', outf);
862 if (first)
863 fputc ('\n', outf);
866 if (do_footer)
868 fputs (";; ", outf);
869 fprintf (outf, "%s succ: ", s_indent);
870 first = true;
871 FOR_EACH_EDGE (e, ei, bb->succs)
873 if (! first)
875 fputs (";; ", outf);
876 fprintf (outf, "%s ", s_indent);
878 first = false;
879 dump_edge_info (outf, e, flags, 1);
880 fputc ('\n', outf);
882 if (first)
883 fputc ('\n', outf);
887 /* Dumps a brief description of cfg to FILE. */
889 void
890 brief_dump_cfg (FILE *file, dump_flags_t flags)
892 basic_block bb;
894 FOR_EACH_BB_FN (bb, cfun)
896 dump_bb_info (file, bb, 0, flags & TDF_DETAILS, true, true);
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.
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
908 update_bb_profile_for_threading (basic_block bb,
909 profile_count count, edge taken_edge)
911 edge c;
912 profile_probability prob;
913 edge_iterator ei;
915 if (bb->count < count)
917 if (dump_file)
918 fprintf (dump_file, "bb %i count became negative after threading",
919 bb->index);
921 bb->count -= count;
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)
931 if (dump_file)
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");
941 prob = taken_edge->probability.apply_scale (6, 8);
944 /* Now rescale the probabilities. */
945 taken_edge->probability -= prob;
946 prob = prob.invert ();
947 if (prob == profile_probability::never ())
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 ();
959 else if (!(prob == profile_probability::always ()))
961 FOR_EACH_EDGE (c, ei, bb->succs)
962 c->probability /= prob;
965 gcc_assert (bb == taken_edge->src);
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
972 scale_bbs_frequencies_profile_count (basic_block *bbs, int nbbs,
973 profile_count num, profile_count den)
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);
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
985 scale_bbs_frequencies (basic_block *bbs, int nbbs,
986 profile_probability p)
988 int i;
990 for (i = 0; i < nbbs; i++)
991 bbs[i]->count = bbs[i]->count.apply_probability (p);
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;
1000 /* And between loops and copies. */
1001 static copy_map_t *loop_copy;
1003 /* Initialize the data structures to maintain mapping between blocks
1004 and its copies. */
1005 void
1006 initialize_original_copy_tables (void)
1008 bb_original = new copy_map_t (10);
1009 bb_copy = new copy_map_t (10);
1010 loop_copy = new copy_map_t (10);
1013 /* Reset the data structures to maintain mapping between blocks and
1014 its copies. */
1016 void
1017 reset_original_copy_tables (void)
1019 bb_original->empty ();
1020 bb_copy->empty ();
1021 loop_copy->empty ();
1024 /* Free the data structures to maintain mapping between blocks and
1025 its copies. */
1026 void
1027 free_original_copy_tables (void)
1029 delete bb_copy;
1030 bb_copy = NULL;
1031 delete bb_original;
1032 bb_original = NULL;
1033 delete loop_copy;
1034 loop_copy = NULL;
1037 /* Return true iff we have had a call to initialize_original_copy_tables
1038 without a corresponding call to free_original_copy_tables. */
1040 bool
1041 original_copy_tables_initialized_p (void)
1043 return bb_copy != NULL;
1046 /* Removes the value associated with OBJ from table TAB. */
1048 static void
1049 copy_original_table_clear (copy_map_t *tab, unsigned obj)
1051 if (!original_copy_tables_initialized_p ())
1052 return;
1054 tab->remove (obj);
1057 /* Sets the value associated with OBJ in table TAB to VAL.
1058 Do nothing when data structures are not initialized. */
1060 static void
1061 copy_original_table_set (copy_map_t *tab,
1062 unsigned obj, unsigned val)
1064 if (!original_copy_tables_initialized_p ())
1065 return;
1067 tab->put (obj, val);
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
1073 set_bb_original (basic_block bb, basic_block original)
1075 copy_original_table_set (bb_original, bb->index, original->index);
1078 /* Get the original basic block. */
1079 basic_block
1080 get_bb_original (basic_block bb)
1082 gcc_assert (original_copy_tables_initialized_p ());
1084 int *entry = bb_original->get (bb->index);
1085 if (entry)
1086 return BASIC_BLOCK_FOR_FN (cfun, *entry);
1087 else
1088 return NULL;
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
1094 set_bb_copy (basic_block bb, basic_block copy)
1096 copy_original_table_set (bb_copy, bb->index, copy->index);
1099 /* Get the copy of basic block. */
1100 basic_block
1101 get_bb_copy (basic_block bb)
1103 gcc_assert (original_copy_tables_initialized_p ());
1105 int *entry = bb_copy->get (bb->index);
1106 if (entry)
1107 return BASIC_BLOCK_FOR_FN (cfun, *entry);
1108 else
1109 return NULL;
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. */
1115 void
1116 set_loop_copy (class loop *loop, class loop *copy)
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);
1124 /* Get the copy of LOOP. */
1126 class loop *
1127 get_loop_copy (class loop *loop)
1129 gcc_assert (original_copy_tables_initialized_p ());
1131 int *entry = loop_copy->get (loop->num);
1132 if (entry)
1133 return get_loop (cfun, *entry);
1134 else
1135 return NULL;