1 /* Control flow graph manipulation code for GNU compiler.
2 Copyright (C) 1987-2015 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
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
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, clear_edges
29 - Low level basic block manipulation
30 alloc_block, expunge_block
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
40 - Consistency checking
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
51 #include "coretypes.h"
54 #include "hash-table.h"
55 #include "alloc-pool.h"
59 #include "double-int.h"
73 #include "hard-reg-set.h"
76 #include "dominance.h"
79 #include "basic-block.h"
81 #include "cfgloop.h" /* FIXME: For struct loop. */
85 #define RDIV(X,Y) (((X) + (Y) / 2) / (Y))
87 /* Called once at initialization time. */
90 init_flow (struct function
*the_fun
)
93 the_fun
->cfg
= ggc_cleared_alloc
<control_flow_graph
> ();
94 n_edges_for_fn (the_fun
) = 0;
95 ENTRY_BLOCK_PTR_FOR_FN (the_fun
)
96 = ggc_cleared_alloc
<basic_block_def
> ();
97 ENTRY_BLOCK_PTR_FOR_FN (the_fun
)->index
= ENTRY_BLOCK
;
98 EXIT_BLOCK_PTR_FOR_FN (the_fun
)
99 = ggc_cleared_alloc
<basic_block_def
> ();
100 EXIT_BLOCK_PTR_FOR_FN (the_fun
)->index
= EXIT_BLOCK
;
101 ENTRY_BLOCK_PTR_FOR_FN (the_fun
)->next_bb
102 = EXIT_BLOCK_PTR_FOR_FN (the_fun
);
103 EXIT_BLOCK_PTR_FOR_FN (the_fun
)->prev_bb
104 = ENTRY_BLOCK_PTR_FOR_FN (the_fun
);
107 /* Helper function for remove_edge and clear_edges. Frees edge structure
108 without actually removing it from the pred/succ arrays. */
113 n_edges_for_fn (cfun
)--;
117 /* Free the memory associated with the edge structures. */
126 FOR_EACH_BB_FN (bb
, cfun
)
128 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
130 vec_safe_truncate (bb
->succs
, 0);
131 vec_safe_truncate (bb
->preds
, 0);
134 FOR_EACH_EDGE (e
, ei
, ENTRY_BLOCK_PTR_FOR_FN (cfun
)->succs
)
136 vec_safe_truncate (EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
, 0);
137 vec_safe_truncate (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->succs
, 0);
139 gcc_assert (!n_edges_for_fn (cfun
));
142 /* Allocate memory for basic_block. */
148 bb
= ggc_cleared_alloc
<basic_block_def
> ();
152 /* Link block B to chain after AFTER. */
154 link_block (basic_block b
, basic_block after
)
156 b
->next_bb
= after
->next_bb
;
159 b
->next_bb
->prev_bb
= b
;
162 /* Unlink block B from chain. */
164 unlink_block (basic_block b
)
166 b
->next_bb
->prev_bb
= b
->prev_bb
;
167 b
->prev_bb
->next_bb
= b
->next_bb
;
172 /* Sequentially order blocks and compact the arrays. */
174 compact_blocks (void)
178 SET_BASIC_BLOCK_FOR_FN (cfun
, ENTRY_BLOCK
, ENTRY_BLOCK_PTR_FOR_FN (cfun
));
179 SET_BASIC_BLOCK_FOR_FN (cfun
, EXIT_BLOCK
, EXIT_BLOCK_PTR_FOR_FN (cfun
));
182 df_compact_blocks ();
187 i
= NUM_FIXED_BLOCKS
;
188 FOR_EACH_BB_FN (bb
, cfun
)
190 SET_BASIC_BLOCK_FOR_FN (cfun
, i
, bb
);
194 gcc_assert (i
== n_basic_blocks_for_fn (cfun
));
196 for (; i
< last_basic_block_for_fn (cfun
); i
++)
197 SET_BASIC_BLOCK_FOR_FN (cfun
, i
, NULL
);
199 last_basic_block_for_fn (cfun
) = n_basic_blocks_for_fn (cfun
);
202 /* Remove block B from the basic block array. */
205 expunge_block (basic_block b
)
208 SET_BASIC_BLOCK_FOR_FN (cfun
, b
->index
, NULL
);
209 n_basic_blocks_for_fn (cfun
)--;
210 /* We should be able to ggc_free here, but we are not.
211 The dead SSA_NAMES are left pointing to dead statements that are pointing
212 to dead basic blocks making garbage collector to die.
213 We should be able to release all dead SSA_NAMES and at the same time we should
214 clear out BB pointer of dead statements consistently. */
217 /* Connect E to E->src. */
222 vec_safe_push (e
->src
->succs
, e
);
223 df_mark_solutions_dirty ();
226 /* Connect E to E->dest. */
229 connect_dest (edge e
)
231 basic_block dest
= e
->dest
;
232 vec_safe_push (dest
->preds
, e
);
233 e
->dest_idx
= EDGE_COUNT (dest
->preds
) - 1;
234 df_mark_solutions_dirty ();
237 /* Disconnect edge E from E->src. */
240 disconnect_src (edge e
)
242 basic_block src
= e
->src
;
246 for (ei
= ei_start (src
->succs
); (tmp
= ei_safe_edge (ei
)); )
250 src
->succs
->unordered_remove (ei
.index
);
251 df_mark_solutions_dirty ();
261 /* Disconnect edge E from E->dest. */
264 disconnect_dest (edge e
)
266 basic_block dest
= e
->dest
;
267 unsigned int dest_idx
= e
->dest_idx
;
269 dest
->preds
->unordered_remove (dest_idx
);
271 /* If we removed an edge in the middle of the edge vector, we need
272 to update dest_idx of the edge that moved into the "hole". */
273 if (dest_idx
< EDGE_COUNT (dest
->preds
))
274 EDGE_PRED (dest
, dest_idx
)->dest_idx
= dest_idx
;
275 df_mark_solutions_dirty ();
278 /* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
279 created edge. Use this only if you are sure that this edge can't
280 possibly already exist. */
283 unchecked_make_edge (basic_block src
, basic_block dst
, int flags
)
286 e
= ggc_cleared_alloc
<edge_def
> ();
287 n_edges_for_fn (cfun
)++;
296 execute_on_growing_pred (e
);
300 /* Create an edge connecting SRC and DST with FLAGS optionally using
301 edge cache CACHE. Return the new edge, NULL if already exist. */
304 cached_make_edge (sbitmap edge_cache
, basic_block src
, basic_block dst
, int flags
)
306 if (edge_cache
== NULL
307 || src
== ENTRY_BLOCK_PTR_FOR_FN (cfun
)
308 || dst
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
309 return make_edge (src
, dst
, flags
);
311 /* Does the requested edge already exist? */
312 if (! bitmap_bit_p (edge_cache
, dst
->index
))
314 /* The edge does not exist. Create one and update the
316 bitmap_set_bit (edge_cache
, dst
->index
);
317 return unchecked_make_edge (src
, dst
, flags
);
320 /* At this point, we know that the requested edge exists. Adjust
321 flags if necessary. */
324 edge e
= find_edge (src
, dst
);
331 /* Create an edge connecting SRC and DEST with flags FLAGS. Return newly
332 created edge or NULL if already exist. */
335 make_edge (basic_block src
, basic_block dest
, int flags
)
337 edge e
= find_edge (src
, dest
);
339 /* Make sure we don't add duplicate edges. */
346 return unchecked_make_edge (src
, dest
, flags
);
349 /* Create an edge connecting SRC to DEST and set probability by knowing
350 that it is the single edge leaving SRC. */
353 make_single_succ_edge (basic_block src
, basic_block dest
, int flags
)
355 edge e
= make_edge (src
, dest
, flags
);
357 e
->probability
= REG_BR_PROB_BASE
;
358 e
->count
= src
->count
;
362 /* This function will remove an edge from the flow graph. */
365 remove_edge_raw (edge e
)
367 remove_predictions_associated_with_edge (e
);
368 execute_on_shrinking_pred (e
);
376 /* Redirect an edge's successor from one block to another. */
379 redirect_edge_succ (edge e
, basic_block new_succ
)
381 execute_on_shrinking_pred (e
);
387 /* Reconnect the edge to the new successor block. */
390 execute_on_growing_pred (e
);
393 /* Redirect an edge's predecessor from one block to another. */
396 redirect_edge_pred (edge e
, basic_block new_pred
)
402 /* Reconnect the edge to the new predecessor block. */
406 /* Clear all basic block flags that do not have to be preserved. */
408 clear_bb_flags (void)
412 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
413 bb
->flags
&= BB_FLAGS_TO_PRESERVE
;
416 /* Check the consistency of profile information. We can't do that
417 in verify_flow_info, as the counts may get invalid for incompletely
418 solved graphs, later eliminating of conditionals or roundoff errors.
419 It is still practical to have them reported for debugging of simple
422 check_bb_profile (basic_block bb
, FILE * file
, int indent
, int flags
)
428 struct function
*fun
= DECL_STRUCT_FUNCTION (current_function_decl
);
429 char *s_indent
= (char *) alloca ((size_t) indent
+ 1);
430 memset ((void *) s_indent
, ' ', (size_t) indent
);
431 s_indent
[indent
] = '\0';
433 if (profile_status_for_fn (fun
) == PROFILE_ABSENT
)
436 if (bb
!= EXIT_BLOCK_PTR_FOR_FN (fun
))
438 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
439 sum
+= e
->probability
;
440 if (EDGE_COUNT (bb
->succs
) && abs (sum
- REG_BR_PROB_BASE
) > 100)
441 fprintf (file
, "%s%sInvalid sum of outgoing probabilities %.1f%%\n",
442 (flags
& TDF_COMMENT
) ? ";; " : "", s_indent
,
443 sum
* 100.0 / REG_BR_PROB_BASE
);
445 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
447 if (EDGE_COUNT (bb
->succs
)
448 && (lsum
- bb
->count
> 100 || lsum
- bb
->count
< -100))
449 fprintf (file
, "%s%sInvalid sum of outgoing counts %i, should be %i\n",
450 (flags
& TDF_COMMENT
) ? ";; " : "", s_indent
,
451 (int) lsum
, (int) bb
->count
);
453 if (bb
!= ENTRY_BLOCK_PTR_FOR_FN (fun
))
456 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
457 sum
+= EDGE_FREQUENCY (e
);
458 if (abs (sum
- bb
->frequency
) > 100)
460 "%s%sInvalid sum of incoming frequencies %i, should be %i\n",
461 (flags
& TDF_COMMENT
) ? ";; " : "", s_indent
,
464 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
466 if (lsum
- bb
->count
> 100 || lsum
- bb
->count
< -100)
467 fprintf (file
, "%s%sInvalid sum of incoming counts %i, should be %i\n",
468 (flags
& TDF_COMMENT
) ? ";; " : "", s_indent
,
469 (int) lsum
, (int) bb
->count
);
471 if (BB_PARTITION (bb
) == BB_COLD_PARTITION
)
473 /* Warn about inconsistencies in the partitioning that are
474 currently caused by profile insanities created via optimization. */
475 if (!probably_never_executed_bb_p (fun
, bb
))
476 fprintf (file
, "%s%sBlock in cold partition with hot count\n",
477 (flags
& TDF_COMMENT
) ? ";; " : "", s_indent
);
478 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
480 if (!probably_never_executed_edge_p (fun
, e
))
482 "%s%sBlock in cold partition with incoming hot edge\n",
483 (flags
& TDF_COMMENT
) ? ";; " : "", s_indent
);
489 dump_edge_info (FILE *file
, edge e
, int flags
, int do_succ
)
491 basic_block side
= (do_succ
? e
->dest
: e
->src
);
492 bool do_details
= false;
494 if ((flags
& TDF_DETAILS
) != 0
495 && (flags
& TDF_SLIM
) == 0)
498 if (side
->index
== ENTRY_BLOCK
)
499 fputs (" ENTRY", file
);
500 else if (side
->index
== EXIT_BLOCK
)
501 fputs (" EXIT", file
);
503 fprintf (file
, " %d", side
->index
);
505 if (e
->probability
&& do_details
)
506 fprintf (file
, " [%.1f%%] ", e
->probability
* 100.0 / REG_BR_PROB_BASE
);
508 if (e
->count
&& do_details
)
510 fputs (" count:", file
);
511 fprintf (file
, "%"PRId64
, e
->count
);
514 if (e
->flags
&& do_details
)
516 static const char * const bitnames
[] =
518 #define DEF_EDGE_FLAG(NAME,IDX) #NAME ,
519 #include "cfg-flags.def"
524 int i
, flags
= e
->flags
;
526 gcc_assert (e
->flags
<= EDGE_ALL_FLAGS
);
528 for (i
= 0; flags
; i
++)
529 if (flags
& (1 << i
))
535 fputs (bitnames
[i
], file
);
544 debug (edge_def
&ref
)
546 /* FIXME (crowl): Is this desireable? */
547 dump_edge_info (stderr
, &ref
, 0, false);
548 dump_edge_info (stderr
, &ref
, 0, true);
552 debug (edge_def
*ptr
)
557 fprintf (stderr
, "<nil>\n");
560 /* Simple routines to easily allocate AUX fields of basic blocks. */
562 static struct obstack block_aux_obstack
;
563 static void *first_block_aux_obj
= 0;
564 static struct obstack edge_aux_obstack
;
565 static void *first_edge_aux_obj
= 0;
567 /* Allocate a memory block of SIZE as BB->aux. The obstack must
568 be first initialized by alloc_aux_for_blocks. */
571 alloc_aux_for_block (basic_block bb
, int size
)
573 /* Verify that aux field is clear. */
574 gcc_assert (!bb
->aux
&& first_block_aux_obj
);
575 bb
->aux
= obstack_alloc (&block_aux_obstack
, size
);
576 memset (bb
->aux
, 0, size
);
579 /* Initialize the block_aux_obstack and if SIZE is nonzero, call
580 alloc_aux_for_block for each basic block. */
583 alloc_aux_for_blocks (int size
)
585 static int initialized
;
589 gcc_obstack_init (&block_aux_obstack
);
593 /* Check whether AUX data are still allocated. */
594 gcc_assert (!first_block_aux_obj
);
596 first_block_aux_obj
= obstack_alloc (&block_aux_obstack
, 0);
601 FOR_ALL_BB_FN (bb
, cfun
)
602 alloc_aux_for_block (bb
, size
);
606 /* Clear AUX pointers of all blocks. */
609 clear_aux_for_blocks (void)
613 FOR_ALL_BB_FN (bb
, cfun
)
617 /* Free data allocated in block_aux_obstack and clear AUX pointers
621 free_aux_for_blocks (void)
623 gcc_assert (first_block_aux_obj
);
624 obstack_free (&block_aux_obstack
, first_block_aux_obj
);
625 first_block_aux_obj
= NULL
;
627 clear_aux_for_blocks ();
630 /* Allocate a memory edge of SIZE as E->aux. The obstack must
631 be first initialized by alloc_aux_for_edges. */
634 alloc_aux_for_edge (edge e
, int size
)
636 /* Verify that aux field is clear. */
637 gcc_assert (!e
->aux
&& first_edge_aux_obj
);
638 e
->aux
= obstack_alloc (&edge_aux_obstack
, size
);
639 memset (e
->aux
, 0, size
);
642 /* Initialize the edge_aux_obstack and if SIZE is nonzero, call
643 alloc_aux_for_edge for each basic edge. */
646 alloc_aux_for_edges (int size
)
648 static int initialized
;
652 gcc_obstack_init (&edge_aux_obstack
);
656 /* Check whether AUX data are still allocated. */
657 gcc_assert (!first_edge_aux_obj
);
659 first_edge_aux_obj
= obstack_alloc (&edge_aux_obstack
, 0);
664 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
),
665 EXIT_BLOCK_PTR_FOR_FN (cfun
), next_bb
)
670 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
671 alloc_aux_for_edge (e
, size
);
676 /* Clear AUX pointers of all edges. */
679 clear_aux_for_edges (void)
684 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
),
685 EXIT_BLOCK_PTR_FOR_FN (cfun
), next_bb
)
688 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
693 /* Free data allocated in edge_aux_obstack and clear AUX pointers
697 free_aux_for_edges (void)
699 gcc_assert (first_edge_aux_obj
);
700 obstack_free (&edge_aux_obstack
, first_edge_aux_obj
);
701 first_edge_aux_obj
= NULL
;
703 clear_aux_for_edges ();
707 debug_bb (basic_block bb
)
709 dump_bb (stderr
, bb
, 0, dump_flags
);
712 DEBUG_FUNCTION basic_block
715 basic_block bb
= BASIC_BLOCK_FOR_FN (cfun
, n
);
720 /* Dumps cfg related information about basic block BB to OUTF.
721 If HEADER is true, dump things that appear before the instructions
722 contained in BB. If FOOTER is true, dump things that appear after.
723 Flags are the TDF_* masks as documented in dumpfile.h.
724 NB: With TDF_DETAILS, it is assumed that cfun is available, so
725 that maybe_hot_bb_p and probably_never_executed_bb_p don't ICE. */
728 dump_bb_info (FILE *outf
, basic_block bb
, int indent
, int flags
,
729 bool do_header
, bool do_footer
)
733 static const char * const bb_bitnames
[] =
735 #define DEF_BASIC_BLOCK_FLAG(NAME,IDX) #NAME ,
736 #include "cfg-flags.def"
738 #undef DEF_BASIC_BLOCK_FLAG
740 const unsigned n_bitnames
= sizeof (bb_bitnames
) / sizeof (char *);
742 char *s_indent
= (char *) alloca ((size_t) indent
+ 1);
743 memset ((void *) s_indent
, ' ', (size_t) indent
);
744 s_indent
[indent
] = '\0';
746 gcc_assert (bb
->flags
<= BB_ALL_FLAGS
);
752 if (flags
& TDF_COMMENT
)
754 fprintf (outf
, "%sbasic block %d, loop depth %d",
755 s_indent
, bb
->index
, bb_loop_depth (bb
));
756 if (flags
& TDF_DETAILS
)
758 struct function
*fun
= DECL_STRUCT_FUNCTION (current_function_decl
);
759 fprintf (outf
, ", count " "%"PRId64
,
760 (int64_t) bb
->count
);
761 fprintf (outf
, ", freq %i", bb
->frequency
);
762 if (maybe_hot_bb_p (fun
, bb
))
763 fputs (", maybe hot", outf
);
764 if (probably_never_executed_bb_p (fun
, bb
))
765 fputs (", probably never executed", outf
);
769 if (flags
& TDF_DETAILS
)
771 check_bb_profile (bb
, outf
, indent
, flags
);
772 if (flags
& TDF_COMMENT
)
774 fprintf (outf
, "%s prev block ", s_indent
);
776 fprintf (outf
, "%d", bb
->prev_bb
->index
);
778 fprintf (outf
, "(nil)");
779 fprintf (outf
, ", next block ");
781 fprintf (outf
, "%d", bb
->next_bb
->index
);
783 fprintf (outf
, "(nil)");
785 fputs (", flags:", outf
);
787 for (i
= 0; i
< n_bitnames
; i
++)
788 if (bb
->flags
& (1 << i
))
795 fputs (bb_bitnames
[i
], outf
);
802 if (flags
& TDF_COMMENT
)
804 fprintf (outf
, "%s pred: ", s_indent
);
806 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
810 if (flags
& TDF_COMMENT
)
812 fprintf (outf
, "%s ", s_indent
);
815 dump_edge_info (outf
, e
, flags
, 0);
824 if (flags
& TDF_COMMENT
)
826 fprintf (outf
, "%s succ: ", s_indent
);
828 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
832 if (flags
& TDF_COMMENT
)
834 fprintf (outf
, "%s ", s_indent
);
837 dump_edge_info (outf
, e
, flags
, 1);
845 /* Dumps a brief description of cfg to FILE. */
848 brief_dump_cfg (FILE *file
, int flags
)
852 FOR_EACH_BB_FN (bb
, cfun
)
854 dump_bb_info (file
, bb
, 0,
855 flags
& (TDF_COMMENT
| TDF_DETAILS
),
860 /* An edge originally destinating BB of FREQUENCY and COUNT has been proved to
861 leave the block by TAKEN_EDGE. Update profile of BB such that edge E can be
862 redirected to destination of TAKEN_EDGE.
864 This function may leave the profile inconsistent in the case TAKEN_EDGE
865 frequency or count is believed to be lower than FREQUENCY or COUNT
868 update_bb_profile_for_threading (basic_block bb
, int edge_frequency
,
869 gcov_type count
, edge taken_edge
)
879 fprintf (dump_file
, "bb %i count became negative after threading",
884 /* Compute the probability of TAKEN_EDGE being reached via threaded edge.
885 Watch for overflows. */
887 prob
= GCOV_COMPUTE_SCALE (edge_frequency
, bb
->frequency
);
890 if (prob
> taken_edge
->probability
)
893 fprintf (dump_file
, "Jump threading proved probability of edge "
894 "%i->%i too small (it is %i, should be %i).\n",
895 taken_edge
->src
->index
, taken_edge
->dest
->index
,
896 taken_edge
->probability
, prob
);
897 prob
= taken_edge
->probability
;
900 /* Now rescale the probabilities. */
901 taken_edge
->probability
-= prob
;
902 prob
= REG_BR_PROB_BASE
- prob
;
903 bb
->frequency
-= edge_frequency
;
904 if (bb
->frequency
< 0)
909 fprintf (dump_file
, "Edge frequencies of bb %i has been reset, "
910 "frequency of block should end up being 0, it is %i\n",
911 bb
->index
, bb
->frequency
);
912 EDGE_SUCC (bb
, 0)->probability
= REG_BR_PROB_BASE
;
913 ei
= ei_start (bb
->succs
);
915 for (; (c
= ei_safe_edge (ei
)); ei_next (&ei
))
918 else if (prob
!= REG_BR_PROB_BASE
)
920 int scale
= RDIV (65536 * REG_BR_PROB_BASE
, prob
);
922 FOR_EACH_EDGE (c
, ei
, bb
->succs
)
924 /* Protect from overflow due to additional scaling. */
925 if (c
->probability
> prob
)
926 c
->probability
= REG_BR_PROB_BASE
;
929 c
->probability
= RDIV (c
->probability
* scale
, 65536);
930 if (c
->probability
> REG_BR_PROB_BASE
)
931 c
->probability
= REG_BR_PROB_BASE
;
936 gcc_assert (bb
== taken_edge
->src
);
937 taken_edge
->count
-= count
;
938 if (taken_edge
->count
< 0)
941 fprintf (dump_file
, "edge %i->%i count became negative after threading",
942 taken_edge
->src
->index
, taken_edge
->dest
->index
);
943 taken_edge
->count
= 0;
947 /* Multiply all frequencies of basic blocks in array BBS of length NBBS
948 by NUM/DEN, in int arithmetic. May lose some accuracy. */
950 scale_bbs_frequencies_int (basic_block
*bbs
, int nbbs
, int num
, int den
)
957 /* Scale NUM and DEN to avoid overflows. Frequencies are in order of
958 10^4, if we make DEN <= 10^3, we can afford to upscale by 100
959 and still safely fit in int during calculations. */
965 num
= RDIV (1000 * num
, den
);
971 for (i
= 0; i
< nbbs
; i
++)
974 bbs
[i
]->frequency
= RDIV (bbs
[i
]->frequency
* num
, den
);
975 /* Make sure the frequencies do not grow over BB_FREQ_MAX. */
976 if (bbs
[i
]->frequency
> BB_FREQ_MAX
)
977 bbs
[i
]->frequency
= BB_FREQ_MAX
;
978 bbs
[i
]->count
= RDIV (bbs
[i
]->count
* num
, den
);
979 FOR_EACH_EDGE (e
, ei
, bbs
[i
]->succs
)
980 e
->count
= RDIV (e
->count
* num
, den
);
984 /* numbers smaller than this value are safe to multiply without getting
986 #define MAX_SAFE_MULTIPLIER (1 << (sizeof (int64_t) * 4 - 1))
988 /* Multiply all frequencies of basic blocks in array BBS of length NBBS
989 by NUM/DEN, in gcov_type arithmetic. More accurate than previous
990 function but considerably slower. */
992 scale_bbs_frequencies_gcov_type (basic_block
*bbs
, int nbbs
, gcov_type num
,
997 gcov_type fraction
= RDIV (num
* 65536, den
);
999 gcc_assert (fraction
>= 0);
1001 if (num
< MAX_SAFE_MULTIPLIER
)
1002 for (i
= 0; i
< nbbs
; i
++)
1005 bbs
[i
]->frequency
= RDIV (bbs
[i
]->frequency
* num
, den
);
1006 if (bbs
[i
]->count
<= MAX_SAFE_MULTIPLIER
)
1007 bbs
[i
]->count
= RDIV (bbs
[i
]->count
* num
, den
);
1009 bbs
[i
]->count
= RDIV (bbs
[i
]->count
* fraction
, 65536);
1010 FOR_EACH_EDGE (e
, ei
, bbs
[i
]->succs
)
1011 if (bbs
[i
]->count
<= MAX_SAFE_MULTIPLIER
)
1012 e
->count
= RDIV (e
->count
* num
, den
);
1014 e
->count
= RDIV (e
->count
* fraction
, 65536);
1017 for (i
= 0; i
< nbbs
; i
++)
1020 if (sizeof (gcov_type
) > sizeof (int))
1021 bbs
[i
]->frequency
= RDIV (bbs
[i
]->frequency
* num
, den
);
1023 bbs
[i
]->frequency
= RDIV (bbs
[i
]->frequency
* fraction
, 65536);
1024 bbs
[i
]->count
= RDIV (bbs
[i
]->count
* fraction
, 65536);
1025 FOR_EACH_EDGE (e
, ei
, bbs
[i
]->succs
)
1026 e
->count
= RDIV (e
->count
* fraction
, 65536);
1030 /* Helper types for hash tables. */
1032 struct htab_bb_copy_original_entry
1034 /* Block we are attaching info to. */
1036 /* Index of original or copy (depending on the hashtable) */
1040 struct bb_copy_hasher
: typed_noop_remove
<htab_bb_copy_original_entry
>
1042 typedef htab_bb_copy_original_entry
*value_type
;
1043 typedef htab_bb_copy_original_entry
*compare_type
;
1044 static inline hashval_t
hash (const htab_bb_copy_original_entry
*);
1045 static inline bool equal (const htab_bb_copy_original_entry
*existing
,
1046 const htab_bb_copy_original_entry
* candidate
);
1050 bb_copy_hasher::hash (const htab_bb_copy_original_entry
*data
)
1052 return data
->index1
;
1056 bb_copy_hasher::equal (const htab_bb_copy_original_entry
*data
,
1057 const htab_bb_copy_original_entry
*data2
)
1059 return data
->index1
== data2
->index1
;
1062 /* Data structures used to maintain mapping between basic blocks and
1064 static hash_table
<bb_copy_hasher
> *bb_original
;
1065 static hash_table
<bb_copy_hasher
> *bb_copy
;
1067 /* And between loops and copies. */
1068 static hash_table
<bb_copy_hasher
> *loop_copy
;
1069 static alloc_pool original_copy_bb_pool
;
1072 /* Initialize the data structures to maintain mapping between blocks
1075 initialize_original_copy_tables (void)
1077 gcc_assert (!original_copy_bb_pool
);
1078 original_copy_bb_pool
1079 = create_alloc_pool ("original_copy",
1080 sizeof (struct htab_bb_copy_original_entry
), 10);
1081 bb_original
= new hash_table
<bb_copy_hasher
> (10);
1082 bb_copy
= new hash_table
<bb_copy_hasher
> (10);
1083 loop_copy
= new hash_table
<bb_copy_hasher
> (10);
1086 /* Free the data structures to maintain mapping between blocks and
1089 free_original_copy_tables (void)
1091 gcc_assert (original_copy_bb_pool
);
1098 free_alloc_pool (original_copy_bb_pool
);
1099 original_copy_bb_pool
= NULL
;
1102 /* Removes the value associated with OBJ from table TAB. */
1105 copy_original_table_clear (hash_table
<bb_copy_hasher
> *tab
, unsigned obj
)
1107 htab_bb_copy_original_entry
**slot
;
1108 struct htab_bb_copy_original_entry key
, *elt
;
1110 if (!original_copy_bb_pool
)
1114 slot
= tab
->find_slot (&key
, NO_INSERT
);
1119 tab
->clear_slot (slot
);
1120 pool_free (original_copy_bb_pool
, elt
);
1123 /* Sets the value associated with OBJ in table TAB to VAL.
1124 Do nothing when data structures are not initialized. */
1127 copy_original_table_set (hash_table
<bb_copy_hasher
> *tab
,
1128 unsigned obj
, unsigned val
)
1130 struct htab_bb_copy_original_entry
**slot
;
1131 struct htab_bb_copy_original_entry key
;
1133 if (!original_copy_bb_pool
)
1137 slot
= tab
->find_slot (&key
, INSERT
);
1140 *slot
= (struct htab_bb_copy_original_entry
*)
1141 pool_alloc (original_copy_bb_pool
);
1142 (*slot
)->index1
= obj
;
1144 (*slot
)->index2
= val
;
1147 /* Set original for basic block. Do nothing when data structures are not
1148 initialized so passes not needing this don't need to care. */
1150 set_bb_original (basic_block bb
, basic_block original
)
1152 copy_original_table_set (bb_original
, bb
->index
, original
->index
);
1155 /* Get the original basic block. */
1157 get_bb_original (basic_block bb
)
1159 struct htab_bb_copy_original_entry
*entry
;
1160 struct htab_bb_copy_original_entry key
;
1162 gcc_assert (original_copy_bb_pool
);
1164 key
.index1
= bb
->index
;
1165 entry
= bb_original
->find (&key
);
1167 return BASIC_BLOCK_FOR_FN (cfun
, entry
->index2
);
1172 /* Set copy for basic block. Do nothing when data structures are not
1173 initialized so passes not needing this don't need to care. */
1175 set_bb_copy (basic_block bb
, basic_block copy
)
1177 copy_original_table_set (bb_copy
, bb
->index
, copy
->index
);
1180 /* Get the copy of basic block. */
1182 get_bb_copy (basic_block bb
)
1184 struct htab_bb_copy_original_entry
*entry
;
1185 struct htab_bb_copy_original_entry key
;
1187 gcc_assert (original_copy_bb_pool
);
1189 key
.index1
= bb
->index
;
1190 entry
= bb_copy
->find (&key
);
1192 return BASIC_BLOCK_FOR_FN (cfun
, entry
->index2
);
1197 /* Set copy for LOOP to COPY. Do nothing when data structures are not
1198 initialized so passes not needing this don't need to care. */
1201 set_loop_copy (struct loop
*loop
, struct loop
*copy
)
1204 copy_original_table_clear (loop_copy
, loop
->num
);
1206 copy_original_table_set (loop_copy
, loop
->num
, copy
->num
);
1209 /* Get the copy of LOOP. */
1212 get_loop_copy (struct loop
*loop
)
1214 struct htab_bb_copy_original_entry
*entry
;
1215 struct htab_bb_copy_original_entry key
;
1217 gcc_assert (original_copy_bb_pool
);
1219 key
.index1
= loop
->num
;
1220 entry
= loop_copy
->find (&key
);
1222 return get_loop (cfun
, entry
->index2
);