1 /* Branch prediction routines for the GNU compiler.
2 Copyright (C) 2000-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/>. */
22 [1] "Branch Prediction for Free"
23 Ball and Larus; PLDI '93.
24 [2] "Static Branch Frequency and Program Profile Analysis"
25 Wu and Larus; MICRO-27.
26 [3] "Corpus-based Static Branch Prediction"
27 Calder, Grunwald, Lindsay, Martin, Mozer, and Zorn; PLDI '95. */
32 #include "coretypes.h"
37 #include "double-int.h"
44 #include "fold-const.h"
48 #include "hard-reg-set.h"
51 #include "dominance.h"
54 #include "basic-block.h"
55 #include "insn-config.h"
60 #include "diagnostic-core.h"
63 #include "statistics.h"
65 #include "fixed-value.h"
79 #include "tree-ssa-alias.h"
80 #include "internal-fn.h"
81 #include "gimple-expr.h"
84 #include "gimple-iterator.h"
85 #include "gimple-ssa.h"
86 #include "plugin-api.h"
90 #include "tree-phinodes.h"
91 #include "ssa-iterators.h"
92 #include "tree-ssa-loop-niter.h"
93 #include "tree-ssa-loop.h"
94 #include "tree-pass.h"
95 #include "tree-scalar-evolution.h"
97 /* real constants: 0, 1, 1-1/REG_BR_PROB_BASE, REG_BR_PROB_BASE,
98 1/REG_BR_PROB_BASE, 0.5, BB_FREQ_MAX. */
99 static sreal real_almost_one
, real_br_prob_base
,
100 real_inv_br_prob_base
, real_one_half
, real_bb_freq_max
;
102 static void combine_predictions_for_insn (rtx_insn
*, basic_block
);
103 static void dump_prediction (FILE *, enum br_predictor
, int, basic_block
, int);
104 static void predict_paths_leading_to (basic_block
, enum br_predictor
, enum prediction
);
105 static void predict_paths_leading_to_edge (edge
, enum br_predictor
, enum prediction
);
106 static bool can_predict_insn_p (const rtx_insn
*);
108 /* Information we hold about each branch predictor.
109 Filled using information from predict.def. */
111 struct predictor_info
113 const char *const name
; /* Name used in the debugging dumps. */
114 const int hitrate
; /* Expected hitrate used by
115 predict_insn_def call. */
119 /* Use given predictor without Dempster-Shaffer theory if it matches
120 using first_match heuristics. */
121 #define PRED_FLAG_FIRST_MATCH 1
123 /* Recompute hitrate in percent to our representation. */
125 #define HITRATE(VAL) ((int) ((VAL) * REG_BR_PROB_BASE + 50) / 100)
127 #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) {NAME, HITRATE, FLAGS},
128 static const struct predictor_info predictor_info
[]= {
129 #include "predict.def"
131 /* Upper bound on predictors. */
136 /* Return TRUE if frequency FREQ is considered to be hot. */
139 maybe_hot_frequency_p (struct function
*fun
, int freq
)
141 struct cgraph_node
*node
= cgraph_node::get (fun
->decl
);
143 || !opt_for_fn (fun
->decl
, flag_branch_probabilities
))
145 if (node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
)
147 if (node
->frequency
== NODE_FREQUENCY_HOT
)
150 if (profile_status_for_fn (fun
) == PROFILE_ABSENT
)
152 if (node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
153 && freq
< (ENTRY_BLOCK_PTR_FOR_FN (fun
)->frequency
* 2 / 3))
155 if (PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION
) == 0)
157 if (freq
< (ENTRY_BLOCK_PTR_FOR_FN (fun
)->frequency
158 / PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION
)))
163 static gcov_type min_count
= -1;
165 /* Determine the threshold for hot BB counts. */
168 get_hot_bb_threshold ()
170 gcov_working_set_t
*ws
;
173 ws
= find_working_set (PARAM_VALUE (HOT_BB_COUNT_WS_PERMILLE
));
175 min_count
= ws
->min_counter
;
180 /* Set the threshold for hot BB counts. */
183 set_hot_bb_threshold (gcov_type min
)
188 /* Return TRUE if frequency FREQ is considered to be hot. */
191 maybe_hot_count_p (struct function
*fun
, gcov_type count
)
193 if (fun
&& profile_status_for_fn (fun
) != PROFILE_READ
)
195 /* Code executed at most once is not hot. */
196 if (profile_info
->runs
>= count
)
198 return (count
>= get_hot_bb_threshold ());
201 /* Return true in case BB can be CPU intensive and should be optimized
202 for maximal performance. */
205 maybe_hot_bb_p (struct function
*fun
, const_basic_block bb
)
207 gcc_checking_assert (fun
);
208 if (profile_status_for_fn (fun
) == PROFILE_READ
)
209 return maybe_hot_count_p (fun
, bb
->count
);
210 return maybe_hot_frequency_p (fun
, bb
->frequency
);
213 /* Return true in case BB can be CPU intensive and should be optimized
214 for maximal performance. */
217 maybe_hot_edge_p (edge e
)
219 if (profile_status_for_fn (cfun
) == PROFILE_READ
)
220 return maybe_hot_count_p (cfun
, e
->count
);
221 return maybe_hot_frequency_p (cfun
, EDGE_FREQUENCY (e
));
224 /* Return true if profile COUNT and FREQUENCY, or function FUN static
225 node frequency reflects never being executed. */
228 probably_never_executed (struct function
*fun
,
229 gcov_type count
, int frequency
)
231 gcc_checking_assert (fun
);
232 if (profile_status_for_fn (fun
) == PROFILE_READ
)
234 int unlikely_count_fraction
= PARAM_VALUE (UNLIKELY_BB_COUNT_FRACTION
);
235 if (count
* unlikely_count_fraction
>= profile_info
->runs
)
239 if (!ENTRY_BLOCK_PTR_FOR_FN (fun
)->frequency
)
241 if (ENTRY_BLOCK_PTR_FOR_FN (fun
)->count
)
243 gcov_type computed_count
;
244 /* Check for possibility of overflow, in which case entry bb count
245 is large enough to do the division first without losing much
247 if (ENTRY_BLOCK_PTR_FOR_FN (fun
)->count
< REG_BR_PROB_BASE
*
250 gcov_type scaled_count
251 = frequency
* ENTRY_BLOCK_PTR_FOR_FN (fun
)->count
*
252 unlikely_count_fraction
;
253 computed_count
= RDIV (scaled_count
,
254 ENTRY_BLOCK_PTR_FOR_FN (fun
)->frequency
);
258 computed_count
= RDIV (ENTRY_BLOCK_PTR_FOR_FN (fun
)->count
,
259 ENTRY_BLOCK_PTR_FOR_FN (fun
)->frequency
);
260 computed_count
*= frequency
* unlikely_count_fraction
;
262 if (computed_count
>= profile_info
->runs
)
267 if ((!profile_info
|| !(opt_for_fn (fun
->decl
, flag_branch_probabilities
)))
268 && (cgraph_node::get (fun
->decl
)->frequency
269 == NODE_FREQUENCY_UNLIKELY_EXECUTED
))
275 /* Return true in case BB is probably never executed. */
278 probably_never_executed_bb_p (struct function
*fun
, const_basic_block bb
)
280 return probably_never_executed (fun
, bb
->count
, bb
->frequency
);
284 /* Return true in case edge E is probably never executed. */
287 probably_never_executed_edge_p (struct function
*fun
, edge e
)
289 return probably_never_executed (fun
, e
->count
, EDGE_FREQUENCY (e
));
292 /* Return true when current function should always be optimized for size. */
295 optimize_function_for_size_p (struct function
*fun
)
297 if (!fun
|| !fun
->decl
)
298 return optimize_size
;
299 cgraph_node
*n
= cgraph_node::get (fun
->decl
);
300 return n
&& n
->optimize_for_size_p ();
303 /* Return true when current function should always be optimized for speed. */
306 optimize_function_for_speed_p (struct function
*fun
)
308 return !optimize_function_for_size_p (fun
);
311 /* Return TRUE when BB should be optimized for size. */
314 optimize_bb_for_size_p (const_basic_block bb
)
316 return (optimize_function_for_size_p (cfun
)
317 || (bb
&& !maybe_hot_bb_p (cfun
, bb
)));
320 /* Return TRUE when BB should be optimized for speed. */
323 optimize_bb_for_speed_p (const_basic_block bb
)
325 return !optimize_bb_for_size_p (bb
);
328 /* Return TRUE when BB should be optimized for size. */
331 optimize_edge_for_size_p (edge e
)
333 return optimize_function_for_size_p (cfun
) || !maybe_hot_edge_p (e
);
336 /* Return TRUE when BB should be optimized for speed. */
339 optimize_edge_for_speed_p (edge e
)
341 return !optimize_edge_for_size_p (e
);
344 /* Return TRUE when BB should be optimized for size. */
347 optimize_insn_for_size_p (void)
349 return optimize_function_for_size_p (cfun
) || !crtl
->maybe_hot_insn_p
;
352 /* Return TRUE when BB should be optimized for speed. */
355 optimize_insn_for_speed_p (void)
357 return !optimize_insn_for_size_p ();
360 /* Return TRUE when LOOP should be optimized for size. */
363 optimize_loop_for_size_p (struct loop
*loop
)
365 return optimize_bb_for_size_p (loop
->header
);
368 /* Return TRUE when LOOP should be optimized for speed. */
371 optimize_loop_for_speed_p (struct loop
*loop
)
373 return optimize_bb_for_speed_p (loop
->header
);
376 /* Return TRUE when LOOP nest should be optimized for speed. */
379 optimize_loop_nest_for_speed_p (struct loop
*loop
)
381 struct loop
*l
= loop
;
382 if (optimize_loop_for_speed_p (loop
))
385 while (l
&& l
!= loop
)
387 if (optimize_loop_for_speed_p (l
))
395 while (l
!= loop
&& !l
->next
)
404 /* Return TRUE when LOOP nest should be optimized for size. */
407 optimize_loop_nest_for_size_p (struct loop
*loop
)
409 return !optimize_loop_nest_for_speed_p (loop
);
412 /* Return true when edge E is likely to be well predictable by branch
416 predictable_edge_p (edge e
)
418 if (profile_status_for_fn (cfun
) == PROFILE_ABSENT
)
421 <= PARAM_VALUE (PARAM_PREDICTABLE_BRANCH_OUTCOME
) * REG_BR_PROB_BASE
/ 100)
422 || (REG_BR_PROB_BASE
- e
->probability
423 <= PARAM_VALUE (PARAM_PREDICTABLE_BRANCH_OUTCOME
) * REG_BR_PROB_BASE
/ 100))
429 /* Set RTL expansion for BB profile. */
432 rtl_profile_for_bb (basic_block bb
)
434 crtl
->maybe_hot_insn_p
= maybe_hot_bb_p (cfun
, bb
);
437 /* Set RTL expansion for edge profile. */
440 rtl_profile_for_edge (edge e
)
442 crtl
->maybe_hot_insn_p
= maybe_hot_edge_p (e
);
445 /* Set RTL expansion to default mode (i.e. when profile info is not known). */
447 default_rtl_profile (void)
449 crtl
->maybe_hot_insn_p
= true;
452 /* Return true if the one of outgoing edges is already predicted by
456 rtl_predicted_by_p (const_basic_block bb
, enum br_predictor predictor
)
459 if (!INSN_P (BB_END (bb
)))
461 for (note
= REG_NOTES (BB_END (bb
)); note
; note
= XEXP (note
, 1))
462 if (REG_NOTE_KIND (note
) == REG_BR_PRED
463 && INTVAL (XEXP (XEXP (note
, 0), 0)) == (int)predictor
)
468 /* Structure representing predictions in tree level. */
470 struct edge_prediction
{
471 struct edge_prediction
*ep_next
;
473 enum br_predictor ep_predictor
;
477 /* This map contains for a basic block the list of predictions for the
480 static hash_map
<const_basic_block
, edge_prediction
*> *bb_predictions
;
482 /* Return true if the one of outgoing edges is already predicted by
486 gimple_predicted_by_p (const_basic_block bb
, enum br_predictor predictor
)
488 struct edge_prediction
*i
;
489 edge_prediction
**preds
= bb_predictions
->get (bb
);
494 for (i
= *preds
; i
; i
= i
->ep_next
)
495 if (i
->ep_predictor
== predictor
)
500 /* Return true when the probability of edge is reliable.
502 The profile guessing code is good at predicting branch outcome (ie.
503 taken/not taken), that is predicted right slightly over 75% of time.
504 It is however notoriously poor on predicting the probability itself.
505 In general the profile appear a lot flatter (with probabilities closer
506 to 50%) than the reality so it is bad idea to use it to drive optimization
507 such as those disabling dynamic branch prediction for well predictable
510 There are two exceptions - edges leading to noreturn edges and edges
511 predicted by number of iterations heuristics are predicted well. This macro
512 should be able to distinguish those, but at the moment it simply check for
513 noreturn heuristic that is only one giving probability over 99% or bellow
514 1%. In future we might want to propagate reliability information across the
515 CFG if we find this information useful on multiple places. */
517 probability_reliable_p (int prob
)
519 return (profile_status_for_fn (cfun
) == PROFILE_READ
520 || (profile_status_for_fn (cfun
) == PROFILE_GUESSED
521 && (prob
<= HITRATE (1) || prob
>= HITRATE (99))));
524 /* Same predicate as above, working on edges. */
526 edge_probability_reliable_p (const_edge e
)
528 return probability_reliable_p (e
->probability
);
531 /* Same predicate as edge_probability_reliable_p, working on notes. */
533 br_prob_note_reliable_p (const_rtx note
)
535 gcc_assert (REG_NOTE_KIND (note
) == REG_BR_PROB
);
536 return probability_reliable_p (XINT (note
, 0));
540 predict_insn (rtx_insn
*insn
, enum br_predictor predictor
, int probability
)
542 gcc_assert (any_condjump_p (insn
));
543 if (!flag_guess_branch_prob
)
546 add_reg_note (insn
, REG_BR_PRED
,
547 gen_rtx_CONCAT (VOIDmode
,
548 GEN_INT ((int) predictor
),
549 GEN_INT ((int) probability
)));
552 /* Predict insn by given predictor. */
555 predict_insn_def (rtx_insn
*insn
, enum br_predictor predictor
,
556 enum prediction taken
)
558 int probability
= predictor_info
[(int) predictor
].hitrate
;
561 probability
= REG_BR_PROB_BASE
- probability
;
563 predict_insn (insn
, predictor
, probability
);
566 /* Predict edge E with given probability if possible. */
569 rtl_predict_edge (edge e
, enum br_predictor predictor
, int probability
)
572 last_insn
= BB_END (e
->src
);
574 /* We can store the branch prediction information only about
575 conditional jumps. */
576 if (!any_condjump_p (last_insn
))
579 /* We always store probability of branching. */
580 if (e
->flags
& EDGE_FALLTHRU
)
581 probability
= REG_BR_PROB_BASE
- probability
;
583 predict_insn (last_insn
, predictor
, probability
);
586 /* Predict edge E with the given PROBABILITY. */
588 gimple_predict_edge (edge e
, enum br_predictor predictor
, int probability
)
590 gcc_assert (profile_status_for_fn (cfun
) != PROFILE_GUESSED
);
591 if ((e
->src
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
) && EDGE_COUNT (e
->src
->succs
) >
593 && flag_guess_branch_prob
&& optimize
)
595 struct edge_prediction
*i
= XNEW (struct edge_prediction
);
596 edge_prediction
*&preds
= bb_predictions
->get_or_insert (e
->src
);
600 i
->ep_probability
= probability
;
601 i
->ep_predictor
= predictor
;
606 /* Remove all predictions on given basic block that are attached
609 remove_predictions_associated_with_edge (edge e
)
614 edge_prediction
**preds
= bb_predictions
->get (e
->src
);
618 struct edge_prediction
**prediction
= preds
;
619 struct edge_prediction
*next
;
623 if ((*prediction
)->ep_edge
== e
)
625 next
= (*prediction
)->ep_next
;
630 prediction
= &((*prediction
)->ep_next
);
635 /* Clears the list of predictions stored for BB. */
638 clear_bb_predictions (basic_block bb
)
640 edge_prediction
**preds
= bb_predictions
->get (bb
);
641 struct edge_prediction
*pred
, *next
;
646 for (pred
= *preds
; pred
; pred
= next
)
648 next
= pred
->ep_next
;
654 /* Return true when we can store prediction on insn INSN.
655 At the moment we represent predictions only on conditional
656 jumps, not at computed jump or other complicated cases. */
658 can_predict_insn_p (const rtx_insn
*insn
)
660 return (JUMP_P (insn
)
661 && any_condjump_p (insn
)
662 && EDGE_COUNT (BLOCK_FOR_INSN (insn
)->succs
) >= 2);
665 /* Predict edge E by given predictor if possible. */
668 predict_edge_def (edge e
, enum br_predictor predictor
,
669 enum prediction taken
)
671 int probability
= predictor_info
[(int) predictor
].hitrate
;
674 probability
= REG_BR_PROB_BASE
- probability
;
676 predict_edge (e
, predictor
, probability
);
679 /* Invert all branch predictions or probability notes in the INSN. This needs
680 to be done each time we invert the condition used by the jump. */
683 invert_br_probabilities (rtx insn
)
687 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
688 if (REG_NOTE_KIND (note
) == REG_BR_PROB
)
689 XINT (note
, 0) = REG_BR_PROB_BASE
- XINT (note
, 0);
690 else if (REG_NOTE_KIND (note
) == REG_BR_PRED
)
691 XEXP (XEXP (note
, 0), 1)
692 = GEN_INT (REG_BR_PROB_BASE
- INTVAL (XEXP (XEXP (note
, 0), 1)));
695 /* Dump information about the branch prediction to the output file. */
698 dump_prediction (FILE *file
, enum br_predictor predictor
, int probability
,
699 basic_block bb
, int used
)
707 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
708 if (! (e
->flags
& EDGE_FALLTHRU
))
711 fprintf (file
, " %s heuristics%s: %.1f%%",
712 predictor_info
[predictor
].name
,
713 used
? "" : " (ignored)", probability
* 100.0 / REG_BR_PROB_BASE
);
717 fprintf (file
, " exec %"PRId64
, bb
->count
);
720 fprintf (file
, " hit %"PRId64
, e
->count
);
721 fprintf (file
, " (%.1f%%)", e
->count
* 100.0 / bb
->count
);
725 fprintf (file
, "\n");
728 /* We can not predict the probabilities of outgoing edges of bb. Set them
729 evenly and hope for the best. */
731 set_even_probabilities (basic_block bb
)
737 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
738 if (!(e
->flags
& (EDGE_EH
| EDGE_FAKE
)))
740 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
741 if (!(e
->flags
& (EDGE_EH
| EDGE_FAKE
)))
742 e
->probability
= (REG_BR_PROB_BASE
+ nedges
/ 2) / nedges
;
747 /* Combine all REG_BR_PRED notes into single probability and attach REG_BR_PROB
748 note if not already present. Remove now useless REG_BR_PRED notes. */
751 combine_predictions_for_insn (rtx_insn
*insn
, basic_block bb
)
756 int best_probability
= PROB_EVEN
;
757 enum br_predictor best_predictor
= END_PREDICTORS
;
758 int combined_probability
= REG_BR_PROB_BASE
/ 2;
760 bool first_match
= false;
763 if (!can_predict_insn_p (insn
))
765 set_even_probabilities (bb
);
769 prob_note
= find_reg_note (insn
, REG_BR_PROB
, 0);
770 pnote
= ®_NOTES (insn
);
772 fprintf (dump_file
, "Predictions for insn %i bb %i\n", INSN_UID (insn
),
775 /* We implement "first match" heuristics and use probability guessed
776 by predictor with smallest index. */
777 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
778 if (REG_NOTE_KIND (note
) == REG_BR_PRED
)
780 enum br_predictor predictor
= ((enum br_predictor
)
781 INTVAL (XEXP (XEXP (note
, 0), 0)));
782 int probability
= INTVAL (XEXP (XEXP (note
, 0), 1));
785 if (best_predictor
> predictor
)
786 best_probability
= probability
, best_predictor
= predictor
;
788 d
= (combined_probability
* probability
789 + (REG_BR_PROB_BASE
- combined_probability
)
790 * (REG_BR_PROB_BASE
- probability
));
792 /* Use FP math to avoid overflows of 32bit integers. */
794 /* If one probability is 0% and one 100%, avoid division by zero. */
795 combined_probability
= REG_BR_PROB_BASE
/ 2;
797 combined_probability
= (((double) combined_probability
) * probability
798 * REG_BR_PROB_BASE
/ d
+ 0.5);
801 /* Decide which heuristic to use. In case we didn't match anything,
802 use no_prediction heuristic, in case we did match, use either
803 first match or Dempster-Shaffer theory depending on the flags. */
805 if (predictor_info
[best_predictor
].flags
& PRED_FLAG_FIRST_MATCH
)
809 dump_prediction (dump_file
, PRED_NO_PREDICTION
,
810 combined_probability
, bb
, true);
813 dump_prediction (dump_file
, PRED_DS_THEORY
, combined_probability
,
815 dump_prediction (dump_file
, PRED_FIRST_MATCH
, best_probability
,
820 combined_probability
= best_probability
;
821 dump_prediction (dump_file
, PRED_COMBINED
, combined_probability
, bb
, true);
825 if (REG_NOTE_KIND (*pnote
) == REG_BR_PRED
)
827 enum br_predictor predictor
= ((enum br_predictor
)
828 INTVAL (XEXP (XEXP (*pnote
, 0), 0)));
829 int probability
= INTVAL (XEXP (XEXP (*pnote
, 0), 1));
831 dump_prediction (dump_file
, predictor
, probability
, bb
,
832 !first_match
|| best_predictor
== predictor
);
833 *pnote
= XEXP (*pnote
, 1);
836 pnote
= &XEXP (*pnote
, 1);
841 add_int_reg_note (insn
, REG_BR_PROB
, combined_probability
);
843 /* Save the prediction into CFG in case we are seeing non-degenerated
845 if (!single_succ_p (bb
))
847 BRANCH_EDGE (bb
)->probability
= combined_probability
;
848 FALLTHRU_EDGE (bb
)->probability
849 = REG_BR_PROB_BASE
- combined_probability
;
852 else if (!single_succ_p (bb
))
854 int prob
= XINT (prob_note
, 0);
856 BRANCH_EDGE (bb
)->probability
= prob
;
857 FALLTHRU_EDGE (bb
)->probability
= REG_BR_PROB_BASE
- prob
;
860 single_succ_edge (bb
)->probability
= REG_BR_PROB_BASE
;
863 /* Combine predictions into single probability and store them into CFG.
864 Remove now useless prediction entries. */
867 combine_predictions_for_bb (basic_block bb
)
869 int best_probability
= PROB_EVEN
;
870 enum br_predictor best_predictor
= END_PREDICTORS
;
871 int combined_probability
= REG_BR_PROB_BASE
/ 2;
873 bool first_match
= false;
875 struct edge_prediction
*pred
;
877 edge e
, first
= NULL
, second
= NULL
;
880 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
881 if (!(e
->flags
& (EDGE_EH
| EDGE_FAKE
)))
884 if (first
&& !second
)
890 /* When there is no successor or only one choice, prediction is easy.
892 We are lazy for now and predict only basic blocks with two outgoing
893 edges. It is possible to predict generic case too, but we have to
894 ignore first match heuristics and do more involved combining. Implement
899 set_even_probabilities (bb
);
900 clear_bb_predictions (bb
);
902 fprintf (dump_file
, "%i edges in bb %i predicted to even probabilities\n",
908 fprintf (dump_file
, "Predictions for bb %i\n", bb
->index
);
910 edge_prediction
**preds
= bb_predictions
->get (bb
);
913 /* We implement "first match" heuristics and use probability guessed
914 by predictor with smallest index. */
915 for (pred
= *preds
; pred
; pred
= pred
->ep_next
)
917 enum br_predictor predictor
= pred
->ep_predictor
;
918 int probability
= pred
->ep_probability
;
920 if (pred
->ep_edge
!= first
)
921 probability
= REG_BR_PROB_BASE
- probability
;
924 /* First match heuristics would be widly confused if we predicted
926 if (best_predictor
> predictor
)
928 struct edge_prediction
*pred2
;
929 int prob
= probability
;
931 for (pred2
= (struct edge_prediction
*) *preds
;
932 pred2
; pred2
= pred2
->ep_next
)
933 if (pred2
!= pred
&& pred2
->ep_predictor
== pred
->ep_predictor
)
935 int probability2
= pred
->ep_probability
;
937 if (pred2
->ep_edge
!= first
)
938 probability2
= REG_BR_PROB_BASE
- probability2
;
940 if ((probability
< REG_BR_PROB_BASE
/ 2) !=
941 (probability2
< REG_BR_PROB_BASE
/ 2))
944 /* If the same predictor later gave better result, go for it! */
945 if ((probability
>= REG_BR_PROB_BASE
/ 2 && (probability2
> probability
))
946 || (probability
<= REG_BR_PROB_BASE
/ 2 && (probability2
< probability
)))
950 best_probability
= prob
, best_predictor
= predictor
;
953 d
= (combined_probability
* probability
954 + (REG_BR_PROB_BASE
- combined_probability
)
955 * (REG_BR_PROB_BASE
- probability
));
957 /* Use FP math to avoid overflows of 32bit integers. */
959 /* If one probability is 0% and one 100%, avoid division by zero. */
960 combined_probability
= REG_BR_PROB_BASE
/ 2;
962 combined_probability
= (((double) combined_probability
)
964 * REG_BR_PROB_BASE
/ d
+ 0.5);
968 /* Decide which heuristic to use. In case we didn't match anything,
969 use no_prediction heuristic, in case we did match, use either
970 first match or Dempster-Shaffer theory depending on the flags. */
972 if (predictor_info
[best_predictor
].flags
& PRED_FLAG_FIRST_MATCH
)
976 dump_prediction (dump_file
, PRED_NO_PREDICTION
, combined_probability
, bb
, true);
979 dump_prediction (dump_file
, PRED_DS_THEORY
, combined_probability
, bb
,
981 dump_prediction (dump_file
, PRED_FIRST_MATCH
, best_probability
, bb
,
986 combined_probability
= best_probability
;
987 dump_prediction (dump_file
, PRED_COMBINED
, combined_probability
, bb
, true);
991 for (pred
= (struct edge_prediction
*) *preds
; pred
; pred
= pred
->ep_next
)
993 enum br_predictor predictor
= pred
->ep_predictor
;
994 int probability
= pred
->ep_probability
;
996 if (pred
->ep_edge
!= EDGE_SUCC (bb
, 0))
997 probability
= REG_BR_PROB_BASE
- probability
;
998 dump_prediction (dump_file
, predictor
, probability
, bb
,
999 !first_match
|| best_predictor
== predictor
);
1002 clear_bb_predictions (bb
);
1006 first
->probability
= combined_probability
;
1007 second
->probability
= REG_BR_PROB_BASE
- combined_probability
;
1011 /* Check if T1 and T2 satisfy the IV_COMPARE condition.
1012 Return the SSA_NAME if the condition satisfies, NULL otherwise.
1014 T1 and T2 should be one of the following cases:
1015 1. T1 is SSA_NAME, T2 is NULL
1016 2. T1 is SSA_NAME, T2 is INTEGER_CST between [-4, 4]
1017 3. T2 is SSA_NAME, T1 is INTEGER_CST between [-4, 4] */
1020 strips_small_constant (tree t1
, tree t2
)
1027 else if (TREE_CODE (t1
) == SSA_NAME
)
1029 else if (tree_fits_shwi_p (t1
))
1030 value
= tree_to_shwi (t1
);
1036 else if (tree_fits_shwi_p (t2
))
1037 value
= tree_to_shwi (t2
);
1038 else if (TREE_CODE (t2
) == SSA_NAME
)
1046 if (value
<= 4 && value
>= -4)
1052 /* Return the SSA_NAME in T or T's operands.
1053 Return NULL if SSA_NAME cannot be found. */
1056 get_base_value (tree t
)
1058 if (TREE_CODE (t
) == SSA_NAME
)
1061 if (!BINARY_CLASS_P (t
))
1064 switch (TREE_OPERAND_LENGTH (t
))
1067 return strips_small_constant (TREE_OPERAND (t
, 0), NULL
);
1069 return strips_small_constant (TREE_OPERAND (t
, 0),
1070 TREE_OPERAND (t
, 1));
1076 /* Check the compare STMT in LOOP. If it compares an induction
1077 variable to a loop invariant, return true, and save
1078 LOOP_INVARIANT, COMPARE_CODE and LOOP_STEP.
1079 Otherwise return false and set LOOP_INVAIANT to NULL. */
1082 is_comparison_with_loop_invariant_p (gcond
*stmt
, struct loop
*loop
,
1083 tree
*loop_invariant
,
1084 enum tree_code
*compare_code
,
1088 tree op0
, op1
, bound
, base
;
1090 enum tree_code code
;
1093 code
= gimple_cond_code (stmt
);
1094 *loop_invariant
= NULL
;
1110 op0
= gimple_cond_lhs (stmt
);
1111 op1
= gimple_cond_rhs (stmt
);
1113 if ((TREE_CODE (op0
) != SSA_NAME
&& TREE_CODE (op0
) != INTEGER_CST
)
1114 || (TREE_CODE (op1
) != SSA_NAME
&& TREE_CODE (op1
) != INTEGER_CST
))
1116 if (!simple_iv (loop
, loop_containing_stmt (stmt
), op0
, &iv0
, true))
1118 if (!simple_iv (loop
, loop_containing_stmt (stmt
), op1
, &iv1
, true))
1120 if (TREE_CODE (iv0
.step
) != INTEGER_CST
1121 || TREE_CODE (iv1
.step
) != INTEGER_CST
)
1123 if ((integer_zerop (iv0
.step
) && integer_zerop (iv1
.step
))
1124 || (!integer_zerop (iv0
.step
) && !integer_zerop (iv1
.step
)))
1127 if (integer_zerop (iv0
.step
))
1129 if (code
!= NE_EXPR
&& code
!= EQ_EXPR
)
1130 code
= invert_tree_comparison (code
, false);
1133 if (tree_fits_shwi_p (iv1
.step
))
1142 if (tree_fits_shwi_p (iv0
.step
))
1148 if (TREE_CODE (bound
) != INTEGER_CST
)
1149 bound
= get_base_value (bound
);
1152 if (TREE_CODE (base
) != INTEGER_CST
)
1153 base
= get_base_value (base
);
1157 *loop_invariant
= bound
;
1158 *compare_code
= code
;
1160 *loop_iv_base
= base
;
1164 /* Compare two SSA_NAMEs: returns TRUE if T1 and T2 are value coherent. */
1167 expr_coherent_p (tree t1
, tree t2
)
1170 tree ssa_name_1
= NULL
;
1171 tree ssa_name_2
= NULL
;
1173 gcc_assert (TREE_CODE (t1
) == SSA_NAME
|| TREE_CODE (t1
) == INTEGER_CST
);
1174 gcc_assert (TREE_CODE (t2
) == SSA_NAME
|| TREE_CODE (t2
) == INTEGER_CST
);
1179 if (TREE_CODE (t1
) == INTEGER_CST
&& TREE_CODE (t2
) == INTEGER_CST
)
1181 if (TREE_CODE (t1
) == INTEGER_CST
|| TREE_CODE (t2
) == INTEGER_CST
)
1184 /* Check to see if t1 is expressed/defined with t2. */
1185 stmt
= SSA_NAME_DEF_STMT (t1
);
1186 gcc_assert (stmt
!= NULL
);
1187 if (is_gimple_assign (stmt
))
1189 ssa_name_1
= SINGLE_SSA_TREE_OPERAND (stmt
, SSA_OP_USE
);
1190 if (ssa_name_1
&& ssa_name_1
== t2
)
1194 /* Check to see if t2 is expressed/defined with t1. */
1195 stmt
= SSA_NAME_DEF_STMT (t2
);
1196 gcc_assert (stmt
!= NULL
);
1197 if (is_gimple_assign (stmt
))
1199 ssa_name_2
= SINGLE_SSA_TREE_OPERAND (stmt
, SSA_OP_USE
);
1200 if (ssa_name_2
&& ssa_name_2
== t1
)
1204 /* Compare if t1 and t2's def_stmts are identical. */
1205 if (ssa_name_2
!= NULL
&& ssa_name_1
== ssa_name_2
)
1211 /* Predict branch probability of BB when BB contains a branch that compares
1212 an induction variable in LOOP with LOOP_IV_BASE_VAR to LOOP_BOUND_VAR. The
1213 loop exit is compared using LOOP_BOUND_CODE, with step of LOOP_BOUND_STEP.
1216 for (int i = 0; i < bound; i++) {
1223 In this loop, we will predict the branch inside the loop to be taken. */
1226 predict_iv_comparison (struct loop
*loop
, basic_block bb
,
1227 tree loop_bound_var
,
1228 tree loop_iv_base_var
,
1229 enum tree_code loop_bound_code
,
1230 int loop_bound_step
)
1233 tree compare_var
, compare_base
;
1234 enum tree_code compare_code
;
1235 tree compare_step_var
;
1239 if (predicted_by_p (bb
, PRED_LOOP_ITERATIONS_GUESSED
)
1240 || predicted_by_p (bb
, PRED_LOOP_ITERATIONS
)
1241 || predicted_by_p (bb
, PRED_LOOP_EXIT
))
1244 stmt
= last_stmt (bb
);
1245 if (!stmt
|| gimple_code (stmt
) != GIMPLE_COND
)
1247 if (!is_comparison_with_loop_invariant_p (as_a
<gcond
*> (stmt
),
1254 /* Find the taken edge. */
1255 FOR_EACH_EDGE (then_edge
, ei
, bb
->succs
)
1256 if (then_edge
->flags
& EDGE_TRUE_VALUE
)
1259 /* When comparing an IV to a loop invariant, NE is more likely to be
1260 taken while EQ is more likely to be not-taken. */
1261 if (compare_code
== NE_EXPR
)
1263 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1266 else if (compare_code
== EQ_EXPR
)
1268 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, NOT_TAKEN
);
1272 if (!expr_coherent_p (loop_iv_base_var
, compare_base
))
1275 /* If loop bound, base and compare bound are all constants, we can
1276 calculate the probability directly. */
1277 if (tree_fits_shwi_p (loop_bound_var
)
1278 && tree_fits_shwi_p (compare_var
)
1279 && tree_fits_shwi_p (compare_base
))
1282 bool overflow
, overall_overflow
= false;
1283 widest_int compare_count
, tem
;
1285 /* (loop_bound - base) / compare_step */
1286 tem
= wi::sub (wi::to_widest (loop_bound_var
),
1287 wi::to_widest (compare_base
), SIGNED
, &overflow
);
1288 overall_overflow
|= overflow
;
1289 widest_int loop_count
= wi::div_trunc (tem
,
1290 wi::to_widest (compare_step_var
),
1292 overall_overflow
|= overflow
;
1294 if (!wi::neg_p (wi::to_widest (compare_step_var
))
1295 ^ (compare_code
== LT_EXPR
|| compare_code
== LE_EXPR
))
1297 /* (loop_bound - compare_bound) / compare_step */
1298 tem
= wi::sub (wi::to_widest (loop_bound_var
),
1299 wi::to_widest (compare_var
), SIGNED
, &overflow
);
1300 overall_overflow
|= overflow
;
1301 compare_count
= wi::div_trunc (tem
, wi::to_widest (compare_step_var
),
1303 overall_overflow
|= overflow
;
1307 /* (compare_bound - base) / compare_step */
1308 tem
= wi::sub (wi::to_widest (compare_var
),
1309 wi::to_widest (compare_base
), SIGNED
, &overflow
);
1310 overall_overflow
|= overflow
;
1311 compare_count
= wi::div_trunc (tem
, wi::to_widest (compare_step_var
),
1313 overall_overflow
|= overflow
;
1315 if (compare_code
== LE_EXPR
|| compare_code
== GE_EXPR
)
1317 if (loop_bound_code
== LE_EXPR
|| loop_bound_code
== GE_EXPR
)
1319 if (wi::neg_p (compare_count
))
1321 if (wi::neg_p (loop_count
))
1323 if (loop_count
== 0)
1325 else if (wi::cmps (compare_count
, loop_count
) == 1)
1326 probability
= REG_BR_PROB_BASE
;
1329 tem
= compare_count
* REG_BR_PROB_BASE
;
1330 tem
= wi::udiv_trunc (tem
, loop_count
);
1331 probability
= tem
.to_uhwi ();
1334 if (!overall_overflow
)
1335 predict_edge (then_edge
, PRED_LOOP_IV_COMPARE
, probability
);
1340 if (expr_coherent_p (loop_bound_var
, compare_var
))
1342 if ((loop_bound_code
== LT_EXPR
|| loop_bound_code
== LE_EXPR
)
1343 && (compare_code
== LT_EXPR
|| compare_code
== LE_EXPR
))
1344 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1345 else if ((loop_bound_code
== GT_EXPR
|| loop_bound_code
== GE_EXPR
)
1346 && (compare_code
== GT_EXPR
|| compare_code
== GE_EXPR
))
1347 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1348 else if (loop_bound_code
== NE_EXPR
)
1350 /* If the loop backedge condition is "(i != bound)", we do
1351 the comparison based on the step of IV:
1352 * step < 0 : backedge condition is like (i > bound)
1353 * step > 0 : backedge condition is like (i < bound) */
1354 gcc_assert (loop_bound_step
!= 0);
1355 if (loop_bound_step
> 0
1356 && (compare_code
== LT_EXPR
1357 || compare_code
== LE_EXPR
))
1358 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1359 else if (loop_bound_step
< 0
1360 && (compare_code
== GT_EXPR
1361 || compare_code
== GE_EXPR
))
1362 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1364 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, NOT_TAKEN
);
1367 /* The branch is predicted not-taken if loop_bound_code is
1368 opposite with compare_code. */
1369 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, NOT_TAKEN
);
1371 else if (expr_coherent_p (loop_iv_base_var
, compare_var
))
1374 for (i = s; i < h; i++)
1376 The branch should be predicted taken. */
1377 if (loop_bound_step
> 0
1378 && (compare_code
== GT_EXPR
|| compare_code
== GE_EXPR
))
1379 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1380 else if (loop_bound_step
< 0
1381 && (compare_code
== LT_EXPR
|| compare_code
== LE_EXPR
))
1382 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1384 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, NOT_TAKEN
);
1388 /* Predict for extra loop exits that will lead to EXIT_EDGE. The extra loop
1389 exits are resulted from short-circuit conditions that will generate an
1392 if (foo() || global > 10)
1395 This will be translated into:
1400 if foo() goto BB6 else goto BB5
1402 if global > 10 goto BB6 else goto BB7
1406 iftmp = (PHI 0(BB5), 1(BB6))
1407 if iftmp == 1 goto BB8 else goto BB3
1409 outside of the loop...
1411 The edge BB7->BB8 is loop exit because BB8 is outside of the loop.
1412 From the dataflow, we can infer that BB4->BB6 and BB5->BB6 are also loop
1413 exits. This function takes BB7->BB8 as input, and finds out the extra loop
1414 exits to predict them using PRED_LOOP_EXIT. */
1417 predict_extra_loop_exits (edge exit_edge
)
1420 bool check_value_one
;
1421 gimple lhs_def_stmt
;
1423 tree cmp_rhs
, cmp_lhs
;
1427 last
= last_stmt (exit_edge
->src
);
1430 cmp_stmt
= dyn_cast
<gcond
*> (last
);
1434 cmp_rhs
= gimple_cond_rhs (cmp_stmt
);
1435 cmp_lhs
= gimple_cond_lhs (cmp_stmt
);
1436 if (!TREE_CONSTANT (cmp_rhs
)
1437 || !(integer_zerop (cmp_rhs
) || integer_onep (cmp_rhs
)))
1439 if (TREE_CODE (cmp_lhs
) != SSA_NAME
)
1442 /* If check_value_one is true, only the phi_args with value '1' will lead
1443 to loop exit. Otherwise, only the phi_args with value '0' will lead to
1445 check_value_one
= (((integer_onep (cmp_rhs
))
1446 ^ (gimple_cond_code (cmp_stmt
) == EQ_EXPR
))
1447 ^ ((exit_edge
->flags
& EDGE_TRUE_VALUE
) != 0));
1449 lhs_def_stmt
= SSA_NAME_DEF_STMT (cmp_lhs
);
1453 phi_stmt
= dyn_cast
<gphi
*> (lhs_def_stmt
);
1457 for (i
= 0; i
< gimple_phi_num_args (phi_stmt
); i
++)
1461 tree val
= gimple_phi_arg_def (phi_stmt
, i
);
1462 edge e
= gimple_phi_arg_edge (phi_stmt
, i
);
1464 if (!TREE_CONSTANT (val
) || !(integer_zerop (val
) || integer_onep (val
)))
1466 if ((check_value_one
^ integer_onep (val
)) == 1)
1468 if (EDGE_COUNT (e
->src
->succs
) != 1)
1470 predict_paths_leading_to_edge (e
, PRED_LOOP_EXIT
, NOT_TAKEN
);
1474 FOR_EACH_EDGE (e1
, ei
, e
->src
->preds
)
1475 predict_paths_leading_to_edge (e1
, PRED_LOOP_EXIT
, NOT_TAKEN
);
1479 /* Predict edge probabilities by exploiting loop structure. */
1482 predict_loops (void)
1486 /* Try to predict out blocks in a loop that are not part of a
1488 FOR_EACH_LOOP (loop
, 0)
1490 basic_block bb
, *bbs
;
1491 unsigned j
, n_exits
;
1493 struct tree_niter_desc niter_desc
;
1495 struct nb_iter_bound
*nb_iter
;
1496 enum tree_code loop_bound_code
= ERROR_MARK
;
1497 tree loop_bound_step
= NULL
;
1498 tree loop_bound_var
= NULL
;
1499 tree loop_iv_base
= NULL
;
1502 exits
= get_loop_exit_edges (loop
);
1503 n_exits
= exits
.length ();
1510 FOR_EACH_VEC_ELT (exits
, j
, ex
)
1513 HOST_WIDE_INT nitercst
;
1514 int max
= PARAM_VALUE (PARAM_MAX_PREDICTED_ITERATIONS
);
1516 enum br_predictor predictor
;
1518 predict_extra_loop_exits (ex
);
1520 if (number_of_iterations_exit (loop
, ex
, &niter_desc
, false, false))
1521 niter
= niter_desc
.niter
;
1522 if (!niter
|| TREE_CODE (niter_desc
.niter
) != INTEGER_CST
)
1523 niter
= loop_niter_by_eval (loop
, ex
);
1525 if (TREE_CODE (niter
) == INTEGER_CST
)
1527 if (tree_fits_uhwi_p (niter
)
1529 && compare_tree_int (niter
, max
- 1) == -1)
1530 nitercst
= tree_to_uhwi (niter
) + 1;
1533 predictor
= PRED_LOOP_ITERATIONS
;
1535 /* If we have just one exit and we can derive some information about
1536 the number of iterations of the loop from the statements inside
1537 the loop, use it to predict this exit. */
1538 else if (n_exits
== 1)
1540 nitercst
= estimated_stmt_executions_int (loop
);
1546 predictor
= PRED_LOOP_ITERATIONS_GUESSED
;
1551 /* If the prediction for number of iterations is zero, do not
1552 predict the exit edges. */
1556 probability
= ((REG_BR_PROB_BASE
+ nitercst
/ 2) / nitercst
);
1557 predict_edge (ex
, predictor
, probability
);
1561 /* Find information about loop bound variables. */
1562 for (nb_iter
= loop
->bounds
; nb_iter
;
1563 nb_iter
= nb_iter
->next
)
1565 && gimple_code (nb_iter
->stmt
) == GIMPLE_COND
)
1567 stmt
= as_a
<gcond
*> (nb_iter
->stmt
);
1570 if (!stmt
&& last_stmt (loop
->header
)
1571 && gimple_code (last_stmt (loop
->header
)) == GIMPLE_COND
)
1572 stmt
= as_a
<gcond
*> (last_stmt (loop
->header
));
1574 is_comparison_with_loop_invariant_p (stmt
, loop
,
1580 bbs
= get_loop_body (loop
);
1582 for (j
= 0; j
< loop
->num_nodes
; j
++)
1584 int header_found
= 0;
1590 /* Bypass loop heuristics on continue statement. These
1591 statements construct loops via "non-loop" constructs
1592 in the source language and are better to be handled
1594 if (predicted_by_p (bb
, PRED_CONTINUE
))
1597 /* Loop branch heuristics - predict an edge back to a
1598 loop's head as taken. */
1599 if (bb
== loop
->latch
)
1601 e
= find_edge (loop
->latch
, loop
->header
);
1605 predict_edge_def (e
, PRED_LOOP_BRANCH
, TAKEN
);
1609 /* Loop exit heuristics - predict an edge exiting the loop if the
1610 conditional has no loop header successors as not taken. */
1612 /* If we already used more reliable loop exit predictors, do not
1613 bother with PRED_LOOP_EXIT. */
1614 && !predicted_by_p (bb
, PRED_LOOP_ITERATIONS_GUESSED
)
1615 && !predicted_by_p (bb
, PRED_LOOP_ITERATIONS
))
1617 /* For loop with many exits we don't want to predict all exits
1618 with the pretty large probability, because if all exits are
1619 considered in row, the loop would be predicted to iterate
1620 almost never. The code to divide probability by number of
1621 exits is very rough. It should compute the number of exits
1622 taken in each patch through function (not the overall number
1623 of exits that might be a lot higher for loops with wide switch
1624 statements in them) and compute n-th square root.
1626 We limit the minimal probability by 2% to avoid
1627 EDGE_PROBABILITY_RELIABLE from trusting the branch prediction
1628 as this was causing regression in perl benchmark containing such
1631 int probability
= ((REG_BR_PROB_BASE
1632 - predictor_info
[(int) PRED_LOOP_EXIT
].hitrate
)
1634 if (probability
< HITRATE (2))
1635 probability
= HITRATE (2);
1636 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1637 if (e
->dest
->index
< NUM_FIXED_BLOCKS
1638 || !flow_bb_inside_loop_p (loop
, e
->dest
))
1639 predict_edge (e
, PRED_LOOP_EXIT
, probability
);
1642 predict_iv_comparison (loop
, bb
, loop_bound_var
, loop_iv_base
,
1644 tree_to_shwi (loop_bound_step
));
1647 /* Free basic blocks from get_loop_body. */
1652 /* Attempt to predict probabilities of BB outgoing edges using local
1655 bb_estimate_probability_locally (basic_block bb
)
1657 rtx_insn
*last_insn
= BB_END (bb
);
1660 if (! can_predict_insn_p (last_insn
))
1662 cond
= get_condition (last_insn
, NULL
, false, false);
1666 /* Try "pointer heuristic."
1667 A comparison ptr == 0 is predicted as false.
1668 Similarly, a comparison ptr1 == ptr2 is predicted as false. */
1669 if (COMPARISON_P (cond
)
1670 && ((REG_P (XEXP (cond
, 0)) && REG_POINTER (XEXP (cond
, 0)))
1671 || (REG_P (XEXP (cond
, 1)) && REG_POINTER (XEXP (cond
, 1)))))
1673 if (GET_CODE (cond
) == EQ
)
1674 predict_insn_def (last_insn
, PRED_POINTER
, NOT_TAKEN
);
1675 else if (GET_CODE (cond
) == NE
)
1676 predict_insn_def (last_insn
, PRED_POINTER
, TAKEN
);
1680 /* Try "opcode heuristic."
1681 EQ tests are usually false and NE tests are usually true. Also,
1682 most quantities are positive, so we can make the appropriate guesses
1683 about signed comparisons against zero. */
1684 switch (GET_CODE (cond
))
1687 /* Unconditional branch. */
1688 predict_insn_def (last_insn
, PRED_UNCONDITIONAL
,
1689 cond
== const0_rtx
? NOT_TAKEN
: TAKEN
);
1694 /* Floating point comparisons appears to behave in a very
1695 unpredictable way because of special role of = tests in
1697 if (FLOAT_MODE_P (GET_MODE (XEXP (cond
, 0))))
1699 /* Comparisons with 0 are often used for booleans and there is
1700 nothing useful to predict about them. */
1701 else if (XEXP (cond
, 1) == const0_rtx
1702 || XEXP (cond
, 0) == const0_rtx
)
1705 predict_insn_def (last_insn
, PRED_OPCODE_NONEQUAL
, NOT_TAKEN
);
1710 /* Floating point comparisons appears to behave in a very
1711 unpredictable way because of special role of = tests in
1713 if (FLOAT_MODE_P (GET_MODE (XEXP (cond
, 0))))
1715 /* Comparisons with 0 are often used for booleans and there is
1716 nothing useful to predict about them. */
1717 else if (XEXP (cond
, 1) == const0_rtx
1718 || XEXP (cond
, 0) == const0_rtx
)
1721 predict_insn_def (last_insn
, PRED_OPCODE_NONEQUAL
, TAKEN
);
1725 predict_insn_def (last_insn
, PRED_FPOPCODE
, TAKEN
);
1729 predict_insn_def (last_insn
, PRED_FPOPCODE
, NOT_TAKEN
);
1734 if (XEXP (cond
, 1) == const0_rtx
|| XEXP (cond
, 1) == const1_rtx
1735 || XEXP (cond
, 1) == constm1_rtx
)
1736 predict_insn_def (last_insn
, PRED_OPCODE_POSITIVE
, NOT_TAKEN
);
1741 if (XEXP (cond
, 1) == const0_rtx
|| XEXP (cond
, 1) == const1_rtx
1742 || XEXP (cond
, 1) == constm1_rtx
)
1743 predict_insn_def (last_insn
, PRED_OPCODE_POSITIVE
, TAKEN
);
1751 /* Set edge->probability for each successor edge of BB. */
1753 guess_outgoing_edge_probabilities (basic_block bb
)
1755 bb_estimate_probability_locally (bb
);
1756 combine_predictions_for_insn (BB_END (bb
), bb
);
1759 static tree
expr_expected_value (tree
, bitmap
, enum br_predictor
*predictor
);
1761 /* Helper function for expr_expected_value. */
1764 expr_expected_value_1 (tree type
, tree op0
, enum tree_code code
,
1765 tree op1
, bitmap visited
, enum br_predictor
*predictor
)
1770 *predictor
= PRED_UNCONDITIONAL
;
1772 if (get_gimple_rhs_class (code
) == GIMPLE_SINGLE_RHS
)
1774 if (TREE_CONSTANT (op0
))
1777 if (code
!= SSA_NAME
)
1780 def
= SSA_NAME_DEF_STMT (op0
);
1782 /* If we were already here, break the infinite cycle. */
1783 if (!bitmap_set_bit (visited
, SSA_NAME_VERSION (op0
)))
1786 if (gimple_code (def
) == GIMPLE_PHI
)
1788 /* All the arguments of the PHI node must have the same constant
1790 int i
, n
= gimple_phi_num_args (def
);
1791 tree val
= NULL
, new_val
;
1793 for (i
= 0; i
< n
; i
++)
1795 tree arg
= PHI_ARG_DEF (def
, i
);
1796 enum br_predictor predictor2
;
1798 /* If this PHI has itself as an argument, we cannot
1799 determine the string length of this argument. However,
1800 if we can find an expected constant value for the other
1801 PHI args then we can still be sure that this is
1802 likely a constant. So be optimistic and just
1803 continue with the next argument. */
1804 if (arg
== PHI_RESULT (def
))
1807 new_val
= expr_expected_value (arg
, visited
, &predictor2
);
1809 /* It is difficult to combine value predictors. Simply assume
1810 that later predictor is weaker and take its prediction. */
1811 if (predictor
&& *predictor
< predictor2
)
1812 *predictor
= predictor2
;
1817 else if (!operand_equal_p (val
, new_val
, false))
1822 if (is_gimple_assign (def
))
1824 if (gimple_assign_lhs (def
) != op0
)
1827 return expr_expected_value_1 (TREE_TYPE (gimple_assign_lhs (def
)),
1828 gimple_assign_rhs1 (def
),
1829 gimple_assign_rhs_code (def
),
1830 gimple_assign_rhs2 (def
),
1831 visited
, predictor
);
1834 if (is_gimple_call (def
))
1836 tree decl
= gimple_call_fndecl (def
);
1839 if (gimple_call_internal_p (def
)
1840 && gimple_call_internal_fn (def
) == IFN_BUILTIN_EXPECT
)
1842 gcc_assert (gimple_call_num_args (def
) == 3);
1843 tree val
= gimple_call_arg (def
, 0);
1844 if (TREE_CONSTANT (val
))
1848 tree val2
= gimple_call_arg (def
, 2);
1849 gcc_assert (TREE_CODE (val2
) == INTEGER_CST
1850 && tree_fits_uhwi_p (val2
)
1851 && tree_to_uhwi (val2
) < END_PREDICTORS
);
1852 *predictor
= (enum br_predictor
) tree_to_uhwi (val2
);
1854 return gimple_call_arg (def
, 1);
1858 if (DECL_BUILT_IN_CLASS (decl
) == BUILT_IN_NORMAL
)
1859 switch (DECL_FUNCTION_CODE (decl
))
1861 case BUILT_IN_EXPECT
:
1864 if (gimple_call_num_args (def
) != 2)
1866 val
= gimple_call_arg (def
, 0);
1867 if (TREE_CONSTANT (val
))
1870 *predictor
= PRED_BUILTIN_EXPECT
;
1871 return gimple_call_arg (def
, 1);
1874 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N
:
1875 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1
:
1876 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2
:
1877 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4
:
1878 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8
:
1879 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16
:
1880 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE
:
1881 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N
:
1882 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1
:
1883 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2
:
1884 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4
:
1885 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8
:
1886 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16
:
1887 /* Assume that any given atomic operation has low contention,
1888 and thus the compare-and-swap operation succeeds. */
1890 *predictor
= PRED_COMPARE_AND_SWAP
;
1891 return boolean_true_node
;
1900 if (get_gimple_rhs_class (code
) == GIMPLE_BINARY_RHS
)
1903 enum br_predictor predictor2
;
1904 op0
= expr_expected_value (op0
, visited
, predictor
);
1907 op1
= expr_expected_value (op1
, visited
, &predictor2
);
1908 if (predictor
&& *predictor
< predictor2
)
1909 *predictor
= predictor2
;
1912 res
= fold_build2 (code
, type
, op0
, op1
);
1913 if (TREE_CONSTANT (res
))
1917 if (get_gimple_rhs_class (code
) == GIMPLE_UNARY_RHS
)
1920 op0
= expr_expected_value (op0
, visited
, predictor
);
1923 res
= fold_build1 (code
, type
, op0
);
1924 if (TREE_CONSTANT (res
))
1931 /* Return constant EXPR will likely have at execution time, NULL if unknown.
1932 The function is used by builtin_expect branch predictor so the evidence
1933 must come from this construct and additional possible constant folding.
1935 We may want to implement more involved value guess (such as value range
1936 propagation based prediction), but such tricks shall go to new
1940 expr_expected_value (tree expr
, bitmap visited
,
1941 enum br_predictor
*predictor
)
1943 enum tree_code code
;
1946 if (TREE_CONSTANT (expr
))
1949 *predictor
= PRED_UNCONDITIONAL
;
1953 extract_ops_from_tree (expr
, &code
, &op0
, &op1
);
1954 return expr_expected_value_1 (TREE_TYPE (expr
),
1955 op0
, code
, op1
, visited
, predictor
);
1958 /* Predict using opcode of the last statement in basic block. */
1960 tree_predict_by_opcode (basic_block bb
)
1962 gimple stmt
= last_stmt (bb
);
1970 enum br_predictor predictor
;
1972 if (!stmt
|| gimple_code (stmt
) != GIMPLE_COND
)
1974 FOR_EACH_EDGE (then_edge
, ei
, bb
->succs
)
1975 if (then_edge
->flags
& EDGE_TRUE_VALUE
)
1977 op0
= gimple_cond_lhs (stmt
);
1978 op1
= gimple_cond_rhs (stmt
);
1979 cmp
= gimple_cond_code (stmt
);
1980 type
= TREE_TYPE (op0
);
1981 visited
= BITMAP_ALLOC (NULL
);
1982 val
= expr_expected_value_1 (boolean_type_node
, op0
, cmp
, op1
, visited
,
1984 BITMAP_FREE (visited
);
1985 if (val
&& TREE_CODE (val
) == INTEGER_CST
)
1987 if (predictor
== PRED_BUILTIN_EXPECT
)
1989 int percent
= PARAM_VALUE (BUILTIN_EXPECT_PROBABILITY
);
1991 gcc_assert (percent
>= 0 && percent
<= 100);
1992 if (integer_zerop (val
))
1993 percent
= 100 - percent
;
1994 predict_edge (then_edge
, PRED_BUILTIN_EXPECT
, HITRATE (percent
));
1997 predict_edge (then_edge
, predictor
,
1998 integer_zerop (val
) ? NOT_TAKEN
: TAKEN
);
2000 /* Try "pointer heuristic."
2001 A comparison ptr == 0 is predicted as false.
2002 Similarly, a comparison ptr1 == ptr2 is predicted as false. */
2003 if (POINTER_TYPE_P (type
))
2006 predict_edge_def (then_edge
, PRED_TREE_POINTER
, NOT_TAKEN
);
2007 else if (cmp
== NE_EXPR
)
2008 predict_edge_def (then_edge
, PRED_TREE_POINTER
, TAKEN
);
2012 /* Try "opcode heuristic."
2013 EQ tests are usually false and NE tests are usually true. Also,
2014 most quantities are positive, so we can make the appropriate guesses
2015 about signed comparisons against zero. */
2020 /* Floating point comparisons appears to behave in a very
2021 unpredictable way because of special role of = tests in
2023 if (FLOAT_TYPE_P (type
))
2025 /* Comparisons with 0 are often used for booleans and there is
2026 nothing useful to predict about them. */
2027 else if (integer_zerop (op0
) || integer_zerop (op1
))
2030 predict_edge_def (then_edge
, PRED_TREE_OPCODE_NONEQUAL
, NOT_TAKEN
);
2035 /* Floating point comparisons appears to behave in a very
2036 unpredictable way because of special role of = tests in
2038 if (FLOAT_TYPE_P (type
))
2040 /* Comparisons with 0 are often used for booleans and there is
2041 nothing useful to predict about them. */
2042 else if (integer_zerop (op0
)
2043 || integer_zerop (op1
))
2046 predict_edge_def (then_edge
, PRED_TREE_OPCODE_NONEQUAL
, TAKEN
);
2050 predict_edge_def (then_edge
, PRED_TREE_FPOPCODE
, TAKEN
);
2053 case UNORDERED_EXPR
:
2054 predict_edge_def (then_edge
, PRED_TREE_FPOPCODE
, NOT_TAKEN
);
2059 if (integer_zerop (op1
)
2060 || integer_onep (op1
)
2061 || integer_all_onesp (op1
)
2064 || real_minus_onep (op1
))
2065 predict_edge_def (then_edge
, PRED_TREE_OPCODE_POSITIVE
, NOT_TAKEN
);
2070 if (integer_zerop (op1
)
2071 || integer_onep (op1
)
2072 || integer_all_onesp (op1
)
2075 || real_minus_onep (op1
))
2076 predict_edge_def (then_edge
, PRED_TREE_OPCODE_POSITIVE
, TAKEN
);
2084 /* Try to guess whether the value of return means error code. */
2086 static enum br_predictor
2087 return_prediction (tree val
, enum prediction
*prediction
)
2091 return PRED_NO_PREDICTION
;
2092 /* Different heuristics for pointers and scalars. */
2093 if (POINTER_TYPE_P (TREE_TYPE (val
)))
2095 /* NULL is usually not returned. */
2096 if (integer_zerop (val
))
2098 *prediction
= NOT_TAKEN
;
2099 return PRED_NULL_RETURN
;
2102 else if (INTEGRAL_TYPE_P (TREE_TYPE (val
)))
2104 /* Negative return values are often used to indicate
2106 if (TREE_CODE (val
) == INTEGER_CST
2107 && tree_int_cst_sgn (val
) < 0)
2109 *prediction
= NOT_TAKEN
;
2110 return PRED_NEGATIVE_RETURN
;
2112 /* Constant return values seems to be commonly taken.
2113 Zero/one often represent booleans so exclude them from the
2115 if (TREE_CONSTANT (val
)
2116 && (!integer_zerop (val
) && !integer_onep (val
)))
2118 *prediction
= TAKEN
;
2119 return PRED_CONST_RETURN
;
2122 return PRED_NO_PREDICTION
;
2125 /* Find the basic block with return expression and look up for possible
2126 return value trying to apply RETURN_PREDICTION heuristics. */
2128 apply_return_prediction (void)
2130 greturn
*return_stmt
= NULL
;
2134 int phi_num_args
, i
;
2135 enum br_predictor pred
;
2136 enum prediction direction
;
2139 FOR_EACH_EDGE (e
, ei
, EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
)
2141 gimple last
= last_stmt (e
->src
);
2143 && gimple_code (last
) == GIMPLE_RETURN
)
2145 return_stmt
= as_a
<greturn
*> (last
);
2151 return_val
= gimple_return_retval (return_stmt
);
2154 if (TREE_CODE (return_val
) != SSA_NAME
2155 || !SSA_NAME_DEF_STMT (return_val
)
2156 || gimple_code (SSA_NAME_DEF_STMT (return_val
)) != GIMPLE_PHI
)
2158 phi
= as_a
<gphi
*> (SSA_NAME_DEF_STMT (return_val
));
2159 phi_num_args
= gimple_phi_num_args (phi
);
2160 pred
= return_prediction (PHI_ARG_DEF (phi
, 0), &direction
);
2162 /* Avoid the degenerate case where all return values form the function
2163 belongs to same category (ie they are all positive constants)
2164 so we can hardly say something about them. */
2165 for (i
= 1; i
< phi_num_args
; i
++)
2166 if (pred
!= return_prediction (PHI_ARG_DEF (phi
, i
), &direction
))
2168 if (i
!= phi_num_args
)
2169 for (i
= 0; i
< phi_num_args
; i
++)
2171 pred
= return_prediction (PHI_ARG_DEF (phi
, i
), &direction
);
2172 if (pred
!= PRED_NO_PREDICTION
)
2173 predict_paths_leading_to_edge (gimple_phi_arg_edge (phi
, i
), pred
,
2178 /* Look for basic block that contains unlikely to happen events
2179 (such as noreturn calls) and mark all paths leading to execution
2180 of this basic blocks as unlikely. */
2183 tree_bb_level_predictions (void)
2186 bool has_return_edges
= false;
2190 FOR_EACH_EDGE (e
, ei
, EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
)
2191 if (!(e
->flags
& (EDGE_ABNORMAL
| EDGE_FAKE
| EDGE_EH
)))
2193 has_return_edges
= true;
2197 apply_return_prediction ();
2199 FOR_EACH_BB_FN (bb
, cfun
)
2201 gimple_stmt_iterator gsi
;
2203 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2205 gimple stmt
= gsi_stmt (gsi
);
2208 if (is_gimple_call (stmt
))
2210 if ((gimple_call_flags (stmt
) & ECF_NORETURN
)
2211 && has_return_edges
)
2212 predict_paths_leading_to (bb
, PRED_NORETURN
,
2214 decl
= gimple_call_fndecl (stmt
);
2216 && lookup_attribute ("cold",
2217 DECL_ATTRIBUTES (decl
)))
2218 predict_paths_leading_to (bb
, PRED_COLD_FUNCTION
,
2221 else if (gimple_code (stmt
) == GIMPLE_PREDICT
)
2223 predict_paths_leading_to (bb
, gimple_predict_predictor (stmt
),
2224 gimple_predict_outcome (stmt
));
2225 /* Keep GIMPLE_PREDICT around so early inlining will propagate
2226 hints to callers. */
2232 #ifdef ENABLE_CHECKING
2234 /* Callback for hash_map::traverse, asserts that the pointer map is
2238 assert_is_empty (const_basic_block
const &, edge_prediction
*const &value
,
2241 gcc_assert (!value
);
2246 /* Predict branch probabilities and estimate profile for basic block BB. */
2249 tree_estimate_probability_bb (basic_block bb
)
2255 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2257 /* Predict edges to user labels with attributes. */
2258 if (e
->dest
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
2260 gimple_stmt_iterator gi
;
2261 for (gi
= gsi_start_bb (e
->dest
); !gsi_end_p (gi
); gsi_next (&gi
))
2263 glabel
*label_stmt
= dyn_cast
<glabel
*> (gsi_stmt (gi
));
2268 decl
= gimple_label_label (label_stmt
);
2269 if (DECL_ARTIFICIAL (decl
))
2272 /* Finally, we have a user-defined label. */
2273 if (lookup_attribute ("cold", DECL_ATTRIBUTES (decl
)))
2274 predict_edge_def (e
, PRED_COLD_LABEL
, NOT_TAKEN
);
2275 else if (lookup_attribute ("hot", DECL_ATTRIBUTES (decl
)))
2276 predict_edge_def (e
, PRED_HOT_LABEL
, TAKEN
);
2280 /* Predict early returns to be probable, as we've already taken
2281 care for error returns and other cases are often used for
2282 fast paths through function.
2284 Since we've already removed the return statements, we are
2285 looking for CFG like:
2295 if (e
->dest
!= bb
->next_bb
2296 && e
->dest
!= EXIT_BLOCK_PTR_FOR_FN (cfun
)
2297 && single_succ_p (e
->dest
)
2298 && single_succ_edge (e
->dest
)->dest
== EXIT_BLOCK_PTR_FOR_FN (cfun
)
2299 && (last
= last_stmt (e
->dest
)) != NULL
2300 && gimple_code (last
) == GIMPLE_RETURN
)
2305 if (single_succ_p (bb
))
2307 FOR_EACH_EDGE (e1
, ei1
, bb
->preds
)
2308 if (!predicted_by_p (e1
->src
, PRED_NULL_RETURN
)
2309 && !predicted_by_p (e1
->src
, PRED_CONST_RETURN
)
2310 && !predicted_by_p (e1
->src
, PRED_NEGATIVE_RETURN
))
2311 predict_edge_def (e1
, PRED_TREE_EARLY_RETURN
, NOT_TAKEN
);
2314 if (!predicted_by_p (e
->src
, PRED_NULL_RETURN
)
2315 && !predicted_by_p (e
->src
, PRED_CONST_RETURN
)
2316 && !predicted_by_p (e
->src
, PRED_NEGATIVE_RETURN
))
2317 predict_edge_def (e
, PRED_TREE_EARLY_RETURN
, NOT_TAKEN
);
2320 /* Look for block we are guarding (ie we dominate it,
2321 but it doesn't postdominate us). */
2322 if (e
->dest
!= EXIT_BLOCK_PTR_FOR_FN (cfun
) && e
->dest
!= bb
2323 && dominated_by_p (CDI_DOMINATORS
, e
->dest
, e
->src
)
2324 && !dominated_by_p (CDI_POST_DOMINATORS
, e
->src
, e
->dest
))
2326 gimple_stmt_iterator bi
;
2328 /* The call heuristic claims that a guarded function call
2329 is improbable. This is because such calls are often used
2330 to signal exceptional situations such as printing error
2332 for (bi
= gsi_start_bb (e
->dest
); !gsi_end_p (bi
);
2335 gimple stmt
= gsi_stmt (bi
);
2336 if (is_gimple_call (stmt
)
2337 /* Constant and pure calls are hardly used to signalize
2338 something exceptional. */
2339 && gimple_has_side_effects (stmt
))
2341 predict_edge_def (e
, PRED_CALL
, NOT_TAKEN
);
2347 tree_predict_by_opcode (bb
);
2350 /* Predict branch probabilities and estimate profile of the tree CFG.
2351 This function can be called from the loop optimizers to recompute
2352 the profile information. */
2355 tree_estimate_probability (void)
2359 add_noreturn_fake_exit_edges ();
2360 connect_infinite_loops_to_exit ();
2361 /* We use loop_niter_by_eval, which requires that the loops have
2363 create_preheaders (CP_SIMPLE_PREHEADERS
);
2364 calculate_dominance_info (CDI_POST_DOMINATORS
);
2366 bb_predictions
= new hash_map
<const_basic_block
, edge_prediction
*>;
2367 tree_bb_level_predictions ();
2368 record_loop_exits ();
2370 if (number_of_loops (cfun
) > 1)
2373 FOR_EACH_BB_FN (bb
, cfun
)
2374 tree_estimate_probability_bb (bb
);
2376 FOR_EACH_BB_FN (bb
, cfun
)
2377 combine_predictions_for_bb (bb
);
2379 #ifdef ENABLE_CHECKING
2380 bb_predictions
->traverse
<void *, assert_is_empty
> (NULL
);
2382 delete bb_predictions
;
2383 bb_predictions
= NULL
;
2385 estimate_bb_frequencies (false);
2386 free_dominance_info (CDI_POST_DOMINATORS
);
2387 remove_fake_exit_edges ();
2390 /* Predict edges to successors of CUR whose sources are not postdominated by
2391 BB by PRED and recurse to all postdominators. */
2394 predict_paths_for_bb (basic_block cur
, basic_block bb
,
2395 enum br_predictor pred
,
2396 enum prediction taken
,
2403 /* We are looking for all edges forming edge cut induced by
2404 set of all blocks postdominated by BB. */
2405 FOR_EACH_EDGE (e
, ei
, cur
->preds
)
2406 if (e
->src
->index
>= NUM_FIXED_BLOCKS
2407 && !dominated_by_p (CDI_POST_DOMINATORS
, e
->src
, bb
))
2413 /* Ignore fake edges and eh, we predict them as not taken anyway. */
2414 if (e
->flags
& (EDGE_EH
| EDGE_FAKE
))
2416 gcc_assert (bb
== cur
|| dominated_by_p (CDI_POST_DOMINATORS
, cur
, bb
));
2418 /* See if there is an edge from e->src that is not abnormal
2419 and does not lead to BB. */
2420 FOR_EACH_EDGE (e2
, ei2
, e
->src
->succs
)
2422 && !(e2
->flags
& (EDGE_EH
| EDGE_FAKE
))
2423 && !dominated_by_p (CDI_POST_DOMINATORS
, e2
->dest
, bb
))
2429 /* If there is non-abnormal path leaving e->src, predict edge
2430 using predictor. Otherwise we need to look for paths
2433 The second may lead to infinite loop in the case we are predicitng
2434 regions that are only reachable by abnormal edges. We simply
2435 prevent visiting given BB twice. */
2437 predict_edge_def (e
, pred
, taken
);
2438 else if (bitmap_set_bit (visited
, e
->src
->index
))
2439 predict_paths_for_bb (e
->src
, e
->src
, pred
, taken
, visited
);
2441 for (son
= first_dom_son (CDI_POST_DOMINATORS
, cur
);
2443 son
= next_dom_son (CDI_POST_DOMINATORS
, son
))
2444 predict_paths_for_bb (son
, bb
, pred
, taken
, visited
);
2447 /* Sets branch probabilities according to PREDiction and
2451 predict_paths_leading_to (basic_block bb
, enum br_predictor pred
,
2452 enum prediction taken
)
2454 bitmap visited
= BITMAP_ALLOC (NULL
);
2455 predict_paths_for_bb (bb
, bb
, pred
, taken
, visited
);
2456 BITMAP_FREE (visited
);
2459 /* Like predict_paths_leading_to but take edge instead of basic block. */
2462 predict_paths_leading_to_edge (edge e
, enum br_predictor pred
,
2463 enum prediction taken
)
2465 bool has_nonloop_edge
= false;
2469 basic_block bb
= e
->src
;
2470 FOR_EACH_EDGE (e2
, ei
, bb
->succs
)
2471 if (e2
->dest
!= e
->src
&& e2
->dest
!= e
->dest
2472 && !(e
->flags
& (EDGE_EH
| EDGE_FAKE
))
2473 && !dominated_by_p (CDI_POST_DOMINATORS
, e
->src
, e2
->dest
))
2475 has_nonloop_edge
= true;
2478 if (!has_nonloop_edge
)
2480 bitmap visited
= BITMAP_ALLOC (NULL
);
2481 predict_paths_for_bb (bb
, bb
, pred
, taken
, visited
);
2482 BITMAP_FREE (visited
);
2485 predict_edge_def (e
, pred
, taken
);
2488 /* This is used to carry information about basic blocks. It is
2489 attached to the AUX field of the standard CFG block. */
2493 /* Estimated frequency of execution of basic_block. */
2496 /* To keep queue of basic blocks to process. */
2499 /* Number of predecessors we need to visit first. */
2503 /* Similar information for edges. */
2504 struct edge_prob_info
2506 /* In case edge is a loopback edge, the probability edge will be reached
2507 in case header is. Estimated number of iterations of the loop can be
2508 then computed as 1 / (1 - back_edge_prob). */
2509 sreal back_edge_prob
;
2510 /* True if the edge is a loopback edge in the natural loop. */
2511 unsigned int back_edge
:1;
2514 #define BLOCK_INFO(B) ((block_info *) (B)->aux)
2516 #define EDGE_INFO(E) ((edge_prob_info *) (E)->aux)
2518 /* Helper function for estimate_bb_frequencies.
2519 Propagate the frequencies in blocks marked in
2520 TOVISIT, starting in HEAD. */
2523 propagate_freq (basic_block head
, bitmap tovisit
)
2532 /* For each basic block we need to visit count number of his predecessors
2533 we need to visit first. */
2534 EXECUTE_IF_SET_IN_BITMAP (tovisit
, 0, i
, bi
)
2539 bb
= BASIC_BLOCK_FOR_FN (cfun
, i
);
2541 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
2543 bool visit
= bitmap_bit_p (tovisit
, e
->src
->index
);
2545 if (visit
&& !(e
->flags
& EDGE_DFS_BACK
))
2547 else if (visit
&& dump_file
&& !EDGE_INFO (e
)->back_edge
)
2549 "Irreducible region hit, ignoring edge to %i->%i\n",
2550 e
->src
->index
, bb
->index
);
2552 BLOCK_INFO (bb
)->npredecessors
= count
;
2553 /* When function never returns, we will never process exit block. */
2554 if (!count
&& bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
2555 bb
->count
= bb
->frequency
= 0;
2558 BLOCK_INFO (head
)->frequency
= 1;
2560 for (bb
= head
; bb
; bb
= nextbb
)
2563 sreal cyclic_probability
= 0;
2564 sreal frequency
= 0;
2566 nextbb
= BLOCK_INFO (bb
)->next
;
2567 BLOCK_INFO (bb
)->next
= NULL
;
2569 /* Compute frequency of basic block. */
2572 #ifdef ENABLE_CHECKING
2573 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
2574 gcc_assert (!bitmap_bit_p (tovisit
, e
->src
->index
)
2575 || (e
->flags
& EDGE_DFS_BACK
));
2578 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
2579 if (EDGE_INFO (e
)->back_edge
)
2581 cyclic_probability
+= EDGE_INFO (e
)->back_edge_prob
;
2583 else if (!(e
->flags
& EDGE_DFS_BACK
))
2585 /* frequency += (e->probability
2586 * BLOCK_INFO (e->src)->frequency /
2587 REG_BR_PROB_BASE); */
2589 sreal tmp
= e
->probability
;
2590 tmp
*= BLOCK_INFO (e
->src
)->frequency
;
2591 tmp
*= real_inv_br_prob_base
;
2595 if (cyclic_probability
== 0)
2597 BLOCK_INFO (bb
)->frequency
= frequency
;
2601 if (cyclic_probability
> real_almost_one
)
2602 cyclic_probability
= real_almost_one
;
2604 /* BLOCK_INFO (bb)->frequency = frequency
2605 / (1 - cyclic_probability) */
2607 cyclic_probability
= sreal (1) - cyclic_probability
;
2608 BLOCK_INFO (bb
)->frequency
= frequency
/ cyclic_probability
;
2612 bitmap_clear_bit (tovisit
, bb
->index
);
2614 e
= find_edge (bb
, head
);
2617 /* EDGE_INFO (e)->back_edge_prob
2618 = ((e->probability * BLOCK_INFO (bb)->frequency)
2619 / REG_BR_PROB_BASE); */
2621 sreal tmp
= e
->probability
;
2622 tmp
*= BLOCK_INFO (bb
)->frequency
;
2623 EDGE_INFO (e
)->back_edge_prob
= tmp
* real_inv_br_prob_base
;
2626 /* Propagate to successor blocks. */
2627 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2628 if (!(e
->flags
& EDGE_DFS_BACK
)
2629 && BLOCK_INFO (e
->dest
)->npredecessors
)
2631 BLOCK_INFO (e
->dest
)->npredecessors
--;
2632 if (!BLOCK_INFO (e
->dest
)->npredecessors
)
2637 BLOCK_INFO (last
)->next
= e
->dest
;
2645 /* Estimate frequencies in loops at same nest level. */
2648 estimate_loops_at_level (struct loop
*first_loop
)
2652 for (loop
= first_loop
; loop
; loop
= loop
->next
)
2657 bitmap tovisit
= BITMAP_ALLOC (NULL
);
2659 estimate_loops_at_level (loop
->inner
);
2661 /* Find current loop back edge and mark it. */
2662 e
= loop_latch_edge (loop
);
2663 EDGE_INFO (e
)->back_edge
= 1;
2665 bbs
= get_loop_body (loop
);
2666 for (i
= 0; i
< loop
->num_nodes
; i
++)
2667 bitmap_set_bit (tovisit
, bbs
[i
]->index
);
2669 propagate_freq (loop
->header
, tovisit
);
2670 BITMAP_FREE (tovisit
);
2674 /* Propagates frequencies through structure of loops. */
2677 estimate_loops (void)
2679 bitmap tovisit
= BITMAP_ALLOC (NULL
);
2682 /* Start by estimating the frequencies in the loops. */
2683 if (number_of_loops (cfun
) > 1)
2684 estimate_loops_at_level (current_loops
->tree_root
->inner
);
2686 /* Now propagate the frequencies through all the blocks. */
2687 FOR_ALL_BB_FN (bb
, cfun
)
2689 bitmap_set_bit (tovisit
, bb
->index
);
2691 propagate_freq (ENTRY_BLOCK_PTR_FOR_FN (cfun
), tovisit
);
2692 BITMAP_FREE (tovisit
);
2695 /* Drop the profile for NODE to guessed, and update its frequency based on
2696 whether it is expected to be hot given the CALL_COUNT. */
2699 drop_profile (struct cgraph_node
*node
, gcov_type call_count
)
2701 struct function
*fn
= DECL_STRUCT_FUNCTION (node
->decl
);
2702 /* In the case where this was called by another function with a
2703 dropped profile, call_count will be 0. Since there are no
2704 non-zero call counts to this function, we don't know for sure
2705 whether it is hot, and therefore it will be marked normal below. */
2706 bool hot
= maybe_hot_count_p (NULL
, call_count
);
2710 "Dropping 0 profile for %s/%i. %s based on calls.\n",
2711 node
->name (), node
->order
,
2712 hot
? "Function is hot" : "Function is normal");
2713 /* We only expect to miss profiles for functions that are reached
2714 via non-zero call edges in cases where the function may have
2715 been linked from another module or library (COMDATs and extern
2716 templates). See the comments below for handle_missing_profiles.
2717 Also, only warn in cases where the missing counts exceed the
2718 number of training runs. In certain cases with an execv followed
2719 by a no-return call the profile for the no-return call is not
2720 dumped and there can be a mismatch. */
2721 if (!DECL_COMDAT (node
->decl
) && !DECL_EXTERNAL (node
->decl
)
2722 && call_count
> profile_info
->runs
)
2724 if (flag_profile_correction
)
2728 "Missing counts for called function %s/%i\n",
2729 node
->name (), node
->order
);
2732 warning (0, "Missing counts for called function %s/%i",
2733 node
->name (), node
->order
);
2736 profile_status_for_fn (fn
)
2737 = (flag_guess_branch_prob
? PROFILE_GUESSED
: PROFILE_ABSENT
);
2739 = hot
? NODE_FREQUENCY_HOT
: NODE_FREQUENCY_NORMAL
;
2742 /* In the case of COMDAT routines, multiple object files will contain the same
2743 function and the linker will select one for the binary. In that case
2744 all the other copies from the profile instrument binary will be missing
2745 profile counts. Look for cases where this happened, due to non-zero
2746 call counts going to 0-count functions, and drop the profile to guessed
2747 so that we can use the estimated probabilities and avoid optimizing only
2750 The other case where the profile may be missing is when the routine
2751 is not going to be emitted to the object file, e.g. for "extern template"
2752 class methods. Those will be marked DECL_EXTERNAL. Emit a warning in
2753 all other cases of non-zero calls to 0-count functions. */
2756 handle_missing_profiles (void)
2758 struct cgraph_node
*node
;
2759 int unlikely_count_fraction
= PARAM_VALUE (UNLIKELY_BB_COUNT_FRACTION
);
2760 vec
<struct cgraph_node
*> worklist
;
2761 worklist
.create (64);
2763 /* See if 0 count function has non-0 count callers. In this case we
2764 lost some profile. Drop its function profile to PROFILE_GUESSED. */
2765 FOR_EACH_DEFINED_FUNCTION (node
)
2767 struct cgraph_edge
*e
;
2768 gcov_type call_count
= 0;
2769 gcov_type max_tp_first_run
= 0;
2770 struct function
*fn
= DECL_STRUCT_FUNCTION (node
->decl
);
2774 for (e
= node
->callers
; e
; e
= e
->next_caller
)
2776 call_count
+= e
->count
;
2778 if (e
->caller
->tp_first_run
> max_tp_first_run
)
2779 max_tp_first_run
= e
->caller
->tp_first_run
;
2782 /* If time profile is missing, let assign the maximum that comes from
2783 caller functions. */
2784 if (!node
->tp_first_run
&& max_tp_first_run
)
2785 node
->tp_first_run
= max_tp_first_run
+ 1;
2789 && (call_count
* unlikely_count_fraction
>= profile_info
->runs
))
2791 drop_profile (node
, call_count
);
2792 worklist
.safe_push (node
);
2796 /* Propagate the profile dropping to other 0-count COMDATs that are
2797 potentially called by COMDATs we already dropped the profile on. */
2798 while (worklist
.length () > 0)
2800 struct cgraph_edge
*e
;
2802 node
= worklist
.pop ();
2803 for (e
= node
->callees
; e
; e
= e
->next_caller
)
2805 struct cgraph_node
*callee
= e
->callee
;
2806 struct function
*fn
= DECL_STRUCT_FUNCTION (callee
->decl
);
2808 if (callee
->count
> 0)
2810 if (DECL_COMDAT (callee
->decl
) && fn
&& fn
->cfg
2811 && profile_status_for_fn (fn
) == PROFILE_READ
)
2813 drop_profile (node
, 0);
2814 worklist
.safe_push (callee
);
2818 worklist
.release ();
2821 /* Convert counts measured by profile driven feedback to frequencies.
2822 Return nonzero iff there was any nonzero execution count. */
2825 counts_to_freqs (void)
2827 gcov_type count_max
, true_count_max
= 0;
2830 /* Don't overwrite the estimated frequencies when the profile for
2831 the function is missing. We may drop this function PROFILE_GUESSED
2832 later in drop_profile (). */
2833 if (!flag_auto_profile
&& !ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
)
2836 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
2837 true_count_max
= MAX (bb
->count
, true_count_max
);
2839 count_max
= MAX (true_count_max
, 1);
2840 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
2841 bb
->frequency
= (bb
->count
* BB_FREQ_MAX
+ count_max
/ 2) / count_max
;
2843 return true_count_max
;
2846 /* Return true if function is likely to be expensive, so there is no point to
2847 optimize performance of prologue, epilogue or do inlining at the expense
2848 of code size growth. THRESHOLD is the limit of number of instructions
2849 function can execute at average to be still considered not expensive. */
2852 expensive_function_p (int threshold
)
2854 unsigned int sum
= 0;
2858 /* We can not compute accurately for large thresholds due to scaled
2860 gcc_assert (threshold
<= BB_FREQ_MAX
);
2862 /* Frequencies are out of range. This either means that function contains
2863 internal loop executing more than BB_FREQ_MAX times or profile feedback
2864 is available and function has not been executed at all. */
2865 if (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->frequency
== 0)
2868 /* Maximally BB_FREQ_MAX^2 so overflow won't happen. */
2869 limit
= ENTRY_BLOCK_PTR_FOR_FN (cfun
)->frequency
* threshold
;
2870 FOR_EACH_BB_FN (bb
, cfun
)
2874 FOR_BB_INSNS (bb
, insn
)
2875 if (active_insn_p (insn
))
2877 sum
+= bb
->frequency
;
2886 /* Estimate and propagate basic block frequencies using the given branch
2887 probabilities. If FORCE is true, the frequencies are used to estimate
2888 the counts even when there are already non-zero profile counts. */
2891 estimate_bb_frequencies (bool force
)
2896 if (force
|| profile_status_for_fn (cfun
) != PROFILE_READ
|| !counts_to_freqs ())
2898 static int real_values_initialized
= 0;
2900 if (!real_values_initialized
)
2902 real_values_initialized
= 1;
2903 real_br_prob_base
= REG_BR_PROB_BASE
;
2904 real_bb_freq_max
= BB_FREQ_MAX
;
2905 real_one_half
= sreal (1, -1);
2906 real_inv_br_prob_base
= sreal (1) / real_br_prob_base
;
2907 real_almost_one
= sreal (1) - real_inv_br_prob_base
;
2910 mark_dfs_back_edges ();
2912 single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun
))->probability
=
2915 /* Set up block info for each basic block. */
2916 alloc_aux_for_blocks (sizeof (block_info
));
2917 alloc_aux_for_edges (sizeof (edge_prob_info
));
2918 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
2923 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2925 EDGE_INFO (e
)->back_edge_prob
= e
->probability
;
2926 EDGE_INFO (e
)->back_edge_prob
*= real_inv_br_prob_base
;
2930 /* First compute frequencies locally for each loop from innermost
2931 to outermost to examine frequencies for back edges. */
2935 FOR_EACH_BB_FN (bb
, cfun
)
2936 if (freq_max
< BLOCK_INFO (bb
)->frequency
)
2937 freq_max
= BLOCK_INFO (bb
)->frequency
;
2939 freq_max
= real_bb_freq_max
/ freq_max
;
2940 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
2942 sreal tmp
= BLOCK_INFO (bb
)->frequency
* freq_max
+ real_one_half
;
2943 bb
->frequency
= tmp
.to_int ();
2946 free_aux_for_blocks ();
2947 free_aux_for_edges ();
2949 compute_function_frequency ();
2952 /* Decide whether function is hot, cold or unlikely executed. */
2954 compute_function_frequency (void)
2957 struct cgraph_node
*node
= cgraph_node::get (current_function_decl
);
2959 if (DECL_STATIC_CONSTRUCTOR (current_function_decl
)
2960 || MAIN_NAME_P (DECL_NAME (current_function_decl
)))
2961 node
->only_called_at_startup
= true;
2962 if (DECL_STATIC_DESTRUCTOR (current_function_decl
))
2963 node
->only_called_at_exit
= true;
2965 if (profile_status_for_fn (cfun
) != PROFILE_READ
)
2967 int flags
= flags_from_decl_or_type (current_function_decl
);
2968 if (lookup_attribute ("cold", DECL_ATTRIBUTES (current_function_decl
))
2970 node
->frequency
= NODE_FREQUENCY_UNLIKELY_EXECUTED
;
2971 else if (lookup_attribute ("hot", DECL_ATTRIBUTES (current_function_decl
))
2973 node
->frequency
= NODE_FREQUENCY_HOT
;
2974 else if (flags
& ECF_NORETURN
)
2975 node
->frequency
= NODE_FREQUENCY_EXECUTED_ONCE
;
2976 else if (MAIN_NAME_P (DECL_NAME (current_function_decl
)))
2977 node
->frequency
= NODE_FREQUENCY_EXECUTED_ONCE
;
2978 else if (DECL_STATIC_CONSTRUCTOR (current_function_decl
)
2979 || DECL_STATIC_DESTRUCTOR (current_function_decl
))
2980 node
->frequency
= NODE_FREQUENCY_EXECUTED_ONCE
;
2984 /* Only first time try to drop function into unlikely executed.
2985 After inlining the roundoff errors may confuse us.
2986 Ipa-profile pass will drop functions only called from unlikely
2987 functions to unlikely and that is most of what we care about. */
2988 if (!cfun
->after_inlining
)
2989 node
->frequency
= NODE_FREQUENCY_UNLIKELY_EXECUTED
;
2990 FOR_EACH_BB_FN (bb
, cfun
)
2992 if (maybe_hot_bb_p (cfun
, bb
))
2994 node
->frequency
= NODE_FREQUENCY_HOT
;
2997 if (!probably_never_executed_bb_p (cfun
, bb
))
2998 node
->frequency
= NODE_FREQUENCY_NORMAL
;
3002 /* Build PREDICT_EXPR. */
3004 build_predict_expr (enum br_predictor predictor
, enum prediction taken
)
3006 tree t
= build1 (PREDICT_EXPR
, void_type_node
,
3007 build_int_cst (integer_type_node
, predictor
));
3008 SET_PREDICT_EXPR_OUTCOME (t
, taken
);
3013 predictor_name (enum br_predictor predictor
)
3015 return predictor_info
[predictor
].name
;
3018 /* Predict branch probabilities and estimate profile of the tree CFG. */
3022 const pass_data pass_data_profile
=
3024 GIMPLE_PASS
, /* type */
3025 "profile_estimate", /* name */
3026 OPTGROUP_NONE
, /* optinfo_flags */
3027 TV_BRANCH_PROB
, /* tv_id */
3028 PROP_cfg
, /* properties_required */
3029 0, /* properties_provided */
3030 0, /* properties_destroyed */
3031 0, /* todo_flags_start */
3032 0, /* todo_flags_finish */
3035 class pass_profile
: public gimple_opt_pass
3038 pass_profile (gcc::context
*ctxt
)
3039 : gimple_opt_pass (pass_data_profile
, ctxt
)
3042 /* opt_pass methods: */
3043 virtual bool gate (function
*) { return flag_guess_branch_prob
; }
3044 virtual unsigned int execute (function
*);
3046 }; // class pass_profile
3049 pass_profile::execute (function
*fun
)
3053 if (profile_status_for_fn (cfun
) == PROFILE_GUESSED
)
3056 loop_optimizer_init (LOOPS_NORMAL
);
3057 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3058 flow_loops_dump (dump_file
, NULL
, 0);
3060 mark_irreducible_loops ();
3062 nb_loops
= number_of_loops (fun
);
3066 tree_estimate_probability ();
3071 loop_optimizer_finalize ();
3072 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3073 gimple_dump_cfg (dump_file
, dump_flags
);
3074 if (profile_status_for_fn (fun
) == PROFILE_ABSENT
)
3075 profile_status_for_fn (fun
) = PROFILE_GUESSED
;
3082 make_pass_profile (gcc::context
*ctxt
)
3084 return new pass_profile (ctxt
);
3089 const pass_data pass_data_strip_predict_hints
=
3091 GIMPLE_PASS
, /* type */
3092 "*strip_predict_hints", /* name */
3093 OPTGROUP_NONE
, /* optinfo_flags */
3094 TV_BRANCH_PROB
, /* tv_id */
3095 PROP_cfg
, /* properties_required */
3096 0, /* properties_provided */
3097 0, /* properties_destroyed */
3098 0, /* todo_flags_start */
3099 0, /* todo_flags_finish */
3102 class pass_strip_predict_hints
: public gimple_opt_pass
3105 pass_strip_predict_hints (gcc::context
*ctxt
)
3106 : gimple_opt_pass (pass_data_strip_predict_hints
, ctxt
)
3109 /* opt_pass methods: */
3110 opt_pass
* clone () { return new pass_strip_predict_hints (m_ctxt
); }
3111 virtual unsigned int execute (function
*);
3113 }; // class pass_strip_predict_hints
3115 /* Get rid of all builtin_expect calls and GIMPLE_PREDICT statements
3116 we no longer need. */
3118 pass_strip_predict_hints::execute (function
*fun
)
3124 FOR_EACH_BB_FN (bb
, fun
)
3126 gimple_stmt_iterator bi
;
3127 for (bi
= gsi_start_bb (bb
); !gsi_end_p (bi
);)
3129 gimple stmt
= gsi_stmt (bi
);
3131 if (gimple_code (stmt
) == GIMPLE_PREDICT
)
3133 gsi_remove (&bi
, true);
3136 else if (is_gimple_call (stmt
))
3138 tree fndecl
= gimple_call_fndecl (stmt
);
3141 && DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_NORMAL
3142 && DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_EXPECT
3143 && gimple_call_num_args (stmt
) == 2)
3144 || (gimple_call_internal_p (stmt
)
3145 && gimple_call_internal_fn (stmt
) == IFN_BUILTIN_EXPECT
))
3147 var
= gimple_call_lhs (stmt
);
3151 = gimple_build_assign (var
, gimple_call_arg (stmt
, 0));
3152 gsi_replace (&bi
, ass_stmt
, true);
3156 gsi_remove (&bi
, true);
3170 make_pass_strip_predict_hints (gcc::context
*ctxt
)
3172 return new pass_strip_predict_hints (ctxt
);
3175 /* Rebuild function frequencies. Passes are in general expected to
3176 maintain profile by hand, however in some cases this is not possible:
3177 for example when inlining several functions with loops freuqencies might run
3178 out of scale and thus needs to be recomputed. */
3181 rebuild_frequencies (void)
3183 timevar_push (TV_REBUILD_FREQUENCIES
);
3185 /* When the max bb count in the function is small, there is a higher
3186 chance that there were truncation errors in the integer scaling
3187 of counts by inlining and other optimizations. This could lead
3188 to incorrect classification of code as being cold when it isn't.
3189 In that case, force the estimation of bb counts/frequencies from the
3190 branch probabilities, rather than computing frequencies from counts,
3191 which may also lead to frequencies incorrectly reduced to 0. There
3192 is less precision in the probabilities, so we only do this for small
3194 gcov_type count_max
= 0;
3196 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
3197 count_max
= MAX (bb
->count
, count_max
);
3199 if (profile_status_for_fn (cfun
) == PROFILE_GUESSED
3200 || (!flag_auto_profile
&& profile_status_for_fn (cfun
) == PROFILE_READ
3201 && count_max
< REG_BR_PROB_BASE
/10))
3203 loop_optimizer_init (0);
3204 add_noreturn_fake_exit_edges ();
3205 mark_irreducible_loops ();
3206 connect_infinite_loops_to_exit ();
3207 estimate_bb_frequencies (true);
3208 remove_fake_exit_edges ();
3209 loop_optimizer_finalize ();
3211 else if (profile_status_for_fn (cfun
) == PROFILE_READ
)
3215 timevar_pop (TV_REBUILD_FREQUENCIES
);