1 /* Branch prediction routines for the GNU compiler.
2 Copyright (C) 2000-2025 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. */
31 #include "coretypes.h"
37 #include "tree-pass.h"
43 #include "diagnostic-core.h"
44 #include "gimple-predict.h"
45 #include "fold-const.h"
51 #include "gimple-iterator.h"
53 #include "tree-ssa-loop-niter.h"
54 #include "tree-ssa-loop.h"
55 #include "tree-scalar-evolution.h"
56 #include "ipa-utils.h"
57 #include "gimple-pretty-print.h"
60 #include "stringpool.h"
63 /* Enum with reasons why a predictor is ignored. */
69 REASON_SINGLE_EDGE_DUPLICATE
,
70 REASON_EDGE_PAIR_DUPLICATE
73 /* String messages for the aforementioned enum. */
75 static const char *reason_messages
[] = {"", " (ignored)",
76 " (single edge duplicate)", " (edge pair duplicate)"};
79 static void combine_predictions_for_insn (rtx_insn
*, basic_block
);
80 static void dump_prediction (FILE *, enum br_predictor
, int, basic_block
,
81 enum predictor_reason
, edge
);
82 static void predict_paths_leading_to (basic_block
, enum br_predictor
,
84 class loop
*in_loop
= NULL
);
85 static void predict_paths_leading_to_edge (edge
, enum br_predictor
,
87 class loop
*in_loop
= NULL
);
88 static bool can_predict_insn_p (const rtx_insn
*);
89 static HOST_WIDE_INT
get_predictor_value (br_predictor
, HOST_WIDE_INT
);
90 static void determine_unlikely_bbs ();
91 static void estimate_bb_frequencies ();
93 /* Information we hold about each branch predictor.
94 Filled using information from predict.def. */
98 const char *const name
; /* Name used in the debugging dumps. */
99 const int hitrate
; /* Expected hitrate used by
100 predict_insn_def call. */
104 /* Use given predictor without Dempster-Shaffer theory if it matches
105 using first_match heuristics. */
106 #define PRED_FLAG_FIRST_MATCH 1
108 /* Recompute hitrate in percent to our representation. */
110 #define HITRATE(VAL) ((int) ((VAL) * REG_BR_PROB_BASE + 50) / 100)
112 #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) {NAME, HITRATE, FLAGS},
113 static const struct predictor_info predictor_info
[]= {
114 #include "predict.def"
116 /* Upper bound on predictors. */
121 static gcov_type min_count
= -1;
123 /* Determine the threshold for hot BB counts. */
126 get_hot_bb_threshold ()
130 const int hot_frac
= param_hot_bb_count_fraction
;
131 const gcov_type min_hot_count
133 ? profile_info
->sum_max
/ hot_frac
134 : (gcov_type
)profile_count::max_count
;
135 set_hot_bb_threshold (min_hot_count
);
137 fprintf (dump_file
, "Setting hotness threshold to %" PRId64
".\n",
143 /* Set the threshold for hot BB counts. */
146 set_hot_bb_threshold (gcov_type min
)
151 /* Return TRUE if COUNT is considered to be hot in function FUN. */
154 maybe_hot_count_p (struct function
*fun
, profile_count count
)
156 if (!count
.initialized_p ())
158 if (count
.ipa () == profile_count::zero ())
162 struct cgraph_node
*node
= cgraph_node::get (fun
->decl
);
163 if (!profile_info
|| profile_status_for_fn (fun
) != PROFILE_READ
)
165 if (node
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
)
167 if (node
->frequency
== NODE_FREQUENCY_HOT
)
170 if (profile_status_for_fn (fun
) == PROFILE_ABSENT
)
172 if (node
->frequency
== NODE_FREQUENCY_EXECUTED_ONCE
173 && count
< (ENTRY_BLOCK_PTR_FOR_FN (fun
)->count
.apply_scale (2, 3)))
175 if (count
* param_hot_bb_frequency_fraction
176 < ENTRY_BLOCK_PTR_FOR_FN (fun
)->count
)
180 /* Code executed at most once is not hot. */
181 if (count
<= MAX (profile_info
? profile_info
->runs
: 1, 1))
183 return (count
>= get_hot_bb_threshold ());
186 /* Return true if basic block BB of function FUN can be CPU intensive
187 and should thus be optimized for maximum performance. */
190 maybe_hot_bb_p (struct function
*fun
, const_basic_block bb
)
192 gcc_checking_assert (fun
);
193 return maybe_hot_count_p (fun
, bb
->count
);
196 /* Return true if edge E can be CPU intensive and should thus be optimized
197 for maximum performance. */
200 maybe_hot_edge_p (edge e
)
202 return maybe_hot_count_p (cfun
, e
->count ());
205 /* Return true if COUNT is considered to be never executed in function FUN
206 or if function FUN is considered so in the static profile. */
209 probably_never_executed (struct function
*fun
, profile_count count
)
211 gcc_checking_assert (fun
);
212 if (count
.ipa () == profile_count::zero ())
214 /* Do not trust adjusted counts. This will make us to drop int cold section
215 code with low execution count as a result of inlining. These low counts
216 are not safe even with read profile and may lead us to dropping
217 code which actually gets executed into cold section of binary that is not
219 if (count
.precise_p () && profile_status_for_fn (fun
) == PROFILE_READ
)
221 const int unlikely_frac
= param_unlikely_bb_count_fraction
;
222 if (count
* unlikely_frac
>= profile_info
->runs
)
226 if ((!profile_info
|| profile_status_for_fn (fun
) != PROFILE_READ
)
227 && (cgraph_node::get (fun
->decl
)->frequency
228 == NODE_FREQUENCY_UNLIKELY_EXECUTED
))
233 /* Return true if basic block BB of function FUN is probably never executed. */
236 probably_never_executed_bb_p (struct function
*fun
, const_basic_block bb
)
238 return probably_never_executed (fun
, bb
->count
);
241 /* Return true if edge E is unlikely executed for obvious reasons. */
244 unlikely_executed_edge_p (edge e
)
246 return (e
->src
->count
== profile_count::zero ()
247 || e
->probability
== profile_probability::never ())
248 || (e
->flags
& (EDGE_EH
| EDGE_FAKE
));
251 /* Return true if edge E of function FUN is probably never executed. */
254 probably_never_executed_edge_p (struct function
*fun
, edge e
)
256 if (unlikely_executed_edge_p (e
))
258 return probably_never_executed (fun
, e
->count ());
261 /* Return true if function FUN should always be optimized for size. */
264 optimize_function_for_size_p (struct function
*fun
)
266 if (!fun
|| !fun
->decl
)
267 return optimize_size
? OPTIMIZE_SIZE_MAX
: OPTIMIZE_SIZE_NO
;
268 cgraph_node
*n
= cgraph_node::get (fun
->decl
);
270 return n
->optimize_for_size_p ();
271 return OPTIMIZE_SIZE_NO
;
274 /* Return true if function FUN should always be optimized for speed. */
277 optimize_function_for_speed_p (struct function
*fun
)
279 return !optimize_function_for_size_p (fun
);
282 /* Return the optimization type that should be used for function FUN. */
285 function_optimization_type (struct function
*fun
)
287 return (optimize_function_for_speed_p (fun
)
289 : OPTIMIZE_FOR_SIZE
);
292 /* Return TRUE if basic block BB should be optimized for size. */
295 optimize_bb_for_size_p (const_basic_block bb
)
297 enum optimize_size_level ret
= optimize_function_for_size_p (cfun
);
299 if (bb
&& ret
< OPTIMIZE_SIZE_MAX
&& bb
->count
== profile_count::zero ())
300 ret
= OPTIMIZE_SIZE_MAX
;
301 if (bb
&& ret
< OPTIMIZE_SIZE_BALANCED
&& !maybe_hot_bb_p (cfun
, bb
))
302 ret
= OPTIMIZE_SIZE_BALANCED
;
306 /* Return TRUE if basic block BB should be optimized for speed. */
309 optimize_bb_for_speed_p (const_basic_block bb
)
311 return !optimize_bb_for_size_p (bb
);
314 /* Return the optimization type that should be used for basic block BB. */
317 bb_optimization_type (const_basic_block bb
)
319 return (optimize_bb_for_speed_p (bb
)
321 : OPTIMIZE_FOR_SIZE
);
324 /* Return TRUE if edge E should be optimized for size. */
327 optimize_edge_for_size_p (edge e
)
329 enum optimize_size_level ret
= optimize_function_for_size_p (cfun
);
331 if (ret
< OPTIMIZE_SIZE_MAX
&& unlikely_executed_edge_p (e
))
332 ret
= OPTIMIZE_SIZE_MAX
;
333 if (ret
< OPTIMIZE_SIZE_BALANCED
&& !maybe_hot_edge_p (e
))
334 ret
= OPTIMIZE_SIZE_BALANCED
;
338 /* Return TRUE if edge E should be optimized for speed. */
341 optimize_edge_for_speed_p (edge e
)
343 return !optimize_edge_for_size_p (e
);
346 /* Return TRUE if the current function is optimized for size. */
349 optimize_insn_for_size_p (void)
351 enum optimize_size_level ret
= optimize_function_for_size_p (cfun
);
352 if (ret
< OPTIMIZE_SIZE_BALANCED
&& !crtl
->maybe_hot_insn_p
)
353 ret
= OPTIMIZE_SIZE_BALANCED
;
357 /* Return TRUE if the current function is optimized for speed. */
360 optimize_insn_for_speed_p (void)
362 return !optimize_insn_for_size_p ();
365 /* Return the optimization type that should be used for the current
369 insn_optimization_type ()
371 return (optimize_insn_for_speed_p ()
373 : OPTIMIZE_FOR_SIZE
);
376 /* Return TRUE if LOOP should be optimized for size. */
379 optimize_loop_for_size_p (class loop
*loop
)
381 return optimize_bb_for_size_p (loop
->header
);
384 /* Return TRUE if LOOP should be optimized for speed. */
387 optimize_loop_for_speed_p (class loop
*loop
)
389 return optimize_bb_for_speed_p (loop
->header
);
392 /* Return TRUE if nest rooted at LOOP should be optimized for speed. */
395 optimize_loop_nest_for_speed_p (class loop
*loop
)
397 class loop
*l
= loop
;
398 if (optimize_loop_for_speed_p (loop
))
401 while (l
&& l
!= loop
)
403 if (optimize_loop_for_speed_p (l
))
411 while (l
!= loop
&& !l
->next
)
420 /* Return TRUE if nest rooted at LOOP should be optimized for size. */
423 optimize_loop_nest_for_size_p (class loop
*loop
)
425 enum optimize_size_level ret
= optimize_loop_for_size_p (loop
);
426 class loop
*l
= loop
;
429 while (l
&& l
!= loop
)
431 if (ret
== OPTIMIZE_SIZE_NO
)
433 ret
= MIN (optimize_loop_for_size_p (l
), ret
);
440 while (l
!= loop
&& !l
->next
)
449 /* Return true if edge E is likely to be well predictable by branch
453 predictable_edge_p (edge e
)
455 if (!e
->probability
.initialized_p ())
457 if ((e
->probability
.to_reg_br_prob_base ()
458 <= param_predictable_branch_outcome
* REG_BR_PROB_BASE
/ 100)
459 || (REG_BR_PROB_BASE
- e
->probability
.to_reg_br_prob_base ()
460 <= param_predictable_branch_outcome
* REG_BR_PROB_BASE
/ 100))
466 /* Set RTL expansion for BB profile. */
469 rtl_profile_for_bb (basic_block bb
)
471 crtl
->maybe_hot_insn_p
= maybe_hot_bb_p (cfun
, bb
);
474 /* Set RTL expansion for edge profile. */
477 rtl_profile_for_edge (edge e
)
479 crtl
->maybe_hot_insn_p
= maybe_hot_edge_p (e
);
482 /* Set RTL expansion to default mode (i.e. when profile info is not known). */
484 default_rtl_profile (void)
486 crtl
->maybe_hot_insn_p
= true;
489 /* Return true if the one of outgoing edges is already predicted by
493 rtl_predicted_by_p (const_basic_block bb
, enum br_predictor predictor
)
496 if (!INSN_P (BB_END (bb
)))
498 for (note
= REG_NOTES (BB_END (bb
)); note
; note
= XEXP (note
, 1))
499 if (REG_NOTE_KIND (note
) == REG_BR_PRED
500 && INTVAL (XEXP (XEXP (note
, 0), 0)) == (int)predictor
)
505 /* Structure representing predictions in tree level. */
507 struct edge_prediction
{
508 struct edge_prediction
*ep_next
;
510 enum br_predictor ep_predictor
;
514 /* This map contains for a basic block the list of predictions for the
517 static hash_map
<const_basic_block
, edge_prediction
*> *bb_predictions
;
519 /* Global cache for expr_expected_value. */
521 struct expected_value
524 enum br_predictor predictor
;
525 HOST_WIDE_INT probability
;
527 static hash_map
<int_hash
<unsigned, 0>, expected_value
> *ssa_expected_value
;
529 /* Return true if the one of outgoing edges is already predicted by
533 gimple_predicted_by_p (const_basic_block bb
, enum br_predictor predictor
)
535 struct edge_prediction
*i
;
536 edge_prediction
**preds
= bb_predictions
->get (bb
);
541 for (i
= *preds
; i
; i
= i
->ep_next
)
542 if (i
->ep_predictor
== predictor
)
547 /* Return true if the one of outgoing edges is already predicted by
548 PREDICTOR for edge E predicted as TAKEN. */
551 edge_predicted_by_p (edge e
, enum br_predictor predictor
, bool taken
)
553 struct edge_prediction
*i
;
554 basic_block bb
= e
->src
;
555 edge_prediction
**preds
= bb_predictions
->get (bb
);
559 int probability
= predictor_info
[(int) predictor
].hitrate
;
562 probability
= REG_BR_PROB_BASE
- probability
;
564 for (i
= *preds
; i
; i
= i
->ep_next
)
565 if (i
->ep_predictor
== predictor
567 && i
->ep_probability
== probability
)
572 /* Same predicate as above, working on edges. */
574 edge_probability_reliable_p (const_edge e
)
576 return e
->probability
.probably_reliable_p ();
579 /* Same predicate as edge_probability_reliable_p, working on notes. */
581 br_prob_note_reliable_p (const_rtx note
)
583 gcc_assert (REG_NOTE_KIND (note
) == REG_BR_PROB
);
584 return profile_probability::from_reg_br_prob_note
585 (XINT (note
, 0)).probably_reliable_p ();
589 predict_insn (rtx_insn
*insn
, enum br_predictor predictor
, int probability
)
591 gcc_assert (any_condjump_p (insn
));
592 if (!flag_guess_branch_prob
)
595 add_reg_note (insn
, REG_BR_PRED
,
596 gen_rtx_CONCAT (VOIDmode
,
597 GEN_INT ((int) predictor
),
598 GEN_INT ((int) probability
)));
601 /* Predict insn by given predictor. */
604 predict_insn_def (rtx_insn
*insn
, enum br_predictor predictor
,
605 enum prediction taken
)
607 int probability
= predictor_info
[(int) predictor
].hitrate
;
608 gcc_assert (probability
!= PROB_UNINITIALIZED
);
611 probability
= REG_BR_PROB_BASE
- probability
;
613 predict_insn (insn
, predictor
, probability
);
616 /* Predict edge E with given probability if possible. */
619 rtl_predict_edge (edge e
, enum br_predictor predictor
, int probability
)
622 last_insn
= BB_END (e
->src
);
624 /* We can store the branch prediction information only about
625 conditional jumps. */
626 if (!any_condjump_p (last_insn
))
629 /* We always store probability of branching. */
630 if (e
->flags
& EDGE_FALLTHRU
)
631 probability
= REG_BR_PROB_BASE
- probability
;
633 predict_insn (last_insn
, predictor
, probability
);
636 /* Predict edge E with the given PROBABILITY. */
638 gimple_predict_edge (edge e
, enum br_predictor predictor
, int probability
)
640 if (e
->src
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
)
641 && EDGE_COUNT (e
->src
->succs
) > 1
642 && flag_guess_branch_prob
645 struct edge_prediction
*i
= XNEW (struct edge_prediction
);
646 edge_prediction
*&preds
= bb_predictions
->get_or_insert (e
->src
);
650 i
->ep_probability
= probability
;
651 i
->ep_predictor
= predictor
;
656 /* Filter edge predictions PREDS by a function FILTER: if FILTER return false
657 the prediction is removed.
658 DATA are passed to the filter function. */
661 filter_predictions (edge_prediction
**preds
,
662 bool (*filter
) (edge_prediction
*, void *), void *data
)
669 struct edge_prediction
**prediction
= preds
;
670 struct edge_prediction
*next
;
674 if ((*filter
) (*prediction
, data
))
675 prediction
= &((*prediction
)->ep_next
);
678 next
= (*prediction
)->ep_next
;
686 /* Filter function predicate that returns true for a edge predicate P
687 if its edge is equal to DATA. */
690 not_equal_edge_p (edge_prediction
*p
, void *data
)
692 return p
->ep_edge
!= (edge
)data
;
695 /* Remove all predictions on given basic block that are attached
698 remove_predictions_associated_with_edge (edge e
)
703 edge_prediction
**preds
= bb_predictions
->get (e
->src
);
704 filter_predictions (preds
, not_equal_edge_p
, e
);
707 /* Clears the list of predictions stored for BB. */
710 clear_bb_predictions (basic_block bb
)
712 edge_prediction
**preds
= bb_predictions
->get (bb
);
713 struct edge_prediction
*pred
, *next
;
718 for (pred
= *preds
; pred
; pred
= next
)
720 next
= pred
->ep_next
;
726 /* Return true when we can store prediction on insn INSN.
727 At the moment we represent predictions only on conditional
728 jumps, not at computed jump or other complicated cases. */
730 can_predict_insn_p (const rtx_insn
*insn
)
732 return (JUMP_P (insn
)
733 && any_condjump_p (insn
)
734 && EDGE_COUNT (BLOCK_FOR_INSN (insn
)->succs
) >= 2);
737 /* Predict edge E by given predictor if possible. */
740 predict_edge_def (edge e
, enum br_predictor predictor
,
741 enum prediction taken
)
743 int probability
= predictor_info
[(int) predictor
].hitrate
;
746 probability
= REG_BR_PROB_BASE
- probability
;
748 predict_edge (e
, predictor
, probability
);
751 /* Invert all branch predictions or probability notes in the INSN. This needs
752 to be done each time we invert the condition used by the jump. */
755 invert_br_probabilities (rtx insn
)
759 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
760 if (REG_NOTE_KIND (note
) == REG_BR_PROB
)
761 XINT (note
, 0) = profile_probability::from_reg_br_prob_note
762 (XINT (note
, 0)).invert ().to_reg_br_prob_note ();
763 else if (REG_NOTE_KIND (note
) == REG_BR_PRED
)
764 XEXP (XEXP (note
, 0), 1)
765 = GEN_INT (REG_BR_PROB_BASE
- INTVAL (XEXP (XEXP (note
, 0), 1)));
768 /* Dump information about the branch prediction to the output file. */
771 dump_prediction (FILE *file
, enum br_predictor predictor
, int probability
,
772 basic_block bb
, enum predictor_reason reason
= REASON_NONE
,
782 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
783 if (! (e
->flags
& EDGE_FALLTHRU
))
786 char edge_info_str
[128];
788 sprintf (edge_info_str
, " of edge %d->%d", ep_edge
->src
->index
,
789 ep_edge
->dest
->index
);
791 edge_info_str
[0] = '\0';
793 fprintf (file
, " %s heuristics%s%s: %.2f%%",
794 predictor_info
[predictor
].name
,
795 edge_info_str
, reason_messages
[reason
],
796 probability
* 100.0 / REG_BR_PROB_BASE
);
798 if (bb
->count
.initialized_p ())
800 fprintf (file
, " exec ");
801 bb
->count
.dump (file
);
802 if (e
&& e
->count ().initialized_p () && bb
->count
.to_gcov_type ())
804 fprintf (file
, " hit ");
805 e
->count ().dump (file
);
806 fprintf (file
, " (%.1f%%)", e
->count ().to_gcov_type() * 100.0
807 / bb
->count
.to_gcov_type ());
811 fprintf (file
, "\n");
813 /* Print output that be easily read by analyze_brprob.py script. We are
814 interested only in counts that are read from GCDA files. */
815 if (dump_file
&& (dump_flags
& TDF_DETAILS
)
816 && bb
->count
.precise_p ()
817 && reason
== REASON_NONE
)
819 fprintf (file
, ";;heuristics;%s;%" PRId64
";%" PRId64
";%.1f;\n",
820 predictor_info
[predictor
].name
,
821 bb
->count
.to_gcov_type (), e
->count ().to_gcov_type (),
822 probability
* 100.0 / REG_BR_PROB_BASE
);
826 /* Return true if STMT is known to be unlikely executed. */
829 unlikely_executed_stmt_p (gimple
*stmt
)
831 if (!is_gimple_call (stmt
))
833 /* NORETURN attribute alone is not strong enough: exit() may be quite
834 likely executed once during program run. */
835 if (gimple_call_fntype (stmt
)
836 && lookup_attribute ("cold",
837 TYPE_ATTRIBUTES (gimple_call_fntype (stmt
)))
838 && !lookup_attribute ("cold", DECL_ATTRIBUTES (current_function_decl
)))
840 tree decl
= gimple_call_fndecl (stmt
);
843 if (lookup_attribute ("cold", DECL_ATTRIBUTES (decl
))
844 && !lookup_attribute ("cold", DECL_ATTRIBUTES (current_function_decl
)))
847 cgraph_node
*n
= cgraph_node::get (decl
);
852 n
= n
->ultimate_alias_target (&avail
);
853 if (avail
< AVAIL_AVAILABLE
)
856 || n
->decl
== current_function_decl
)
858 return n
->frequency
== NODE_FREQUENCY_UNLIKELY_EXECUTED
;
861 /* Return true if BB is unlikely executed. */
864 unlikely_executed_bb_p (basic_block bb
)
866 if (bb
->count
== profile_count::zero ())
868 if (bb
== ENTRY_BLOCK_PTR_FOR_FN (cfun
) || bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
870 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
);
871 !gsi_end_p (gsi
); gsi_next (&gsi
))
873 if (unlikely_executed_stmt_p (gsi_stmt (gsi
)))
875 if (stmt_can_terminate_bb_p (gsi_stmt (gsi
)))
881 /* We cannot predict the probabilities of outgoing edges of bb. Set them
882 evenly and hope for the best. If UNLIKELY_EDGES is not null, distribute
883 even probability for all edges not mentioned in the set. These edges
884 are given PROB_VERY_UNLIKELY probability. Similarly for LIKELY_EDGES,
885 if we have exactly one likely edge, make the other edges predicted
889 set_even_probabilities (basic_block bb
,
890 hash_set
<edge
> *unlikely_edges
= NULL
,
891 hash_set
<edge_prediction
*> *likely_edges
= NULL
)
893 unsigned nedges
= 0, unlikely_count
= 0;
896 profile_probability all
= profile_probability::always ();
898 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
899 if (e
->probability
.initialized_p ())
900 all
-= e
->probability
;
901 else if (!unlikely_executed_edge_p (e
))
904 if (unlikely_edges
!= NULL
&& unlikely_edges
->contains (e
))
906 all
-= profile_probability::very_unlikely ();
911 /* Make the distribution even if all edges are unlikely. */
912 unsigned likely_count
= likely_edges
? likely_edges
->elements () : 0;
913 if (unlikely_count
== nedges
)
915 unlikely_edges
= NULL
;
919 /* If we have one likely edge, then use its probability and distribute
920 remaining probabilities as even. */
921 if (likely_count
== 1)
923 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
924 if (e
->probability
.initialized_p ())
926 else if (!unlikely_executed_edge_p (e
))
928 edge_prediction
*prediction
= *likely_edges
->begin ();
929 int p
= prediction
->ep_probability
;
930 profile_probability prob
931 = profile_probability::from_reg_br_prob_base (p
);
933 if (prediction
->ep_edge
== e
)
934 e
->probability
= prob
;
935 else if (unlikely_edges
!= NULL
&& unlikely_edges
->contains (e
))
936 e
->probability
= profile_probability::very_unlikely ();
939 profile_probability remainder
= prob
.invert ();
940 remainder
-= (profile_probability::very_unlikely ()
942 int count
= nedges
- unlikely_count
- 1;
943 gcc_assert (count
>= 0);
945 e
->probability
= remainder
/ count
;
949 e
->probability
= profile_probability::never ();
953 /* Make all unlikely edges unlikely and the rest will have even
955 unsigned scale
= nedges
- unlikely_count
;
956 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
957 if (e
->probability
.initialized_p ())
959 else if (!unlikely_executed_edge_p (e
))
961 if (unlikely_edges
!= NULL
&& unlikely_edges
->contains (e
))
962 e
->probability
= profile_probability::very_unlikely ();
964 e
->probability
= all
/ scale
;
967 e
->probability
= profile_probability::never ();
971 /* Add REG_BR_PROB note to JUMP with PROB. */
974 add_reg_br_prob_note (rtx_insn
*jump
, profile_probability prob
)
976 gcc_checking_assert (JUMP_P (jump
) && !find_reg_note (jump
, REG_BR_PROB
, 0));
977 add_int_reg_note (jump
, REG_BR_PROB
, prob
.to_reg_br_prob_note ());
980 /* Combine all REG_BR_PRED notes into single probability and attach REG_BR_PROB
981 note if not already present. Remove now useless REG_BR_PRED notes. */
984 combine_predictions_for_insn (rtx_insn
*insn
, basic_block bb
)
989 int best_probability
= PROB_EVEN
;
990 enum br_predictor best_predictor
= END_PREDICTORS
;
991 int combined_probability
= REG_BR_PROB_BASE
/ 2;
993 bool first_match
= false;
996 if (!can_predict_insn_p (insn
))
998 set_even_probabilities (bb
);
1002 prob_note
= find_reg_note (insn
, REG_BR_PROB
, 0);
1003 pnote
= ®_NOTES (insn
);
1005 fprintf (dump_file
, "Predictions for insn %i bb %i\n", INSN_UID (insn
),
1008 /* We implement "first match" heuristics and use probability guessed
1009 by predictor with smallest index. */
1010 for (note
= REG_NOTES (insn
); note
; note
= XEXP (note
, 1))
1011 if (REG_NOTE_KIND (note
) == REG_BR_PRED
)
1013 enum br_predictor predictor
= ((enum br_predictor
)
1014 INTVAL (XEXP (XEXP (note
, 0), 0)));
1015 int probability
= INTVAL (XEXP (XEXP (note
, 0), 1));
1018 if (best_predictor
> predictor
1019 && predictor_info
[predictor
].flags
& PRED_FLAG_FIRST_MATCH
)
1020 best_probability
= probability
, best_predictor
= predictor
;
1022 d
= (combined_probability
* probability
1023 + (REG_BR_PROB_BASE
- combined_probability
)
1024 * (REG_BR_PROB_BASE
- probability
));
1026 /* Use FP math to avoid overflows of 32bit integers. */
1028 /* If one probability is 0% and one 100%, avoid division by zero. */
1029 combined_probability
= REG_BR_PROB_BASE
/ 2;
1031 combined_probability
= (((double) combined_probability
) * probability
1032 * REG_BR_PROB_BASE
/ d
+ 0.5);
1035 /* Decide which heuristic to use. In case we didn't match anything,
1036 use no_prediction heuristic, in case we did match, use either
1037 first match or Dempster-Shaffer theory depending on the flags. */
1039 if (best_predictor
!= END_PREDICTORS
)
1043 dump_prediction (dump_file
, PRED_NO_PREDICTION
,
1044 combined_probability
, bb
);
1048 dump_prediction (dump_file
, PRED_DS_THEORY
, combined_probability
,
1049 bb
, !first_match
? REASON_NONE
: REASON_IGNORED
);
1051 dump_prediction (dump_file
, PRED_FIRST_MATCH
, best_probability
,
1052 bb
, first_match
? REASON_NONE
: REASON_IGNORED
);
1056 combined_probability
= best_probability
;
1057 dump_prediction (dump_file
, PRED_COMBINED
, combined_probability
, bb
);
1061 if (REG_NOTE_KIND (*pnote
) == REG_BR_PRED
)
1063 enum br_predictor predictor
= ((enum br_predictor
)
1064 INTVAL (XEXP (XEXP (*pnote
, 0), 0)));
1065 int probability
= INTVAL (XEXP (XEXP (*pnote
, 0), 1));
1067 dump_prediction (dump_file
, predictor
, probability
, bb
,
1068 (!first_match
|| best_predictor
== predictor
)
1069 ? REASON_NONE
: REASON_IGNORED
);
1070 *pnote
= XEXP (*pnote
, 1);
1073 pnote
= &XEXP (*pnote
, 1);
1078 profile_probability p
1079 = profile_probability::from_reg_br_prob_base (combined_probability
);
1080 add_reg_br_prob_note (insn
, p
);
1082 /* Save the prediction into CFG in case we are seeing non-degenerated
1083 conditional jump. */
1084 if (!single_succ_p (bb
))
1086 BRANCH_EDGE (bb
)->probability
= p
;
1087 FALLTHRU_EDGE (bb
)->probability
1088 = BRANCH_EDGE (bb
)->probability
.invert ();
1091 else if (!single_succ_p (bb
))
1093 profile_probability prob
= profile_probability::from_reg_br_prob_note
1094 (XINT (prob_note
, 0));
1096 BRANCH_EDGE (bb
)->probability
= prob
;
1097 FALLTHRU_EDGE (bb
)->probability
= prob
.invert ();
1100 single_succ_edge (bb
)->probability
= profile_probability::always ();
1103 /* Edge prediction hash traits. */
1105 struct predictor_hash
: pointer_hash
<edge_prediction
>
1108 static inline hashval_t
hash (const edge_prediction
*);
1109 static inline bool equal (const edge_prediction
*, const edge_prediction
*);
1112 /* Calculate hash value of an edge prediction P based on predictor and
1113 normalized probability. */
1116 predictor_hash::hash (const edge_prediction
*p
)
1118 inchash::hash hstate
;
1119 hstate
.add_int (p
->ep_predictor
);
1121 int prob
= p
->ep_probability
;
1122 if (prob
> REG_BR_PROB_BASE
/ 2)
1123 prob
= REG_BR_PROB_BASE
- prob
;
1125 hstate
.add_int (prob
);
1127 return hstate
.end ();
1130 /* Return true whether edge predictions P1 and P2 use the same predictor and
1131 have equal (or opposed probability). */
1134 predictor_hash::equal (const edge_prediction
*p1
, const edge_prediction
*p2
)
1136 return (p1
->ep_predictor
== p2
->ep_predictor
1137 && (p1
->ep_probability
== p2
->ep_probability
1138 || p1
->ep_probability
== REG_BR_PROB_BASE
- p2
->ep_probability
));
1141 struct predictor_hash_traits
: predictor_hash
,
1142 typed_noop_remove
<edge_prediction
*> {};
1144 /* Return true if edge prediction P is not in DATA hash set. */
1147 not_removed_prediction_p (edge_prediction
*p
, void *data
)
1149 hash_set
<edge_prediction
*> *remove
= (hash_set
<edge_prediction
*> *) data
;
1150 return !remove
->contains (p
);
1153 /* Prune predictions for a basic block BB. Currently we do following
1156 1) remove duplicate prediction that is guessed with the same probability
1157 (different than 1/2) to both edge
1158 2) remove duplicates for a prediction that belongs with the same probability
1164 prune_predictions_for_bb (basic_block bb
)
1166 edge_prediction
**preds
= bb_predictions
->get (bb
);
1170 hash_table
<predictor_hash_traits
> s (13);
1171 hash_set
<edge_prediction
*> remove
;
1173 /* Step 1: identify predictors that should be removed. */
1174 for (edge_prediction
*pred
= *preds
; pred
; pred
= pred
->ep_next
)
1176 edge_prediction
*existing
= s
.find (pred
);
1179 if (pred
->ep_edge
== existing
->ep_edge
1180 && pred
->ep_probability
== existing
->ep_probability
)
1182 /* Remove a duplicate predictor. */
1183 dump_prediction (dump_file
, pred
->ep_predictor
,
1184 pred
->ep_probability
, bb
,
1185 REASON_SINGLE_EDGE_DUPLICATE
, pred
->ep_edge
);
1189 else if (pred
->ep_edge
!= existing
->ep_edge
1190 && pred
->ep_probability
== existing
->ep_probability
1191 && pred
->ep_probability
!= REG_BR_PROB_BASE
/ 2)
1193 /* Remove both predictors as they predict the same
1195 dump_prediction (dump_file
, existing
->ep_predictor
,
1196 pred
->ep_probability
, bb
,
1197 REASON_EDGE_PAIR_DUPLICATE
,
1199 dump_prediction (dump_file
, pred
->ep_predictor
,
1200 pred
->ep_probability
, bb
,
1201 REASON_EDGE_PAIR_DUPLICATE
,
1204 remove
.add (existing
);
1209 edge_prediction
**slot2
= s
.find_slot (pred
, INSERT
);
1213 /* Step 2: Remove predictors. */
1214 filter_predictions (preds
, not_removed_prediction_p
, &remove
);
1218 /* Combine predictions into single probability and store them into CFG.
1219 Remove now useless prediction entries.
1220 If DRY_RUN is set, only produce dumps and do not modify profile. */
1223 combine_predictions_for_bb (basic_block bb
, bool dry_run
)
1225 int best_probability
= PROB_EVEN
;
1226 enum br_predictor best_predictor
= END_PREDICTORS
;
1227 int combined_probability
= REG_BR_PROB_BASE
/ 2;
1229 bool first_match
= false;
1231 struct edge_prediction
*pred
;
1233 edge e
, first
= NULL
, second
= NULL
;
1238 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1240 if (!unlikely_executed_edge_p (e
))
1243 if (first
&& !second
)
1248 else if (!e
->probability
.initialized_p ())
1249 e
->probability
= profile_probability::never ();
1250 if (!e
->probability
.initialized_p ())
1252 else if (e
->probability
== profile_probability::never ())
1256 /* When there is no successor or only one choice, prediction is easy.
1258 When we have a basic block with more than 2 successors, the situation
1259 is more complicated as DS theory cannot be used literally.
1260 More precisely, let's assume we predicted edge e1 with probability p1,
1261 thus: m1({b1}) = p1. As we're going to combine more than 2 edges, we
1262 need to find probability of e.g. m1({b2}), which we don't know.
1263 The only approximation is to equally distribute 1-p1 to all edges
1266 According to numbers we've got from SPEC2006 benchark, there's only
1267 one interesting reliable predictor (noreturn call), which can be
1268 handled with a bit easier approach. */
1271 hash_set
<edge
> unlikely_edges (4);
1272 hash_set
<edge_prediction
*> likely_edges (4);
1274 /* Identify all edges that have a probability close to very unlikely.
1275 Doing the approach for very unlikely doesn't worth for doing as
1276 there's no such probability in SPEC2006 benchmark. */
1277 edge_prediction
**preds
= bb_predictions
->get (bb
);
1279 for (pred
= *preds
; pred
; pred
= pred
->ep_next
)
1281 if (pred
->ep_probability
<= PROB_VERY_UNLIKELY
1282 || pred
->ep_predictor
== PRED_COLD_LABEL
)
1283 unlikely_edges
.add (pred
->ep_edge
);
1284 else if (pred
->ep_probability
>= PROB_VERY_LIKELY
1285 || pred
->ep_predictor
== PRED_BUILTIN_EXPECT
1286 || pred
->ep_predictor
== PRED_HOT_LABEL
)
1287 likely_edges
.add (pred
);
1290 /* It can happen that an edge is both in likely_edges and unlikely_edges.
1291 Clear both sets in that situation. */
1292 for (hash_set
<edge_prediction
*>::iterator it
= likely_edges
.begin ();
1293 it
!= likely_edges
.end (); ++it
)
1294 if (unlikely_edges
.contains ((*it
)->ep_edge
))
1296 likely_edges
.empty ();
1297 unlikely_edges
.empty ();
1302 set_even_probabilities (bb
, &unlikely_edges
, &likely_edges
);
1303 clear_bb_predictions (bb
);
1306 fprintf (dump_file
, "Predictions for bb %i\n", bb
->index
);
1307 if (unlikely_edges
.is_empty ())
1309 "%i edges in bb %i predicted to even probabilities\n",
1314 "%i edges in bb %i predicted with some unlikely edges\n",
1316 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1317 if (!unlikely_executed_edge_p (e
))
1318 dump_prediction (dump_file
, PRED_COMBINED
,
1319 e
->probability
.to_reg_br_prob_base (), bb
, REASON_NONE
, e
);
1326 fprintf (dump_file
, "Predictions for bb %i\n", bb
->index
);
1328 prune_predictions_for_bb (bb
);
1330 edge_prediction
**preds
= bb_predictions
->get (bb
);
1334 /* We implement "first match" heuristics and use probability guessed
1335 by predictor with smallest index. */
1336 for (pred
= *preds
; pred
; pred
= pred
->ep_next
)
1338 enum br_predictor predictor
= pred
->ep_predictor
;
1339 int probability
= pred
->ep_probability
;
1341 if (pred
->ep_edge
!= first
)
1342 probability
= REG_BR_PROB_BASE
- probability
;
1345 /* First match heuristics would be widly confused if we predicted
1347 if (best_predictor
> predictor
1348 && predictor_info
[predictor
].flags
& PRED_FLAG_FIRST_MATCH
)
1350 struct edge_prediction
*pred2
;
1351 int prob
= probability
;
1353 for (pred2
= (struct edge_prediction
*) *preds
;
1354 pred2
; pred2
= pred2
->ep_next
)
1355 if (pred2
!= pred
&& pred2
->ep_predictor
== pred
->ep_predictor
)
1357 int probability2
= pred2
->ep_probability
;
1359 if (pred2
->ep_edge
!= first
)
1360 probability2
= REG_BR_PROB_BASE
- probability2
;
1362 if ((probability
< REG_BR_PROB_BASE
/ 2) !=
1363 (probability2
< REG_BR_PROB_BASE
/ 2))
1366 /* If the same predictor later gave better result, go for it! */
1367 if ((probability
>= REG_BR_PROB_BASE
/ 2 && (probability2
> probability
))
1368 || (probability
<= REG_BR_PROB_BASE
/ 2 && (probability2
< probability
)))
1369 prob
= probability2
;
1372 best_probability
= prob
, best_predictor
= predictor
;
1375 d
= (combined_probability
* probability
1376 + (REG_BR_PROB_BASE
- combined_probability
)
1377 * (REG_BR_PROB_BASE
- probability
));
1379 /* Use FP math to avoid overflows of 32bit integers. */
1381 /* If one probability is 0% and one 100%, avoid division by zero. */
1382 combined_probability
= REG_BR_PROB_BASE
/ 2;
1384 combined_probability
= (((double) combined_probability
)
1386 * REG_BR_PROB_BASE
/ d
+ 0.5);
1390 /* Decide which heuristic to use. In case we didn't match anything,
1391 use no_prediction heuristic, in case we did match, use either
1392 first match or Dempster-Shaffer theory depending on the flags. */
1394 if (best_predictor
!= END_PREDICTORS
)
1398 dump_prediction (dump_file
, PRED_NO_PREDICTION
, combined_probability
, bb
);
1402 dump_prediction (dump_file
, PRED_DS_THEORY
, combined_probability
, bb
,
1403 !first_match
? REASON_NONE
: REASON_IGNORED
);
1405 dump_prediction (dump_file
, PRED_FIRST_MATCH
, best_probability
, bb
,
1406 first_match
? REASON_NONE
: REASON_IGNORED
);
1410 combined_probability
= best_probability
;
1411 dump_prediction (dump_file
, PRED_COMBINED
, combined_probability
, bb
);
1415 for (pred
= (struct edge_prediction
*) *preds
; pred
; pred
= pred
->ep_next
)
1417 enum br_predictor predictor
= pred
->ep_predictor
;
1418 int probability
= pred
->ep_probability
;
1420 dump_prediction (dump_file
, predictor
, probability
, bb
,
1421 (!first_match
|| best_predictor
== predictor
)
1422 ? REASON_NONE
: REASON_IGNORED
, pred
->ep_edge
);
1425 clear_bb_predictions (bb
);
1428 /* If we have only one successor which is unknown, we can compute missing
1432 profile_probability prob
= profile_probability::always ();
1433 edge missing
= NULL
;
1435 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1436 if (e
->probability
.initialized_p ())
1437 prob
-= e
->probability
;
1438 else if (missing
== NULL
)
1442 missing
->probability
= prob
;
1444 /* If nothing is unknown, we have nothing to update. */
1445 else if (!nunknown
&& nzero
!= (int)EDGE_COUNT (bb
->succs
))
1450 = profile_probability::from_reg_br_prob_base (combined_probability
);
1451 second
->probability
= first
->probability
.invert ();
1455 /* Check if T1 and T2 satisfy the IV_COMPARE condition.
1456 Return the SSA_NAME if the condition satisfies, NULL otherwise.
1458 T1 and T2 should be one of the following cases:
1459 1. T1 is SSA_NAME, T2 is NULL
1460 2. T1 is SSA_NAME, T2 is INTEGER_CST between [-4, 4]
1461 3. T2 is SSA_NAME, T1 is INTEGER_CST between [-4, 4] */
1464 strips_small_constant (tree t1
, tree t2
)
1471 else if (TREE_CODE (t1
) == SSA_NAME
)
1473 else if (tree_fits_shwi_p (t1
))
1474 value
= tree_to_shwi (t1
);
1480 else if (tree_fits_shwi_p (t2
))
1481 value
= tree_to_shwi (t2
);
1482 else if (TREE_CODE (t2
) == SSA_NAME
)
1490 if (value
<= 4 && value
>= -4)
1496 /* Return the SSA_NAME in T or T's operands.
1497 Return NULL if SSA_NAME cannot be found. */
1500 get_base_value (tree t
)
1502 if (TREE_CODE (t
) == SSA_NAME
)
1505 if (!BINARY_CLASS_P (t
))
1508 switch (TREE_OPERAND_LENGTH (t
))
1511 return strips_small_constant (TREE_OPERAND (t
, 0), NULL
);
1513 return strips_small_constant (TREE_OPERAND (t
, 0),
1514 TREE_OPERAND (t
, 1));
1520 /* Check the compare STMT in LOOP. If it compares an induction
1521 variable to a loop invariant, return true, and save
1522 LOOP_INVARIANT, COMPARE_CODE and LOOP_STEP.
1523 Otherwise return false and set LOOP_INVAIANT to NULL. */
1526 is_comparison_with_loop_invariant_p (gcond
*stmt
, class loop
*loop
,
1527 tree
*loop_invariant
,
1528 enum tree_code
*compare_code
,
1532 tree op0
, op1
, bound
, base
;
1534 enum tree_code code
;
1537 code
= gimple_cond_code (stmt
);
1538 *loop_invariant
= NULL
;
1554 op0
= gimple_cond_lhs (stmt
);
1555 op1
= gimple_cond_rhs (stmt
);
1557 if ((TREE_CODE (op0
) != SSA_NAME
&& TREE_CODE (op0
) != INTEGER_CST
)
1558 || (TREE_CODE (op1
) != SSA_NAME
&& TREE_CODE (op1
) != INTEGER_CST
))
1560 if (!simple_iv (loop
, loop_containing_stmt (stmt
), op0
, &iv0
, true))
1562 if (!simple_iv (loop
, loop_containing_stmt (stmt
), op1
, &iv1
, true))
1564 if (TREE_CODE (iv0
.step
) != INTEGER_CST
1565 || TREE_CODE (iv1
.step
) != INTEGER_CST
)
1567 if ((integer_zerop (iv0
.step
) && integer_zerop (iv1
.step
))
1568 || (!integer_zerop (iv0
.step
) && !integer_zerop (iv1
.step
)))
1571 if (integer_zerop (iv0
.step
))
1573 if (code
!= NE_EXPR
&& code
!= EQ_EXPR
)
1574 code
= invert_tree_comparison (code
, false);
1577 if (tree_fits_shwi_p (iv1
.step
))
1586 if (tree_fits_shwi_p (iv0
.step
))
1592 if (TREE_CODE (bound
) != INTEGER_CST
)
1593 bound
= get_base_value (bound
);
1596 if (TREE_CODE (base
) != INTEGER_CST
)
1597 base
= get_base_value (base
);
1601 *loop_invariant
= bound
;
1602 *compare_code
= code
;
1604 *loop_iv_base
= base
;
1608 /* Compare two SSA_NAMEs: returns TRUE if T1 and T2 are value coherent. */
1611 expr_coherent_p (tree t1
, tree t2
)
1614 tree ssa_name_1
= NULL
;
1615 tree ssa_name_2
= NULL
;
1617 gcc_assert (TREE_CODE (t1
) == SSA_NAME
|| TREE_CODE (t1
) == INTEGER_CST
);
1618 gcc_assert (TREE_CODE (t2
) == SSA_NAME
|| TREE_CODE (t2
) == INTEGER_CST
);
1623 if (TREE_CODE (t1
) == INTEGER_CST
&& TREE_CODE (t2
) == INTEGER_CST
)
1625 if (TREE_CODE (t1
) == INTEGER_CST
|| TREE_CODE (t2
) == INTEGER_CST
)
1628 /* Check to see if t1 is expressed/defined with t2. */
1629 stmt
= SSA_NAME_DEF_STMT (t1
);
1630 gcc_assert (stmt
!= NULL
);
1631 if (is_gimple_assign (stmt
))
1633 ssa_name_1
= SINGLE_SSA_TREE_OPERAND (stmt
, SSA_OP_USE
);
1634 if (ssa_name_1
&& ssa_name_1
== t2
)
1638 /* Check to see if t2 is expressed/defined with t1. */
1639 stmt
= SSA_NAME_DEF_STMT (t2
);
1640 gcc_assert (stmt
!= NULL
);
1641 if (is_gimple_assign (stmt
))
1643 ssa_name_2
= SINGLE_SSA_TREE_OPERAND (stmt
, SSA_OP_USE
);
1644 if (ssa_name_2
&& ssa_name_2
== t1
)
1648 /* Compare if t1 and t2's def_stmts are identical. */
1649 if (ssa_name_2
!= NULL
&& ssa_name_1
== ssa_name_2
)
1655 /* Return true if E is predicted by one of loop heuristics. */
1658 predicted_by_loop_heuristics_p (basic_block bb
)
1660 struct edge_prediction
*i
;
1661 edge_prediction
**preds
= bb_predictions
->get (bb
);
1666 for (i
= *preds
; i
; i
= i
->ep_next
)
1667 if (i
->ep_predictor
== PRED_LOOP_ITERATIONS_GUESSED
1668 || i
->ep_predictor
== PRED_LOOP_ITERATIONS_MAX
1669 || i
->ep_predictor
== PRED_LOOP_ITERATIONS
1670 || i
->ep_predictor
== PRED_LOOP_EXIT
1671 || i
->ep_predictor
== PRED_LOOP_EXIT_WITH_RECURSION
1672 || i
->ep_predictor
== PRED_LOOP_EXTRA_EXIT
)
1677 /* Predict branch probability of BB when BB contains a branch that compares
1678 an induction variable in LOOP with LOOP_IV_BASE_VAR to LOOP_BOUND_VAR. The
1679 loop exit is compared using LOOP_BOUND_CODE, with step of LOOP_BOUND_STEP.
1682 for (int i = 0; i < bound; i++) {
1689 In this loop, we will predict the branch inside the loop to be taken. */
1692 predict_iv_comparison (class loop
*loop
, basic_block bb
,
1693 tree loop_bound_var
,
1694 tree loop_iv_base_var
,
1695 enum tree_code loop_bound_code
,
1696 int loop_bound_step
)
1698 tree compare_var
, compare_base
;
1699 enum tree_code compare_code
;
1700 tree compare_step_var
;
1704 if (predicted_by_loop_heuristics_p (bb
))
1707 gcond
*stmt
= safe_dyn_cast
<gcond
*> (*gsi_last_bb (bb
));
1710 if (!is_comparison_with_loop_invariant_p (stmt
,
1717 /* Find the taken edge. */
1718 FOR_EACH_EDGE (then_edge
, ei
, bb
->succs
)
1719 if (then_edge
->flags
& EDGE_TRUE_VALUE
)
1722 /* When comparing an IV to a loop invariant, NE is more likely to be
1723 taken while EQ is more likely to be not-taken. */
1724 if (compare_code
== NE_EXPR
)
1726 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1729 else if (compare_code
== EQ_EXPR
)
1731 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, NOT_TAKEN
);
1735 if (!expr_coherent_p (loop_iv_base_var
, compare_base
))
1738 /* If loop bound, base and compare bound are all constants, we can
1739 calculate the probability directly. */
1740 if (tree_fits_shwi_p (loop_bound_var
)
1741 && tree_fits_shwi_p (compare_var
)
1742 && tree_fits_shwi_p (compare_base
))
1745 wi::overflow_type overflow
;
1746 bool overall_overflow
= false;
1747 widest_int compare_count
, tem
;
1749 /* (loop_bound - base) / compare_step */
1750 tem
= wi::sub (wi::to_widest (loop_bound_var
),
1751 wi::to_widest (compare_base
), SIGNED
, &overflow
);
1752 overall_overflow
|= overflow
;
1753 widest_int loop_count
= wi::div_trunc (tem
,
1754 wi::to_widest (compare_step_var
),
1756 overall_overflow
|= overflow
;
1758 if (!wi::neg_p (wi::to_widest (compare_step_var
))
1759 ^ (compare_code
== LT_EXPR
|| compare_code
== LE_EXPR
))
1761 /* (loop_bound - compare_bound) / compare_step */
1762 tem
= wi::sub (wi::to_widest (loop_bound_var
),
1763 wi::to_widest (compare_var
), SIGNED
, &overflow
);
1764 overall_overflow
|= overflow
;
1765 compare_count
= wi::div_trunc (tem
, wi::to_widest (compare_step_var
),
1767 overall_overflow
|= overflow
;
1771 /* (compare_bound - base) / compare_step */
1772 tem
= wi::sub (wi::to_widest (compare_var
),
1773 wi::to_widest (compare_base
), SIGNED
, &overflow
);
1774 overall_overflow
|= overflow
;
1775 compare_count
= wi::div_trunc (tem
, wi::to_widest (compare_step_var
),
1777 overall_overflow
|= overflow
;
1779 if (compare_code
== LE_EXPR
|| compare_code
== GE_EXPR
)
1781 if (loop_bound_code
== LE_EXPR
|| loop_bound_code
== GE_EXPR
)
1783 if (wi::neg_p (compare_count
))
1785 if (wi::neg_p (loop_count
))
1787 if (loop_count
== 0)
1789 else if (wi::cmps (compare_count
, loop_count
) == 1)
1790 probability
= REG_BR_PROB_BASE
;
1793 tem
= compare_count
* REG_BR_PROB_BASE
;
1794 tem
= wi::udiv_trunc (tem
, loop_count
);
1795 probability
= tem
.to_uhwi ();
1798 /* FIXME: The branch prediction seems broken. It has only 20% hitrate. */
1799 if (!overall_overflow
)
1800 predict_edge (then_edge
, PRED_LOOP_IV_COMPARE
, probability
);
1805 if (expr_coherent_p (loop_bound_var
, compare_var
))
1807 if ((loop_bound_code
== LT_EXPR
|| loop_bound_code
== LE_EXPR
)
1808 && (compare_code
== LT_EXPR
|| compare_code
== LE_EXPR
))
1809 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1810 else if ((loop_bound_code
== GT_EXPR
|| loop_bound_code
== GE_EXPR
)
1811 && (compare_code
== GT_EXPR
|| compare_code
== GE_EXPR
))
1812 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1813 else if (loop_bound_code
== NE_EXPR
)
1815 /* If the loop backedge condition is "(i != bound)", we do
1816 the comparison based on the step of IV:
1817 * step < 0 : backedge condition is like (i > bound)
1818 * step > 0 : backedge condition is like (i < bound) */
1819 gcc_assert (loop_bound_step
!= 0);
1820 if (loop_bound_step
> 0
1821 && (compare_code
== LT_EXPR
1822 || compare_code
== LE_EXPR
))
1823 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1824 else if (loop_bound_step
< 0
1825 && (compare_code
== GT_EXPR
1826 || compare_code
== GE_EXPR
))
1827 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1829 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, NOT_TAKEN
);
1832 /* The branch is predicted not-taken if loop_bound_code is
1833 opposite with compare_code. */
1834 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, NOT_TAKEN
);
1836 else if (expr_coherent_p (loop_iv_base_var
, compare_var
))
1839 for (i = s; i < h; i++)
1841 The branch should be predicted taken. */
1842 if (loop_bound_step
> 0
1843 && (compare_code
== GT_EXPR
|| compare_code
== GE_EXPR
))
1844 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1845 else if (loop_bound_step
< 0
1846 && (compare_code
== LT_EXPR
|| compare_code
== LE_EXPR
))
1847 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, TAKEN
);
1849 predict_edge_def (then_edge
, PRED_LOOP_IV_COMPARE_GUESS
, NOT_TAKEN
);
1853 /* Predict for extra loop exits that will lead to EXIT_EDGE. The extra loop
1854 exits are resulted from short-circuit conditions that will generate an
1857 if (foo() || global > 10)
1860 This will be translated into:
1865 if foo() goto BB6 else goto BB5
1867 if global > 10 goto BB6 else goto BB7
1871 iftmp = (PHI 0(BB5), 1(BB6))
1872 if iftmp == 1 goto BB8 else goto BB3
1874 outside of the loop...
1876 The edge BB7->BB8 is loop exit because BB8 is outside of the loop.
1877 From the dataflow, we can infer that BB4->BB6 and BB5->BB6 are also loop
1878 exits. This function takes BB7->BB8 as input, and finds out the extra loop
1879 exits to predict them using PRED_LOOP_EXTRA_EXIT. */
1882 predict_extra_loop_exits (class loop
*loop
, edge exit_edge
)
1885 bool check_value_one
;
1886 gimple
*lhs_def_stmt
;
1888 tree cmp_rhs
, cmp_lhs
;
1890 gcond
*cmp_stmt
= safe_dyn_cast
<gcond
*> (*gsi_last_bb (exit_edge
->src
));
1894 cmp_rhs
= gimple_cond_rhs (cmp_stmt
);
1895 cmp_lhs
= gimple_cond_lhs (cmp_stmt
);
1896 if (!TREE_CONSTANT (cmp_rhs
)
1897 || !(integer_zerop (cmp_rhs
) || integer_onep (cmp_rhs
)))
1899 if (TREE_CODE (cmp_lhs
) != SSA_NAME
)
1902 /* If check_value_one is true, only the phi_args with value '1' will lead
1903 to loop exit. Otherwise, only the phi_args with value '0' will lead to
1905 check_value_one
= (((integer_onep (cmp_rhs
))
1906 ^ (gimple_cond_code (cmp_stmt
) == EQ_EXPR
))
1907 ^ ((exit_edge
->flags
& EDGE_TRUE_VALUE
) != 0));
1909 lhs_def_stmt
= SSA_NAME_DEF_STMT (cmp_lhs
);
1913 phi_stmt
= dyn_cast
<gphi
*> (lhs_def_stmt
);
1917 for (i
= 0; i
< gimple_phi_num_args (phi_stmt
); i
++)
1921 tree val
= gimple_phi_arg_def (phi_stmt
, i
);
1922 edge e
= gimple_phi_arg_edge (phi_stmt
, i
);
1924 if (!TREE_CONSTANT (val
) || !(integer_zerop (val
) || integer_onep (val
)))
1926 if ((check_value_one
^ integer_onep (val
)) == 1)
1928 if (EDGE_COUNT (e
->src
->succs
) != 1)
1930 predict_paths_leading_to_edge (e
, PRED_LOOP_EXTRA_EXIT
, NOT_TAKEN
,
1935 FOR_EACH_EDGE (e1
, ei
, e
->src
->preds
)
1936 predict_paths_leading_to_edge (e1
, PRED_LOOP_EXTRA_EXIT
, NOT_TAKEN
,
1942 /* Predict edge probabilities by exploiting loop structure. */
1945 predict_loops (void)
1948 hash_set
<class loop
*> with_recursion(10);
1950 FOR_EACH_BB_FN (bb
, cfun
)
1952 gimple_stmt_iterator gsi
;
1955 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
1956 if (is_gimple_call (gsi_stmt (gsi
))
1957 && (decl
= gimple_call_fndecl (gsi_stmt (gsi
))) != NULL
1958 && recursive_call_p (current_function_decl
, decl
))
1960 class loop
*loop
= bb
->loop_father
;
1961 while (loop
&& !with_recursion
.add (loop
))
1962 loop
= loop_outer (loop
);
1966 /* Try to predict out blocks in a loop that are not part of a
1968 for (auto loop
: loops_list (cfun
, LI_FROM_INNERMOST
))
1970 basic_block bb
, *bbs
;
1971 unsigned j
, n_exits
= 0;
1972 class tree_niter_desc niter_desc
;
1974 class nb_iter_bound
*nb_iter
;
1975 enum tree_code loop_bound_code
= ERROR_MARK
;
1976 tree loop_bound_step
= NULL
;
1977 tree loop_bound_var
= NULL
;
1978 tree loop_iv_base
= NULL
;
1980 bool recursion
= with_recursion
.contains (loop
);
1982 auto_vec
<edge
> exits
= get_loop_exit_edges (loop
);
1983 FOR_EACH_VEC_ELT (exits
, j
, ex
)
1984 if (!unlikely_executed_edge_p (ex
) && !(ex
->flags
& EDGE_ABNORMAL_CALL
))
1989 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
1990 fprintf (dump_file
, "Predicting loop %i%s with %i exits.\n",
1991 loop
->num
, recursion
? " (with recursion)" : "", n_exits
);
1992 if (dump_file
&& (dump_flags
& TDF_DETAILS
)
1993 && max_loop_iterations_int (loop
) >= 0)
1996 "Loop %d iterates at most %i times.\n", loop
->num
,
1997 (int)max_loop_iterations_int (loop
));
1999 if (dump_file
&& (dump_flags
& TDF_DETAILS
)
2000 && likely_max_loop_iterations_int (loop
) >= 0)
2002 fprintf (dump_file
, "Loop %d likely iterates at most %i times.\n",
2003 loop
->num
, (int)likely_max_loop_iterations_int (loop
));
2006 FOR_EACH_VEC_ELT (exits
, j
, ex
)
2009 HOST_WIDE_INT nitercst
;
2010 int max
= param_max_predicted_iterations
;
2012 enum br_predictor predictor
;
2015 if (unlikely_executed_edge_p (ex
)
2016 || (ex
->flags
& EDGE_ABNORMAL_CALL
))
2018 /* Loop heuristics do not expect exit conditional to be inside
2019 inner loop. We predict from innermost to outermost loop. */
2020 if (predicted_by_loop_heuristics_p (ex
->src
))
2022 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2023 fprintf (dump_file
, "Skipping exit %i->%i because "
2024 "it is already predicted.\n",
2025 ex
->src
->index
, ex
->dest
->index
);
2028 predict_extra_loop_exits (loop
, ex
);
2030 if (number_of_iterations_exit (loop
, ex
, &niter_desc
, false, false))
2031 niter
= niter_desc
.niter
;
2032 if (!niter
|| TREE_CODE (niter_desc
.niter
) != INTEGER_CST
)
2033 niter
= loop_niter_by_eval (loop
, ex
);
2034 if (dump_file
&& (dump_flags
& TDF_DETAILS
)
2035 && TREE_CODE (niter
) == INTEGER_CST
)
2037 fprintf (dump_file
, "Exit %i->%i %d iterates ",
2038 ex
->src
->index
, ex
->dest
->index
,
2040 print_generic_expr (dump_file
, niter
, TDF_SLIM
);
2041 fprintf (dump_file
, " times.\n");
2044 if (TREE_CODE (niter
) == INTEGER_CST
)
2046 if (tree_fits_uhwi_p (niter
)
2048 && compare_tree_int (niter
, max
- 1) == -1)
2049 nitercst
= tree_to_uhwi (niter
) + 1;
2052 predictor
= PRED_LOOP_ITERATIONS
;
2054 /* If we have just one exit and we can derive some information about
2055 the number of iterations of the loop from the statements inside
2056 the loop, use it to predict this exit. */
2057 else if (n_exits
== 1
2058 && estimated_stmt_executions (loop
, &nit
))
2060 if (wi::gtu_p (nit
, max
))
2063 nitercst
= nit
.to_shwi ();
2064 predictor
= PRED_LOOP_ITERATIONS_GUESSED
;
2066 /* If we have likely upper bound, trust it for very small iteration
2067 counts. Such loops would otherwise get mispredicted by standard
2068 LOOP_EXIT heuristics. */
2069 else if (n_exits
== 1
2070 && likely_max_stmt_executions (loop
, &nit
)
2072 RDIV (REG_BR_PROB_BASE
,
2076 ? PRED_LOOP_EXIT_WITH_RECURSION
2077 : PRED_LOOP_EXIT
].hitrate
)))
2079 nitercst
= nit
.to_shwi ();
2080 predictor
= PRED_LOOP_ITERATIONS_MAX
;
2084 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2085 fprintf (dump_file
, "Nothing known about exit %i->%i.\n",
2086 ex
->src
->index
, ex
->dest
->index
);
2090 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2091 fprintf (dump_file
, "Recording prediction to %i iterations by %s.\n",
2092 (int)nitercst
, predictor_info
[predictor
].name
);
2093 /* If the prediction for number of iterations is zero, do not
2094 predict the exit edges. */
2098 probability
= RDIV (REG_BR_PROB_BASE
, nitercst
);
2099 predict_edge (ex
, predictor
, probability
);
2102 /* Find information about loop bound variables. */
2103 for (nb_iter
= loop
->bounds
; nb_iter
;
2104 nb_iter
= nb_iter
->next
)
2106 && gimple_code (nb_iter
->stmt
) == GIMPLE_COND
)
2108 stmt
= as_a
<gcond
*> (nb_iter
->stmt
);
2112 stmt
= safe_dyn_cast
<gcond
*> (*gsi_last_bb (loop
->header
));
2114 is_comparison_with_loop_invariant_p (stmt
, loop
,
2120 bbs
= get_loop_body (loop
);
2122 for (j
= 0; j
< loop
->num_nodes
; j
++)
2129 /* Bypass loop heuristics on continue statement. These
2130 statements construct loops via "non-loop" constructs
2131 in the source language and are better to be handled
2133 if (predicted_by_p (bb
, PRED_CONTINUE
))
2135 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2136 fprintf (dump_file
, "BB %i predicted by continue.\n",
2141 /* If we already used more reliable loop exit predictors, do not
2142 bother with PRED_LOOP_EXIT. */
2143 if (!predicted_by_loop_heuristics_p (bb
))
2145 /* For loop with many exits we don't want to predict all exits
2146 with the pretty large probability, because if all exits are
2147 considered in row, the loop would be predicted to iterate
2148 almost never. The code to divide probability by number of
2149 exits is very rough. It should compute the number of exits
2150 taken in each patch through function (not the overall number
2151 of exits that might be a lot higher for loops with wide switch
2152 statements in them) and compute n-th square root.
2154 We limit the minimal probability by 2% to avoid
2155 EDGE_PROBABILITY_RELIABLE from trusting the branch prediction
2156 as this was causing regression in perl benchmark containing such
2159 int probability
= ((REG_BR_PROB_BASE
2162 ? PRED_LOOP_EXIT_WITH_RECURSION
2163 : PRED_LOOP_EXIT
].hitrate
)
2165 if (probability
< HITRATE (2))
2166 probability
= HITRATE (2);
2167 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2168 if (e
->dest
->index
< NUM_FIXED_BLOCKS
2169 || !flow_bb_inside_loop_p (loop
, e
->dest
))
2171 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2173 "Predicting exit %i->%i with prob %i.\n",
2174 e
->src
->index
, e
->dest
->index
, probability
);
2176 recursion
? PRED_LOOP_EXIT_WITH_RECURSION
2177 : PRED_LOOP_EXIT
, probability
);
2181 predict_iv_comparison (loop
, bb
, loop_bound_var
, loop_iv_base
,
2183 tree_to_shwi (loop_bound_step
));
2186 /* In the following code
2191 guess that cond is unlikely. */
2192 if (loop_outer (loop
)->num
)
2194 basic_block bb
= NULL
;
2195 edge preheader_edge
= loop_preheader_edge (loop
);
2197 if (single_pred_p (preheader_edge
->src
)
2198 && single_succ_p (preheader_edge
->src
))
2199 preheader_edge
= single_pred_edge (preheader_edge
->src
);
2201 /* Pattern match fortran loop preheader:
2202 _16 = BUILTIN_EXPECT (_15, 1, PRED_FORTRAN_LOOP_PREHEADER);
2203 _17 = (logical(kind=4)) _16;
2209 Loop guard branch prediction says nothing about duplicated loop
2210 headers produced by fortran frontend and in this case we want
2211 to predict paths leading to this preheader. */
2214 = safe_dyn_cast
<gcond
*> (*gsi_last_bb (preheader_edge
->src
));
2216 && gimple_cond_code (stmt
) == NE_EXPR
2217 && TREE_CODE (gimple_cond_lhs (stmt
)) == SSA_NAME
2218 && integer_zerop (gimple_cond_rhs (stmt
)))
2220 gimple
*call_stmt
= SSA_NAME_DEF_STMT (gimple_cond_lhs (stmt
));
2221 if (gimple_code (call_stmt
) == GIMPLE_ASSIGN
2222 && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (call_stmt
))
2223 && TREE_CODE (gimple_assign_rhs1 (call_stmt
)) == SSA_NAME
)
2224 call_stmt
= SSA_NAME_DEF_STMT (gimple_assign_rhs1 (call_stmt
));
2225 if (gimple_call_internal_p (call_stmt
, IFN_BUILTIN_EXPECT
)
2226 && TREE_CODE (gimple_call_arg (call_stmt
, 2)) == INTEGER_CST
2227 && tree_fits_uhwi_p (gimple_call_arg (call_stmt
, 2))
2228 && tree_to_uhwi (gimple_call_arg (call_stmt
, 2))
2229 == PRED_FORTRAN_LOOP_PREHEADER
)
2230 bb
= preheader_edge
->src
;
2234 if (!dominated_by_p (CDI_DOMINATORS
,
2235 loop_outer (loop
)->latch
, loop
->header
))
2236 predict_paths_leading_to_edge (loop_preheader_edge (loop
),
2238 ? PRED_LOOP_GUARD_WITH_RECURSION
2245 if (!dominated_by_p (CDI_DOMINATORS
,
2246 loop_outer (loop
)->latch
, bb
))
2247 predict_paths_leading_to (bb
,
2249 ? PRED_LOOP_GUARD_WITH_RECURSION
2256 /* Free basic blocks from get_loop_body. */
2261 /* Attempt to predict probabilities of BB outgoing edges using local
2264 bb_estimate_probability_locally (basic_block bb
)
2266 rtx_insn
*last_insn
= BB_END (bb
);
2269 if (! can_predict_insn_p (last_insn
))
2271 cond
= get_condition (last_insn
, NULL
, false, false);
2275 /* Try "pointer heuristic."
2276 A comparison ptr == 0 is predicted as false.
2277 Similarly, a comparison ptr1 == ptr2 is predicted as false. */
2278 if (COMPARISON_P (cond
)
2279 && ((REG_P (XEXP (cond
, 0)) && REG_POINTER (XEXP (cond
, 0)))
2280 || (REG_P (XEXP (cond
, 1)) && REG_POINTER (XEXP (cond
, 1)))))
2282 if (GET_CODE (cond
) == EQ
)
2283 predict_insn_def (last_insn
, PRED_POINTER
, NOT_TAKEN
);
2284 else if (GET_CODE (cond
) == NE
)
2285 predict_insn_def (last_insn
, PRED_POINTER
, TAKEN
);
2289 /* Try "opcode heuristic."
2290 EQ tests are usually false and NE tests are usually true. Also,
2291 most quantities are positive, so we can make the appropriate guesses
2292 about signed comparisons against zero. */
2293 switch (GET_CODE (cond
))
2296 /* Unconditional branch. */
2297 predict_insn_def (last_insn
, PRED_UNCONDITIONAL
,
2298 cond
== const0_rtx
? NOT_TAKEN
: TAKEN
);
2303 /* Floating point comparisons appears to behave in a very
2304 unpredictable way because of special role of = tests in
2306 if (FLOAT_MODE_P (GET_MODE (XEXP (cond
, 0))))
2308 /* Comparisons with 0 are often used for booleans and there is
2309 nothing useful to predict about them. */
2310 else if (XEXP (cond
, 1) == const0_rtx
2311 || XEXP (cond
, 0) == const0_rtx
)
2314 predict_insn_def (last_insn
, PRED_OPCODE_NONEQUAL
, NOT_TAKEN
);
2319 /* Floating point comparisons appears to behave in a very
2320 unpredictable way because of special role of = tests in
2322 if (FLOAT_MODE_P (GET_MODE (XEXP (cond
, 0))))
2324 /* Comparisons with 0 are often used for booleans and there is
2325 nothing useful to predict about them. */
2326 else if (XEXP (cond
, 1) == const0_rtx
2327 || XEXP (cond
, 0) == const0_rtx
)
2330 predict_insn_def (last_insn
, PRED_OPCODE_NONEQUAL
, TAKEN
);
2334 predict_insn_def (last_insn
, PRED_FPOPCODE
, TAKEN
);
2338 predict_insn_def (last_insn
, PRED_FPOPCODE
, NOT_TAKEN
);
2343 if (XEXP (cond
, 1) == const0_rtx
|| XEXP (cond
, 1) == const1_rtx
2344 || XEXP (cond
, 1) == constm1_rtx
)
2345 predict_insn_def (last_insn
, PRED_OPCODE_POSITIVE
, NOT_TAKEN
);
2350 if (XEXP (cond
, 1) == const0_rtx
|| XEXP (cond
, 1) == const1_rtx
2351 || XEXP (cond
, 1) == constm1_rtx
)
2352 predict_insn_def (last_insn
, PRED_OPCODE_POSITIVE
, TAKEN
);
2360 /* Set edge->probability for each successor edge of BB. */
2362 guess_outgoing_edge_probabilities (basic_block bb
)
2364 bb_estimate_probability_locally (bb
);
2365 combine_predictions_for_insn (BB_END (bb
), bb
);
2368 static tree
expr_expected_value (tree
, enum br_predictor
*predictor
,
2369 HOST_WIDE_INT
*probability
);
2371 /* Helper function for expr_expected_value. */
2374 expr_expected_value_1 (tree type
, tree op0
, enum tree_code code
,
2375 tree op1
, enum br_predictor
*predictor
,
2376 HOST_WIDE_INT
*probability
)
2380 /* Reset returned probability value. */
2382 *predictor
= PRED_UNCONDITIONAL
;
2384 if (get_gimple_rhs_class (code
) == GIMPLE_SINGLE_RHS
)
2386 if (TREE_CONSTANT (op0
))
2389 if (code
== IMAGPART_EXPR
)
2391 if (TREE_CODE (TREE_OPERAND (op0
, 0)) == SSA_NAME
)
2393 def
= SSA_NAME_DEF_STMT (TREE_OPERAND (op0
, 0));
2394 if (is_gimple_call (def
)
2395 && gimple_call_internal_p (def
)
2396 && (gimple_call_internal_fn (def
)
2397 == IFN_ATOMIC_COMPARE_EXCHANGE
))
2399 /* Assume that any given atomic operation has low contention,
2400 and thus the compare-and-swap operation succeeds. */
2401 *predictor
= PRED_COMPARE_AND_SWAP
;
2402 return build_one_cst (TREE_TYPE (op0
));
2407 if (code
!= SSA_NAME
)
2410 def
= SSA_NAME_DEF_STMT (op0
);
2412 /* If we were already here, break the infinite cycle. */
2415 = &ssa_expected_value
->get_or_insert (SSA_NAME_VERSION (op0
),
2419 *probability
= res
->probability
;
2420 *predictor
= res
->predictor
;
2423 res
->val
= NULL_TREE
;
2424 res
->predictor
= *predictor
;
2425 res
->probability
= *probability
;
2427 if (gphi
*phi
= dyn_cast
<gphi
*> (def
))
2429 /* All the arguments of the PHI node must have the same constant
2431 int i
, n
= gimple_phi_num_args (phi
);
2433 bool has_nonzero_edge
= false;
2435 /* If we already proved that given edge is unlikely, we do not need
2436 to handle merging of the probabilities. */
2437 for (i
= 0; i
< n
&& !has_nonzero_edge
; i
++)
2439 tree arg
= PHI_ARG_DEF (phi
, i
);
2440 if (arg
== PHI_RESULT (phi
))
2442 profile_count cnt
= gimple_phi_arg_edge (phi
, i
)->count ();
2443 if (!cnt
.initialized_p () || cnt
.nonzero_p ())
2444 has_nonzero_edge
= true;
2447 for (i
= 0; i
< n
; i
++)
2449 tree arg
= PHI_ARG_DEF (phi
, i
);
2450 enum br_predictor predictor2
;
2452 /* Skip self-referring parameters, since they does not change
2454 if (arg
== PHI_RESULT (phi
))
2457 /* Skip edges which we already predicted as executing
2459 if (has_nonzero_edge
)
2461 profile_count cnt
= gimple_phi_arg_edge (phi
, i
)->count ();
2462 if (cnt
.initialized_p () && !cnt
.nonzero_p ())
2465 HOST_WIDE_INT probability2
;
2466 tree new_val
= expr_expected_value (arg
, &predictor2
,
2468 /* If we know nothing about value, give up. */
2472 /* If this is a first edge, trust its prediction. */
2476 *predictor
= predictor2
;
2477 *probability
= probability2
;
2480 /* If there are two different values, give up. */
2481 if (!operand_equal_p (val
, new_val
, false))
2484 int p1
= get_predictor_value (*predictor
, *probability
);
2485 int p2
= get_predictor_value (predictor2
, probability2
);
2486 /* If both predictors agree, it does not matter from which
2487 edge we enter the basic block. */
2488 if (*predictor
== predictor2
&& p1
== p2
)
2490 /* The general case has no precise solution, since we do not
2491 know probabilities of incomming edges, yet.
2492 Still if value is predicted over all incomming edges, we
2493 can hope it will be indeed the case. Conservatively
2494 downgrade prediction quality (so first match merging is not
2495 performed) and take least successful prediction. */
2497 *predictor
= PRED_COMBINED_VALUE_PREDICTIONS_PHI
;
2498 *probability
= MIN (p1
, p2
);
2501 res
= ssa_expected_value
->get (SSA_NAME_VERSION (op0
));
2503 res
->predictor
= *predictor
;
2504 res
->probability
= *probability
;
2507 if (is_gimple_assign (def
))
2509 if (gimple_assign_lhs (def
) != op0
)
2512 tree val
= expr_expected_value_1 (TREE_TYPE (gimple_assign_lhs (def
)),
2513 gimple_assign_rhs1 (def
),
2514 gimple_assign_rhs_code (def
),
2515 gimple_assign_rhs2 (def
),
2516 predictor
, probability
);
2519 res
= ssa_expected_value
->get (SSA_NAME_VERSION (op0
));
2521 res
->predictor
= *predictor
;
2522 res
->probability
= *probability
;
2527 if (is_gimple_call (def
))
2529 tree decl
= gimple_call_fndecl (def
);
2532 if (gimple_call_internal_p (def
)
2533 && gimple_call_internal_fn (def
) == IFN_BUILTIN_EXPECT
)
2535 gcc_assert (gimple_call_num_args (def
) == 3);
2536 tree val
= gimple_call_arg (def
, 0);
2537 if (TREE_CONSTANT (val
))
2539 tree val2
= gimple_call_arg (def
, 2);
2540 gcc_assert (TREE_CODE (val2
) == INTEGER_CST
2541 && tree_fits_uhwi_p (val2
)
2542 && tree_to_uhwi (val2
) < END_PREDICTORS
);
2543 *predictor
= (enum br_predictor
) tree_to_uhwi (val2
);
2544 if (*predictor
== PRED_BUILTIN_EXPECT
)
2546 = HITRATE (param_builtin_expect_probability
);
2547 val
= gimple_call_arg (def
, 1);
2549 res
->predictor
= *predictor
;
2550 res
->probability
= *probability
;
2556 if (DECL_IS_MALLOC (decl
) || DECL_IS_OPERATOR_NEW_P (decl
))
2559 *predictor
= PRED_MALLOC_NONNULL
;
2560 /* FIXME: This is wrong and we need to convert the logic
2561 to value ranges. This makes predictor to assume that
2562 malloc always returns (size_t)1 which is not the same
2563 as returning non-NULL. */
2564 tree val
= fold_convert (type
, boolean_true_node
);
2566 res
->predictor
= *predictor
;
2567 res
->probability
= *probability
;
2571 if (DECL_BUILT_IN_CLASS (decl
) == BUILT_IN_NORMAL
)
2572 switch (DECL_FUNCTION_CODE (decl
))
2574 case BUILT_IN_EXPECT
:
2577 if (gimple_call_num_args (def
) != 2)
2579 val
= gimple_call_arg (def
, 0);
2580 if (TREE_CONSTANT (val
))
2582 *predictor
= PRED_BUILTIN_EXPECT
;
2584 = HITRATE (param_builtin_expect_probability
);
2585 val
= gimple_call_arg (def
, 1);
2587 res
->predictor
= *predictor
;
2588 res
->probability
= *probability
;
2591 case BUILT_IN_EXPECT_WITH_PROBABILITY
:
2594 if (gimple_call_num_args (def
) != 3)
2596 val
= gimple_call_arg (def
, 0);
2597 if (TREE_CONSTANT (val
))
2600 res
->predictor
= *predictor
;
2601 res
->probability
= *probability
;
2604 /* Compute final probability as:
2605 probability * REG_BR_PROB_BASE. */
2606 tree prob
= gimple_call_arg (def
, 2);
2607 tree t
= TREE_TYPE (prob
);
2608 tree base
= build_int_cst (integer_type_node
,
2610 base
= build_real_from_int_cst (t
, base
);
2611 tree r
= fold_build2_initializer_loc (UNKNOWN_LOCATION
,
2612 MULT_EXPR
, t
, prob
, base
);
2613 if (TREE_CODE (r
) != REAL_CST
)
2615 error_at (gimple_location (def
),
2616 "probability %qE must be "
2617 "constant floating-point expression", prob
);
2621 = real_to_integer (TREE_REAL_CST_PTR (r
));
2622 if (probi
>= 0 && probi
<= REG_BR_PROB_BASE
)
2624 *predictor
= PRED_BUILTIN_EXPECT_WITH_PROBABILITY
;
2625 *probability
= probi
;
2628 error_at (gimple_location (def
),
2629 "probability %qE is outside "
2630 "the range [0.0, 1.0]", prob
);
2632 val
= gimple_call_arg (def
, 1);
2634 res
->predictor
= *predictor
;
2635 res
->probability
= *probability
;
2639 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_N
:
2640 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1
:
2641 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2
:
2642 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4
:
2643 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8
:
2644 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16
:
2645 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE
:
2646 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_N
:
2647 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1
:
2648 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2
:
2649 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4
:
2650 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8
:
2651 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16
:
2652 /* Assume that any given atomic operation has low contention,
2653 and thus the compare-and-swap operation succeeds. */
2654 *predictor
= PRED_COMPARE_AND_SWAP
;
2655 res
->val
= boolean_true_node
;
2656 res
->predictor
= *predictor
;
2657 res
->probability
= *probability
;
2658 return boolean_true_node
;
2659 case BUILT_IN_REALLOC
:
2660 case BUILT_IN_GOMP_REALLOC
:
2662 *predictor
= PRED_MALLOC_NONNULL
;
2663 /* FIXME: This is wrong and we need to convert the logic
2665 res
->val
= fold_convert (type
, boolean_true_node
);
2666 res
->predictor
= *predictor
;
2667 res
->probability
= *probability
;
2677 if (get_gimple_rhs_class (code
) == GIMPLE_BINARY_RHS
)
2683 /* First handle situation where single op is enough to determine final
2684 value. In this case we can do better job by avoiding the prediction
2686 if (TREE_CODE (op0
) != INTEGER_CST
)
2688 /* See if expected value of op0 is good enough to determine the result. */
2689 nop0
= expr_expected_value (op0
, predictor
, probability
);
2691 && (res
= fold_build2 (code
, type
, nop0
, op1
)) != NULL
2692 && TREE_CODE (res
) == INTEGER_CST
)
2693 /* We are now getting conservative probability. Consider for
2696 If op0 is 0 with probability p, then we will ignore the
2697 posibility that op0 != 0 and op1 == 0. It does not seem to be
2698 worthwhile to downgrade prediciton quality for this. */
2703 enum br_predictor predictor2
= PRED_UNCONDITIONAL
;
2704 HOST_WIDE_INT probability2
= -1;
2705 if (TREE_CODE (op1
) != INTEGER_CST
)
2707 /* See if expected value of op1 is good enough to determine the result. */
2708 nop1
= expr_expected_value (op1
, &predictor2
, &probability2
);
2710 && (res
= fold_build2 (code
, type
, op0
, nop1
)) != NULL
2711 && TREE_CODE (res
) == INTEGER_CST
)
2713 /* Similarly as above we now get conservative probability. */
2714 *predictor
= predictor2
;
2715 *probability
= probability2
;
2721 /* We already checked if folding one of arguments to constant is good
2722 enough. Consequently failing to fold both means that we will not
2723 succeed determining the value. */
2724 if (nop0
== op0
|| nop1
== op1
)
2726 /* Finally see if we have two known values. */
2727 res
= fold_build2 (code
, type
, nop0
, nop1
);
2728 if (TREE_CODE (res
) == INTEGER_CST
)
2730 HOST_WIDE_INT p1
= get_predictor_value (*predictor
, *probability
);
2731 HOST_WIDE_INT p2
= get_predictor_value (predictor2
, probability2
);
2733 /* If one of predictions is sure, such as PRED_UNCONDITIONAL, we
2735 if (p2
== PROB_ALWAYS
)
2737 if (p1
== PROB_ALWAYS
)
2739 *predictor
= predictor2
;
2740 *probability
= probability2
;
2743 /* Combine binary predictions.
2744 Since we do not know about independence of predictors, we
2745 can not determine value precisely. */
2746 *probability
= RDIV (p1
* p2
, REG_BR_PROB_BASE
);
2747 /* If we no longer track useful information, give up. */
2750 /* Otherwise mark that prediction is a result of combining
2751 different heuristics, since we do not want it to participate
2752 in first match merging. It is no longer reliable since
2753 we do not know if the probabilities are indpenendet. */
2754 *predictor
= PRED_COMBINED_VALUE_PREDICTIONS
;
2760 if (get_gimple_rhs_class (code
) == GIMPLE_UNARY_RHS
)
2763 op0
= expr_expected_value (op0
, predictor
, probability
);
2766 res
= fold_build1 (code
, type
, op0
);
2767 if (TREE_CONSTANT (res
))
2774 /* Return constant EXPR will likely have at execution time, NULL if unknown.
2775 The function is used by builtin_expect branch predictor so the evidence
2776 must come from this construct and additional possible constant folding.
2778 We may want to implement more involved value guess (such as value range
2779 propagation based prediction), but such tricks shall go to new
2783 expr_expected_value (tree expr
, enum br_predictor
*predictor
,
2784 HOST_WIDE_INT
*probability
)
2786 enum tree_code code
;
2789 if (TREE_CONSTANT (expr
))
2791 *predictor
= PRED_UNCONDITIONAL
;
2796 extract_ops_from_tree (expr
, &code
, &op0
, &op1
);
2797 return expr_expected_value_1 (TREE_TYPE (expr
),
2798 op0
, code
, op1
, predictor
, probability
);
2802 /* Return probability of a PREDICTOR. If the predictor has variable
2803 probability return passed PROBABILITY. */
2805 static HOST_WIDE_INT
2806 get_predictor_value (br_predictor predictor
, HOST_WIDE_INT probability
)
2810 case PRED_BUILTIN_EXPECT
:
2811 case PRED_BUILTIN_EXPECT_WITH_PROBABILITY
:
2812 case PRED_COMBINED_VALUE_PREDICTIONS_PHI
:
2813 case PRED_COMBINED_VALUE_PREDICTIONS
:
2814 gcc_assert (probability
!= -1);
2817 gcc_assert (probability
== -1);
2818 return predictor_info
[(int) predictor
].hitrate
;
2822 /* Predict using opcode of the last statement in basic block. */
2824 tree_predict_by_opcode (basic_block bb
)
2832 enum br_predictor predictor
;
2833 HOST_WIDE_INT probability
;
2835 gimple
*stmt
= *gsi_last_bb (bb
);
2839 if (gswitch
*sw
= dyn_cast
<gswitch
*> (stmt
))
2841 tree index
= gimple_switch_index (sw
);
2842 tree val
= expr_expected_value (index
, &predictor
, &probability
);
2843 if (val
&& TREE_CODE (val
) == INTEGER_CST
)
2845 edge e
= find_taken_edge_switch_expr (sw
, val
);
2846 if (predictor
== PRED_BUILTIN_EXPECT
)
2848 int percent
= param_builtin_expect_probability
;
2849 gcc_assert (percent
>= 0 && percent
<= 100);
2850 predict_edge (e
, PRED_BUILTIN_EXPECT
,
2854 predict_edge_def (e
, predictor
, TAKEN
);
2858 if (gimple_code (stmt
) != GIMPLE_COND
)
2860 FOR_EACH_EDGE (then_edge
, ei
, bb
->succs
)
2861 if (then_edge
->flags
& EDGE_TRUE_VALUE
)
2863 op0
= gimple_cond_lhs (stmt
);
2864 op1
= gimple_cond_rhs (stmt
);
2865 cmp
= gimple_cond_code (stmt
);
2866 type
= TREE_TYPE (op0
);
2867 val
= expr_expected_value_1 (boolean_type_node
, op0
, cmp
, op1
,
2868 &predictor
, &probability
);
2869 if (val
&& TREE_CODE (val
) == INTEGER_CST
)
2871 HOST_WIDE_INT prob
= get_predictor_value (predictor
, probability
);
2872 if (integer_zerop (val
))
2873 prob
= REG_BR_PROB_BASE
- prob
;
2874 predict_edge (then_edge
, predictor
, prob
);
2876 /* Try "pointer heuristic."
2877 A comparison ptr == 0 is predicted as false.
2878 Similarly, a comparison ptr1 == ptr2 is predicted as false. */
2879 if (POINTER_TYPE_P (type
))
2882 predict_edge_def (then_edge
, PRED_TREE_POINTER
, NOT_TAKEN
);
2883 else if (cmp
== NE_EXPR
)
2884 predict_edge_def (then_edge
, PRED_TREE_POINTER
, TAKEN
);
2888 /* Try "opcode heuristic."
2889 EQ tests are usually false and NE tests are usually true. Also,
2890 most quantities are positive, so we can make the appropriate guesses
2891 about signed comparisons against zero. */
2896 /* Floating point comparisons appears to behave in a very
2897 unpredictable way because of special role of = tests in
2899 if (FLOAT_TYPE_P (type
))
2901 /* Comparisons with 0 are often used for booleans and there is
2902 nothing useful to predict about them. */
2903 else if (integer_zerop (op0
) || integer_zerop (op1
))
2906 predict_edge_def (then_edge
, PRED_TREE_OPCODE_NONEQUAL
, NOT_TAKEN
);
2911 /* Floating point comparisons appears to behave in a very
2912 unpredictable way because of special role of = tests in
2914 if (FLOAT_TYPE_P (type
))
2916 /* Comparisons with 0 are often used for booleans and there is
2917 nothing useful to predict about them. */
2918 else if (integer_zerop (op0
)
2919 || integer_zerop (op1
))
2922 predict_edge_def (then_edge
, PRED_TREE_OPCODE_NONEQUAL
, TAKEN
);
2926 predict_edge_def (then_edge
, PRED_TREE_FPOPCODE
, TAKEN
);
2929 case UNORDERED_EXPR
:
2930 predict_edge_def (then_edge
, PRED_TREE_FPOPCODE
, NOT_TAKEN
);
2935 if (integer_zerop (op1
)
2936 || integer_onep (op1
)
2937 || integer_all_onesp (op1
)
2940 || real_minus_onep (op1
))
2941 predict_edge_def (then_edge
, PRED_TREE_OPCODE_POSITIVE
, NOT_TAKEN
);
2946 if (integer_zerop (op1
)
2947 || integer_onep (op1
)
2948 || integer_all_onesp (op1
)
2951 || real_minus_onep (op1
))
2952 predict_edge_def (then_edge
, PRED_TREE_OPCODE_POSITIVE
, TAKEN
);
2960 /* Returns TRUE if the STMT is exit(0) like statement. */
2963 is_exit_with_zero_arg (const gimple
*stmt
)
2965 /* This is not exit, _exit or _Exit. */
2966 if (!gimple_call_builtin_p (stmt
, BUILT_IN_EXIT
)
2967 && !gimple_call_builtin_p (stmt
, BUILT_IN__EXIT
)
2968 && !gimple_call_builtin_p (stmt
, BUILT_IN__EXIT2
))
2971 /* Argument is an interger zero. */
2972 return integer_zerop (gimple_call_arg (stmt
, 0));
2975 /* Try to guess whether the value of return means error code. */
2977 static enum br_predictor
2978 return_prediction (tree val
, enum prediction
*prediction
)
2982 return PRED_NO_PREDICTION
;
2983 /* Different heuristics for pointers and scalars. */
2984 if (POINTER_TYPE_P (TREE_TYPE (val
)))
2986 /* NULL is usually not returned. */
2987 if (integer_zerop (val
))
2989 *prediction
= NOT_TAKEN
;
2990 return PRED_NULL_RETURN
;
2993 else if (INTEGRAL_TYPE_P (TREE_TYPE (val
)))
2995 /* Negative return values are often used to indicate
2997 if (TREE_CODE (val
) == INTEGER_CST
2998 && tree_int_cst_sgn (val
) < 0)
3000 *prediction
= NOT_TAKEN
;
3001 return PRED_NEGATIVE_RETURN
;
3003 /* Constant return values seems to be commonly taken.
3004 Zero/one often represent booleans so exclude them from the
3006 if (TREE_CONSTANT (val
)
3007 && (!integer_zerop (val
) && !integer_onep (val
)))
3009 *prediction
= NOT_TAKEN
;
3010 return PRED_CONST_RETURN
;
3013 return PRED_NO_PREDICTION
;
3016 /* Return zero if phi result could have values other than -1, 0 or 1,
3017 otherwise return a bitmask, with bits 0, 1 and 2 set if -1, 0 and 1
3018 values are used or likely. */
3021 zero_one_minusone (gphi
*phi
, int limit
)
3023 int phi_num_args
= gimple_phi_num_args (phi
);
3025 for (int i
= 0; i
< phi_num_args
; i
++)
3027 tree t
= PHI_ARG_DEF (phi
, i
);
3028 if (TREE_CODE (t
) != INTEGER_CST
)
3030 wide_int w
= wi::to_wide (t
);
3040 for (int i
= 0; i
< phi_num_args
; i
++)
3042 tree t
= PHI_ARG_DEF (phi
, i
);
3043 if (TREE_CODE (t
) == INTEGER_CST
)
3045 if (TREE_CODE (t
) != SSA_NAME
)
3047 gimple
*g
= SSA_NAME_DEF_STMT (t
);
3048 if (gimple_code (g
) == GIMPLE_PHI
&& limit
> 0)
3049 if (int r
= zero_one_minusone (as_a
<gphi
*> (g
), limit
- 1))
3054 if (!is_gimple_assign (g
))
3056 if (gimple_assign_cast_p (g
))
3058 tree rhs1
= gimple_assign_rhs1 (g
);
3059 if (TREE_CODE (rhs1
) != SSA_NAME
3060 || !INTEGRAL_TYPE_P (TREE_TYPE (rhs1
))
3061 || TYPE_PRECISION (TREE_TYPE (rhs1
)) != 1
3062 || !TYPE_UNSIGNED (TREE_TYPE (rhs1
)))
3067 if (TREE_CODE_CLASS (gimple_assign_rhs_code (g
)) != tcc_comparison
)
3074 /* Find the basic block with return expression and look up for possible
3075 return value trying to apply RETURN_PREDICTION heuristics. */
3077 apply_return_prediction (void)
3079 greturn
*return_stmt
= NULL
;
3083 int phi_num_args
, i
;
3084 enum br_predictor pred
;
3085 enum prediction direction
;
3088 FOR_EACH_EDGE (e
, ei
, EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
)
3090 if (greturn
*last
= safe_dyn_cast
<greturn
*> (*gsi_last_bb (e
->src
)))
3098 return_val
= gimple_return_retval (return_stmt
);
3101 if (TREE_CODE (return_val
) != SSA_NAME
3102 || !SSA_NAME_DEF_STMT (return_val
)
3103 || gimple_code (SSA_NAME_DEF_STMT (return_val
)) != GIMPLE_PHI
)
3105 phi
= as_a
<gphi
*> (SSA_NAME_DEF_STMT (return_val
));
3106 phi_num_args
= gimple_phi_num_args (phi
);
3107 pred
= return_prediction (PHI_ARG_DEF (phi
, 0), &direction
);
3109 /* Avoid the case where the function returns -1, 0 and 1 values and
3110 nothing else. Those could be qsort etc. comparison functions
3111 where the negative return isn't less probable than positive.
3112 For this require that the function returns at least -1 or 1
3113 or -1 and a boolean value or comparison result, so that functions
3114 returning just -1 and 0 are treated as if -1 represents error value. */
3115 if (INTEGRAL_TYPE_P (TREE_TYPE (return_val
))
3116 && !TYPE_UNSIGNED (TREE_TYPE (return_val
))
3117 && TYPE_PRECISION (TREE_TYPE (return_val
)) > 1)
3118 if (int r
= zero_one_minusone (phi
, 3))
3119 if ((r
& (1 | 4)) == (1 | 4))
3122 /* Avoid the degenerate case where all return values form the function
3123 belongs to same category (ie they are all positive constants)
3124 so we can hardly say something about them. */
3125 for (i
= 1; i
< phi_num_args
; i
++)
3126 if (pred
!= return_prediction (PHI_ARG_DEF (phi
, i
), &direction
))
3128 if (i
!= phi_num_args
)
3129 for (i
= 0; i
< phi_num_args
; i
++)
3131 pred
= return_prediction (PHI_ARG_DEF (phi
, i
), &direction
);
3132 if (pred
!= PRED_NO_PREDICTION
)
3133 predict_paths_leading_to_edge (gimple_phi_arg_edge (phi
, i
), pred
,
3138 /* Look for basic block that contains unlikely to happen events
3139 (such as noreturn calls) and mark all paths leading to execution
3140 of this basic blocks as unlikely. */
3143 tree_bb_level_predictions (void)
3146 bool has_return_edges
= false;
3150 FOR_EACH_EDGE (e
, ei
, EXIT_BLOCK_PTR_FOR_FN (cfun
)->preds
)
3151 if (!unlikely_executed_edge_p (e
) && !(e
->flags
& EDGE_ABNORMAL_CALL
))
3153 has_return_edges
= true;
3157 apply_return_prediction ();
3159 FOR_EACH_BB_FN (bb
, cfun
)
3161 gimple_stmt_iterator gsi
;
3163 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
3165 gimple
*stmt
= gsi_stmt (gsi
);
3168 if (is_gimple_call (stmt
))
3170 if (gimple_call_noreturn_p (stmt
)
3172 && !is_exit_with_zero_arg (stmt
))
3173 predict_paths_leading_to (bb
, PRED_NORETURN
,
3175 decl
= gimple_call_fndecl (stmt
);
3177 && lookup_attribute ("cold",
3178 DECL_ATTRIBUTES (decl
)))
3179 predict_paths_leading_to (bb
, PRED_COLD_FUNCTION
,
3181 if (decl
&& recursive_call_p (current_function_decl
, decl
))
3182 predict_paths_leading_to (bb
, PRED_RECURSIVE_CALL
,
3185 else if (gimple_code (stmt
) == GIMPLE_PREDICT
)
3187 predict_paths_leading_to (bb
, gimple_predict_predictor (stmt
),
3188 gimple_predict_outcome (stmt
));
3189 /* Keep GIMPLE_PREDICT around so early inlining will propagate
3190 hints to callers. */
3196 /* Callback for hash_map::traverse, asserts that the pointer map is
3200 assert_is_empty (const_basic_block
const &, edge_prediction
*const &value
,
3203 gcc_assert (!value
);
3207 /* Predict branch probabilities and estimate profile for basic block BB.
3208 When LOCAL_ONLY is set do not use any global properties of CFG. */
3211 tree_estimate_probability_bb (basic_block bb
, bool local_only
)
3216 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3218 /* Look for block we are guarding (ie we dominate it,
3219 but it doesn't postdominate us). */
3220 if (e
->dest
!= EXIT_BLOCK_PTR_FOR_FN (cfun
) && e
->dest
!= bb
3222 && dominated_by_p (CDI_DOMINATORS
, e
->dest
, e
->src
)
3223 && !dominated_by_p (CDI_POST_DOMINATORS
, e
->src
, e
->dest
))
3225 gimple_stmt_iterator bi
;
3227 /* The call heuristic claims that a guarded function call
3228 is improbable. This is because such calls are often used
3229 to signal exceptional situations such as printing error
3231 for (bi
= gsi_start_bb (e
->dest
); !gsi_end_p (bi
);
3234 gimple
*stmt
= gsi_stmt (bi
);
3235 if (is_gimple_call (stmt
)
3236 && !gimple_inexpensive_call_p (as_a
<gcall
*> (stmt
))
3237 /* Constant and pure calls are hardly used to signalize
3238 something exceptional. */
3239 && gimple_has_side_effects (stmt
))
3241 if (gimple_call_fndecl (stmt
))
3242 predict_edge_def (e
, PRED_CALL
, NOT_TAKEN
);
3243 else if (virtual_method_call_p (gimple_call_fn (stmt
)))
3244 predict_edge_def (e
, PRED_POLYMORPHIC_CALL
, NOT_TAKEN
);
3246 predict_edge_def (e
, PRED_INDIR_CALL
, TAKEN
);
3252 tree_predict_by_opcode (bb
);
3255 /* Predict branch probabilities and estimate profile of the tree CFG.
3256 This function can be called from the loop optimizers to recompute
3257 the profile information.
3258 If DRY_RUN is set, do not modify CFG and only produce dump files. */
3261 tree_estimate_probability (bool dry_run
)
3265 connect_infinite_loops_to_exit ();
3266 /* We use loop_niter_by_eval, which requires that the loops have
3268 create_preheaders (CP_SIMPLE_PREHEADERS
);
3269 calculate_dominance_info (CDI_POST_DOMINATORS
);
3270 /* Decide which edges are known to be unlikely. This improves later
3271 branch prediction. */
3272 determine_unlikely_bbs ();
3274 bb_predictions
= new hash_map
<const_basic_block
, edge_prediction
*>;
3275 ssa_expected_value
= new hash_map
<int_hash
<unsigned, 0>, expected_value
>;
3277 tree_bb_level_predictions ();
3278 record_loop_exits ();
3280 if (number_of_loops (cfun
) > 1)
3283 FOR_EACH_BB_FN (bb
, cfun
)
3284 tree_estimate_probability_bb (bb
, false);
3286 FOR_EACH_BB_FN (bb
, cfun
)
3287 combine_predictions_for_bb (bb
, dry_run
);
3290 bb_predictions
->traverse
<void *, assert_is_empty
> (NULL
);
3292 delete bb_predictions
;
3293 bb_predictions
= NULL
;
3294 delete ssa_expected_value
;
3295 ssa_expected_value
= NULL
;
3298 && profile_status_for_fn (cfun
) != PROFILE_READ
)
3299 estimate_bb_frequencies ();
3300 free_dominance_info (CDI_POST_DOMINATORS
);
3301 remove_fake_exit_edges ();
3304 /* Set edge->probability for each successor edge of BB. */
3306 tree_guess_outgoing_edge_probabilities (basic_block bb
)
3308 bb_predictions
= new hash_map
<const_basic_block
, edge_prediction
*>;
3309 ssa_expected_value
= new hash_map
<int_hash
<unsigned, 0>, expected_value
>;
3310 tree_estimate_probability_bb (bb
, true);
3311 combine_predictions_for_bb (bb
, false);
3313 bb_predictions
->traverse
<void *, assert_is_empty
> (NULL
);
3314 delete bb_predictions
;
3315 bb_predictions
= NULL
;
3316 delete ssa_expected_value
;
3317 ssa_expected_value
= NULL
;
3320 /* Filter function predicate that returns true for a edge predicate P
3321 if its edge is equal to DATA. */
3324 not_loop_guard_equal_edge_p (edge_prediction
*p
, void *data
)
3326 return p
->ep_edge
!= (edge
)data
|| p
->ep_predictor
!= PRED_LOOP_GUARD
;
3329 /* Predict edge E with PRED unless it is already predicted by some predictor
3330 considered equivalent. */
3333 maybe_predict_edge (edge e
, enum br_predictor pred
, enum prediction taken
)
3335 if (edge_predicted_by_p (e
, pred
, taken
))
3337 if (pred
== PRED_LOOP_GUARD
3338 && edge_predicted_by_p (e
, PRED_LOOP_GUARD_WITH_RECURSION
, taken
))
3340 /* Consider PRED_LOOP_GUARD_WITH_RECURSION superrior to LOOP_GUARD. */
3341 if (pred
== PRED_LOOP_GUARD_WITH_RECURSION
)
3343 edge_prediction
**preds
= bb_predictions
->get (e
->src
);
3345 filter_predictions (preds
, not_loop_guard_equal_edge_p
, e
);
3347 predict_edge_def (e
, pred
, taken
);
3349 /* Predict edges to successors of CUR whose sources are not postdominated by
3350 BB by PRED and recurse to all postdominators. */
3353 predict_paths_for_bb (basic_block cur
, basic_block bb
,
3354 enum br_predictor pred
,
3355 enum prediction taken
,
3356 bitmap visited
, class loop
*in_loop
= NULL
)
3362 /* If we exited the loop or CUR is unconditional in the loop, there is
3365 && (!flow_bb_inside_loop_p (in_loop
, cur
)
3366 || dominated_by_p (CDI_DOMINATORS
, in_loop
->latch
, cur
)))
3369 /* We are looking for all edges forming edge cut induced by
3370 set of all blocks postdominated by BB. */
3371 FOR_EACH_EDGE (e
, ei
, cur
->preds
)
3372 if (e
->src
->index
>= NUM_FIXED_BLOCKS
3373 && !dominated_by_p (CDI_POST_DOMINATORS
, e
->src
, bb
))
3379 /* Ignore fake edges and eh, we predict them as not taken anyway. */
3380 if (unlikely_executed_edge_p (e
))
3382 gcc_assert (bb
== cur
|| dominated_by_p (CDI_POST_DOMINATORS
, cur
, bb
));
3384 /* See if there is an edge from e->src that is not abnormal
3385 and does not lead to BB and does not exit the loop. */
3386 FOR_EACH_EDGE (e2
, ei2
, e
->src
->succs
)
3388 && !unlikely_executed_edge_p (e2
)
3389 && !dominated_by_p (CDI_POST_DOMINATORS
, e2
->dest
, bb
)
3390 && (!in_loop
|| !loop_exit_edge_p (in_loop
, e2
)))
3396 /* If there is non-abnormal path leaving e->src, predict edge
3397 using predictor. Otherwise we need to look for paths
3400 The second may lead to infinite loop in the case we are predicitng
3401 regions that are only reachable by abnormal edges. We simply
3402 prevent visiting given BB twice. */
3404 maybe_predict_edge (e
, pred
, taken
);
3405 else if (bitmap_set_bit (visited
, e
->src
->index
))
3406 predict_paths_for_bb (e
->src
, e
->src
, pred
, taken
, visited
, in_loop
);
3408 for (son
= first_dom_son (CDI_POST_DOMINATORS
, cur
);
3410 son
= next_dom_son (CDI_POST_DOMINATORS
, son
))
3411 predict_paths_for_bb (son
, bb
, pred
, taken
, visited
, in_loop
);
3414 /* Sets branch probabilities according to PREDiction and
3418 predict_paths_leading_to (basic_block bb
, enum br_predictor pred
,
3419 enum prediction taken
, class loop
*in_loop
)
3421 predict_paths_for_bb (bb
, bb
, pred
, taken
, auto_bitmap (), in_loop
);
3424 /* Like predict_paths_leading_to but take edge instead of basic block. */
3427 predict_paths_leading_to_edge (edge e
, enum br_predictor pred
,
3428 enum prediction taken
, class loop
*in_loop
)
3430 bool has_nonloop_edge
= false;
3434 basic_block bb
= e
->src
;
3435 FOR_EACH_EDGE (e2
, ei
, bb
->succs
)
3436 if (e2
->dest
!= e
->src
&& e2
->dest
!= e
->dest
3437 && !unlikely_executed_edge_p (e2
)
3438 && !dominated_by_p (CDI_POST_DOMINATORS
, e
->src
, e2
->dest
))
3440 has_nonloop_edge
= true;
3444 if (!has_nonloop_edge
)
3445 predict_paths_for_bb (bb
, bb
, pred
, taken
, auto_bitmap (), in_loop
);
3447 maybe_predict_edge (e
, pred
, taken
);
3450 /* This is used to carry information about basic blocks. It is
3451 attached to the AUX field of the standard CFG block. */
3456 /* Estimated frequency of execution of basic_block. */
3459 /* To keep queue of basic blocks to process. */
3462 /* Number of predecessors we need to visit first. */
3466 /* Similar information for edges. */
3467 class edge_prob_info
3470 /* In case edge is a loopback edge, the probability edge will be reached
3471 in case header is. Estimated number of iterations of the loop can be
3472 then computed as 1 / (1 - back_edge_prob). */
3473 sreal back_edge_prob
;
3474 /* True if the edge is a loopback edge in the natural loop. */
3475 unsigned int back_edge
:1;
3478 #define BLOCK_INFO(B) ((block_info *) (B)->aux)
3480 #define EDGE_INFO(E) ((edge_prob_info *) (E)->aux)
3482 /* Helper function for estimate_bb_frequencies.
3483 Propagate the frequencies in blocks marked in
3484 TOVISIT, starting in HEAD. */
3487 propagate_freq (basic_block head
, bitmap tovisit
,
3488 sreal max_cyclic_prob
)
3497 /* For each basic block we need to visit count number of his predecessors
3498 we need to visit first. */
3499 EXECUTE_IF_SET_IN_BITMAP (tovisit
, 0, i
, bi
)
3504 bb
= BASIC_BLOCK_FOR_FN (cfun
, i
);
3506 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
3508 bool visit
= bitmap_bit_p (tovisit
, e
->src
->index
);
3510 if (visit
&& !(e
->flags
& EDGE_DFS_BACK
))
3512 else if (visit
&& dump_file
&& !EDGE_INFO (e
)->back_edge
)
3514 "Irreducible region hit, ignoring edge to %i->%i\n",
3515 e
->src
->index
, bb
->index
);
3517 BLOCK_INFO (bb
)->npredecessors
= count
;
3518 /* When function never returns, we will never process exit block. */
3519 if (!count
&& bb
== EXIT_BLOCK_PTR_FOR_FN (cfun
))
3520 bb
->count
= profile_count::zero ();
3523 BLOCK_INFO (head
)->frequency
= 1;
3525 for (bb
= head
; bb
; bb
= nextbb
)
3528 sreal cyclic_probability
= 0;
3529 sreal frequency
= 0;
3531 nextbb
= BLOCK_INFO (bb
)->next
;
3532 BLOCK_INFO (bb
)->next
= NULL
;
3534 /* Compute frequency of basic block. */
3538 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
3539 gcc_assert (!bitmap_bit_p (tovisit
, e
->src
->index
)
3540 || (e
->flags
& EDGE_DFS_BACK
));
3542 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
3543 if (EDGE_INFO (e
)->back_edge
)
3544 cyclic_probability
+= EDGE_INFO (e
)->back_edge_prob
;
3545 else if (!(e
->flags
& EDGE_DFS_BACK
))
3547 /* FIXME: Graphite is producing edges with no profile. Once
3548 this is fixed, drop this. */
3549 sreal tmp
= e
->probability
.initialized_p () ?
3550 e
->probability
.to_sreal () : 0;
3551 frequency
+= tmp
* BLOCK_INFO (e
->src
)->frequency
;
3554 if (cyclic_probability
== 0)
3556 BLOCK_INFO (bb
)->frequency
= frequency
;
3560 if (cyclic_probability
> max_cyclic_prob
)
3564 "cyclic probability of bb %i is %f (capped to %f)"
3565 "; turning freq %f",
3566 bb
->index
, cyclic_probability
.to_double (),
3567 max_cyclic_prob
.to_double (),
3568 frequency
.to_double ());
3570 cyclic_probability
= max_cyclic_prob
;
3574 "cyclic probability of bb %i is %f; turning freq %f",
3575 bb
->index
, cyclic_probability
.to_double (),
3576 frequency
.to_double ());
3578 BLOCK_INFO (bb
)->frequency
= frequency
3579 / (sreal (1) - cyclic_probability
);
3581 fprintf (dump_file
, " to %f\n",
3582 BLOCK_INFO (bb
)->frequency
.to_double ());
3586 bitmap_clear_bit (tovisit
, bb
->index
);
3588 e
= find_edge (bb
, head
);
3591 /* FIXME: Graphite is producing edges with no profile. Once
3592 this is fixed, drop this. */
3593 sreal tmp
= e
->probability
.initialized_p () ?
3594 e
->probability
.to_sreal () : 0;
3595 EDGE_INFO (e
)->back_edge_prob
= tmp
* BLOCK_INFO (bb
)->frequency
;
3598 /* Propagate to successor blocks. */
3599 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3600 if (!(e
->flags
& EDGE_DFS_BACK
)
3601 && BLOCK_INFO (e
->dest
)->npredecessors
)
3603 BLOCK_INFO (e
->dest
)->npredecessors
--;
3604 if (!BLOCK_INFO (e
->dest
)->npredecessors
)
3609 BLOCK_INFO (last
)->next
= e
->dest
;
3617 /* Estimate frequencies in loops at same nest level. */
3620 estimate_loops_at_level (class loop
*first_loop
, sreal max_cyclic_prob
)
3624 for (loop
= first_loop
; loop
; loop
= loop
->next
)
3629 auto_bitmap tovisit
;
3631 estimate_loops_at_level (loop
->inner
, max_cyclic_prob
);
3633 /* Find current loop back edge and mark it. */
3634 e
= loop_latch_edge (loop
);
3635 EDGE_INFO (e
)->back_edge
= 1;
3637 bbs
= get_loop_body (loop
);
3638 for (i
= 0; i
< loop
->num_nodes
; i
++)
3639 bitmap_set_bit (tovisit
, bbs
[i
]->index
);
3641 propagate_freq (loop
->header
, tovisit
, max_cyclic_prob
);
3645 /* Propagates frequencies through structure of loops. */
3648 estimate_loops (void)
3650 auto_bitmap tovisit
;
3652 sreal max_cyclic_prob
= (sreal
)1
3653 - (sreal
)1 / (param_max_predicted_iterations
+ 1);
3655 /* Start by estimating the frequencies in the loops. */
3656 if (number_of_loops (cfun
) > 1)
3657 estimate_loops_at_level (current_loops
->tree_root
->inner
, max_cyclic_prob
);
3659 /* Now propagate the frequencies through all the blocks. */
3660 FOR_ALL_BB_FN (bb
, cfun
)
3662 bitmap_set_bit (tovisit
, bb
->index
);
3664 propagate_freq (ENTRY_BLOCK_PTR_FOR_FN (cfun
), tovisit
, max_cyclic_prob
);
3667 /* Drop the profile for NODE to guessed, and update its frequency based on
3668 whether it is expected to be hot given the CALL_COUNT. */
3671 drop_profile (struct cgraph_node
*node
, profile_count call_count
)
3673 struct function
*fn
= DECL_STRUCT_FUNCTION (node
->decl
);
3674 /* In the case where this was called by another function with a
3675 dropped profile, call_count will be 0. Since there are no
3676 non-zero call counts to this function, we don't know for sure
3677 whether it is hot, and therefore it will be marked normal below. */
3678 bool hot
= maybe_hot_count_p (NULL
, call_count
);
3682 "Dropping 0 profile for %s. %s based on calls.\n",
3684 hot
? "Function is hot" : "Function is normal");
3685 /* We only expect to miss profiles for functions that are reached
3686 via non-zero call edges in cases where the function may have
3687 been linked from another module or library (COMDATs and extern
3688 templates). See the comments below for handle_missing_profiles.
3689 Also, only warn in cases where the missing counts exceed the
3690 number of training runs. In certain cases with an execv followed
3691 by a no-return call the profile for the no-return call is not
3692 dumped and there can be a mismatch. */
3693 if (!DECL_COMDAT (node
->decl
) && !DECL_EXTERNAL (node
->decl
)
3694 && call_count
> profile_info
->runs
)
3696 if (flag_profile_correction
)
3700 "Missing counts for called function %s\n",
3701 node
->dump_name ());
3704 warning (0, "Missing counts for called function %s",
3705 node
->dump_name ());
3709 if (opt_for_fn (node
->decl
, flag_guess_branch_prob
))
3712 = !ENTRY_BLOCK_PTR_FOR_FN (fn
)->count
.nonzero_p ();
3713 FOR_ALL_BB_FN (bb
, fn
)
3714 if (clear_zeros
|| !(bb
->count
== profile_count::zero ()))
3715 bb
->count
= bb
->count
.guessed_local ();
3716 fn
->cfg
->count_max
= fn
->cfg
->count_max
.guessed_local ();
3720 FOR_ALL_BB_FN (bb
, fn
)
3721 bb
->count
= profile_count::uninitialized ();
3722 fn
->cfg
->count_max
= profile_count::uninitialized ();
3725 struct cgraph_edge
*e
;
3726 for (e
= node
->callees
; e
; e
= e
->next_callee
)
3727 e
->count
= gimple_bb (e
->call_stmt
)->count
;
3728 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
3729 e
->count
= gimple_bb (e
->call_stmt
)->count
;
3730 node
->count
= ENTRY_BLOCK_PTR_FOR_FN (fn
)->count
;
3732 profile_status_for_fn (fn
)
3733 = (flag_guess_branch_prob
? PROFILE_GUESSED
: PROFILE_ABSENT
);
3735 = hot
? NODE_FREQUENCY_HOT
: NODE_FREQUENCY_NORMAL
;
3738 /* In the case of COMDAT routines, multiple object files will contain the same
3739 function and the linker will select one for the binary. In that case
3740 all the other copies from the profile instrument binary will be missing
3741 profile counts. Look for cases where this happened, due to non-zero
3742 call counts going to 0-count functions, and drop the profile to guessed
3743 so that we can use the estimated probabilities and avoid optimizing only
3746 The other case where the profile may be missing is when the routine
3747 is not going to be emitted to the object file, e.g. for "extern template"
3748 class methods. Those will be marked DECL_EXTERNAL. Emit a warning in
3749 all other cases of non-zero calls to 0-count functions. */
3752 handle_missing_profiles (void)
3754 const int unlikely_frac
= param_unlikely_bb_count_fraction
;
3755 struct cgraph_node
*node
;
3756 auto_vec
<struct cgraph_node
*, 64> worklist
;
3758 /* See if 0 count function has non-0 count callers. In this case we
3759 lost some profile. Drop its function profile to PROFILE_GUESSED. */
3760 FOR_EACH_DEFINED_FUNCTION (node
)
3762 struct cgraph_edge
*e
;
3763 profile_count call_count
= profile_count::zero ();
3764 gcov_type max_tp_first_run
= 0;
3765 struct function
*fn
= DECL_STRUCT_FUNCTION (node
->decl
);
3767 if (node
->count
.ipa ().nonzero_p ())
3769 for (e
= node
->callers
; e
; e
= e
->next_caller
)
3770 if (e
->count
.ipa ().initialized_p () && e
->count
.ipa () > 0)
3772 call_count
= call_count
+ e
->count
.ipa ();
3774 if (e
->caller
->tp_first_run
> max_tp_first_run
)
3775 max_tp_first_run
= e
->caller
->tp_first_run
;
3778 /* If time profile is missing, let assign the maximum that comes from
3779 caller functions. */
3780 if (!node
->tp_first_run
&& max_tp_first_run
)
3781 node
->tp_first_run
= max_tp_first_run
+ 1;
3785 && call_count
* unlikely_frac
>= profile_info
->runs
)
3787 drop_profile (node
, call_count
);
3788 worklist
.safe_push (node
);
3792 /* Propagate the profile dropping to other 0-count COMDATs that are
3793 potentially called by COMDATs we already dropped the profile on. */
3794 while (worklist
.length () > 0)
3796 struct cgraph_edge
*e
;
3798 node
= worklist
.pop ();
3799 for (e
= node
->callees
; e
; e
= e
->next_caller
)
3801 struct cgraph_node
*callee
= e
->callee
;
3802 struct function
*fn
= DECL_STRUCT_FUNCTION (callee
->decl
);
3804 if (!(e
->count
.ipa () == profile_count::zero ())
3805 && callee
->count
.ipa ().nonzero_p ())
3807 if ((DECL_COMDAT (callee
->decl
) || DECL_EXTERNAL (callee
->decl
))
3809 && profile_status_for_fn (fn
) == PROFILE_READ
)
3811 drop_profile (node
, profile_count::zero ());
3812 worklist
.safe_push (callee
);
3818 /* Convert counts measured by profile driven feedback to frequencies.
3819 Return nonzero iff there was any nonzero execution count. */
3822 update_max_bb_count (void)
3824 profile_count true_count_max
= profile_count::uninitialized ();
3827 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
3828 true_count_max
= true_count_max
.max (bb
->count
);
3830 cfun
->cfg
->count_max
= true_count_max
;
3832 return true_count_max
.ipa ().nonzero_p ();
3835 /* Return true if function is likely to be expensive, so there is no point to
3836 optimize performance of prologue, epilogue or do inlining at the expense
3837 of code size growth. THRESHOLD is the limit of number of instructions
3838 function can execute at average to be still considered not expensive. */
3841 expensive_function_p (int threshold
)
3845 /* If profile was scaled in a way entry block has count 0, then the function
3846 is deifnitly taking a lot of time. */
3847 if (!ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
.nonzero_p ())
3850 profile_count limit
= ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
* threshold
;
3851 profile_count sum
= profile_count::zero ();
3852 FOR_EACH_BB_FN (bb
, cfun
)
3856 if (!bb
->count
.initialized_p ())
3859 fprintf (dump_file
, "Function is considered expensive because"
3860 " count of bb %i is not initialized\n", bb
->index
);
3864 FOR_BB_INSNS (bb
, insn
)
3865 if (active_insn_p (insn
))
3876 /* All basic blocks that are reachable only from unlikely basic blocks are
3880 propagate_unlikely_bbs_forward (void)
3882 auto_vec
<basic_block
, 64> worklist
;
3887 if (!(ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
== profile_count::zero ()))
3889 ENTRY_BLOCK_PTR_FOR_FN (cfun
)->aux
= (void *)(size_t) 1;
3890 worklist
.safe_push (ENTRY_BLOCK_PTR_FOR_FN (cfun
));
3892 while (worklist
.length () > 0)
3894 bb
= worklist
.pop ();
3895 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3896 if (!(e
->count () == profile_count::zero ())
3897 && !(e
->dest
->count
== profile_count::zero ())
3900 e
->dest
->aux
= (void *)(size_t) 1;
3901 worklist
.safe_push (e
->dest
);
3906 FOR_ALL_BB_FN (bb
, cfun
)
3910 if (!(bb
->count
== profile_count::zero ())
3911 && (dump_file
&& (dump_flags
& TDF_DETAILS
)))
3913 "Basic block %i is marked unlikely by forward prop\n",
3915 bb
->count
= profile_count::zero ();
3922 /* Determine basic blocks/edges that are known to be unlikely executed and set
3923 their counters to zero.
3924 This is done with first identifying obviously unlikely BBs/edges and then
3925 propagating in both directions. */
3928 determine_unlikely_bbs ()
3931 auto_vec
<basic_block
, 64> worklist
;
3935 FOR_EACH_BB_FN (bb
, cfun
)
3937 if (!(bb
->count
== profile_count::zero ())
3938 && unlikely_executed_bb_p (bb
))
3940 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3941 fprintf (dump_file
, "Basic block %i is locally unlikely\n",
3943 bb
->count
= profile_count::zero ();
3946 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3947 if (!(e
->probability
== profile_probability::never ())
3948 && unlikely_executed_edge_p (e
))
3950 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3951 fprintf (dump_file
, "Edge %i->%i is locally unlikely\n",
3952 bb
->index
, e
->dest
->index
);
3953 e
->probability
= profile_probability::never ();
3956 gcc_checking_assert (!bb
->aux
);
3958 propagate_unlikely_bbs_forward ();
3960 auto_vec
<int, 64> nsuccs
;
3961 nsuccs
.safe_grow_cleared (last_basic_block_for_fn (cfun
), true);
3962 FOR_ALL_BB_FN (bb
, cfun
)
3963 if (!(bb
->count
== profile_count::zero ())
3964 && bb
!= EXIT_BLOCK_PTR_FOR_FN (cfun
))
3966 nsuccs
[bb
->index
] = 0;
3967 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3968 if (!(e
->probability
== profile_probability::never ())
3969 && !(e
->dest
->count
== profile_count::zero ()))
3970 nsuccs
[bb
->index
]++;
3971 if (!nsuccs
[bb
->index
])
3972 worklist
.safe_push (bb
);
3974 while (worklist
.length () > 0)
3976 bb
= worklist
.pop ();
3977 if (bb
->count
== profile_count::zero ())
3979 if (bb
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
))
3982 for (gimple_stmt_iterator gsi
= gsi_start_bb (bb
);
3983 !gsi_end_p (gsi
); gsi_next (&gsi
))
3984 if (stmt_can_terminate_bb_p (gsi_stmt (gsi
))
3985 /* stmt_can_terminate_bb_p special cases noreturns because it
3986 assumes that fake edges are created. We want to know that
3987 noreturn alone does not imply BB to be unlikely. */
3988 || (is_gimple_call (gsi_stmt (gsi
))
3989 && (gimple_call_flags (gsi_stmt (gsi
)) & ECF_NORETURN
)))
3997 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3999 "Basic block %i is marked unlikely by backward prop\n",
4001 bb
->count
= profile_count::zero ();
4002 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
4003 if (!(e
->probability
== profile_probability::never ()))
4005 if (!(e
->src
->count
== profile_count::zero ()))
4007 gcc_checking_assert (nsuccs
[e
->src
->index
] > 0);
4008 nsuccs
[e
->src
->index
]--;
4009 if (!nsuccs
[e
->src
->index
])
4010 worklist
.safe_push (e
->src
);
4014 /* Finally all edges from non-0 regions to 0 are unlikely. */
4015 FOR_ALL_BB_FN (bb
, cfun
)
4017 if (!(bb
->count
== profile_count::zero ()))
4018 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
4019 if (!(e
->probability
== profile_probability::never ())
4020 && e
->dest
->count
== profile_count::zero ())
4022 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4023 fprintf (dump_file
, "Edge %i->%i is unlikely because "
4024 "it enters unlikely block\n",
4025 bb
->index
, e
->dest
->index
);
4026 e
->probability
= profile_probability::never ();
4031 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
4032 if (e
->probability
== profile_probability::never ())
4042 && !(other
->probability
== profile_probability::always ()))
4044 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4045 fprintf (dump_file
, "Edge %i->%i is locally likely\n",
4046 bb
->index
, other
->dest
->index
);
4047 other
->probability
= profile_probability::always ();
4050 if (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
== profile_count::zero ())
4051 cgraph_node::get (current_function_decl
)->count
= profile_count::zero ();
4054 /* Estimate and propagate basic block frequencies using the given branch
4058 estimate_bb_frequencies ()
4063 determine_unlikely_bbs ();
4065 mark_dfs_back_edges ();
4067 single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (cfun
))->probability
=
4068 profile_probability::always ();
4070 /* Set up block info for each basic block. */
4071 alloc_aux_for_blocks (sizeof (block_info
));
4072 alloc_aux_for_edges (sizeof (edge_prob_info
));
4073 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
4078 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
4080 /* FIXME: Graphite is producing edges with no profile. Once
4081 this is fixed, drop this. */
4082 if (e
->probability
.initialized_p ())
4083 EDGE_INFO (e
)->back_edge_prob
4084 = e
->probability
.to_sreal ();
4086 /* back_edge_prob = 0.5 */
4087 EDGE_INFO (e
)->back_edge_prob
= sreal (1, -1);
4091 /* First compute frequencies locally for each loop from innermost
4092 to outermost to examine frequencies for back edges. */
4096 FOR_EACH_BB_FN (bb
, cfun
)
4097 if (freq_max
< BLOCK_INFO (bb
)->frequency
)
4098 freq_max
= BLOCK_INFO (bb
)->frequency
;
4100 /* Scaling frequencies up to maximal profile count may result in
4101 frequent overflows especially when inlining loops.
4102 Small scaling results in unnecesary precision loss. Stay in
4103 the half of the (exponential) range. */
4104 freq_max
= (sreal (1) << (profile_count::n_bits
/ 2)) / freq_max
;
4107 profile_count ipa_count
= ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
.ipa ();
4108 cfun
->cfg
->count_max
= profile_count::uninitialized ();
4109 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
4111 sreal tmp
= BLOCK_INFO (bb
)->frequency
;
4114 gimple_stmt_iterator gsi
;
4117 /* Self recursive calls can not have frequency greater than 1
4118 or program will never terminate. This will result in an
4119 inconsistent bb profile but it is better than greatly confusing
4120 IPA cost metrics. */
4121 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
4122 if (is_gimple_call (gsi_stmt (gsi
))
4123 && (decl
= gimple_call_fndecl (gsi_stmt (gsi
))) != NULL
4124 && recursive_call_p (current_function_decl
, decl
))
4127 fprintf (dump_file
, "Dropping frequency of recursive call"
4128 " in bb %i from %f\n", bb
->index
,
4130 tmp
= (sreal
)9 / (sreal
)10;
4134 tmp
= tmp
* freq_max
;
4135 profile_count count
= profile_count::from_gcov_type (tmp
.to_nearest_int ());
4137 /* If we have profile feedback in which this function was never
4138 executed, then preserve this info. */
4139 if (!(bb
->count
== profile_count::zero ()))
4140 bb
->count
= count
.guessed_local ().combine_with_ipa_count (ipa_count
);
4141 cfun
->cfg
->count_max
= cfun
->cfg
->count_max
.max (bb
->count
);
4144 free_aux_for_blocks ();
4145 free_aux_for_edges ();
4146 compute_function_frequency ();
4149 /* Decide whether function is hot, cold or unlikely executed. */
4151 compute_function_frequency (void)
4154 struct cgraph_node
*node
= cgraph_node::get (current_function_decl
);
4156 if (DECL_STATIC_CONSTRUCTOR (current_function_decl
)
4157 || MAIN_NAME_P (DECL_NAME (current_function_decl
)))
4158 node
->only_called_at_startup
= true;
4159 if (DECL_STATIC_DESTRUCTOR (current_function_decl
))
4160 node
->only_called_at_exit
= true;
4162 if (!ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
.ipa_p ())
4164 int flags
= flags_from_decl_or_type (current_function_decl
);
4165 if (lookup_attribute ("cold", DECL_ATTRIBUTES (current_function_decl
))
4167 node
->frequency
= NODE_FREQUENCY_UNLIKELY_EXECUTED
;
4168 else if (lookup_attribute ("hot", DECL_ATTRIBUTES (current_function_decl
))
4170 node
->frequency
= NODE_FREQUENCY_HOT
;
4171 else if (flags
& ECF_NORETURN
)
4172 node
->frequency
= NODE_FREQUENCY_EXECUTED_ONCE
;
4173 else if (MAIN_NAME_P (DECL_NAME (current_function_decl
)))
4174 node
->frequency
= NODE_FREQUENCY_EXECUTED_ONCE
;
4175 else if (DECL_STATIC_CONSTRUCTOR (current_function_decl
)
4176 || DECL_STATIC_DESTRUCTOR (current_function_decl
))
4177 node
->frequency
= NODE_FREQUENCY_EXECUTED_ONCE
;
4181 node
->frequency
= NODE_FREQUENCY_UNLIKELY_EXECUTED
;
4182 if (lookup_attribute ("cold", DECL_ATTRIBUTES (current_function_decl
))
4184 warn_function_cold (current_function_decl
);
4185 if (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
.ipa() == profile_count::zero ())
4187 FOR_EACH_BB_FN (bb
, cfun
)
4189 if (maybe_hot_bb_p (cfun
, bb
))
4191 node
->frequency
= NODE_FREQUENCY_HOT
;
4194 if (!probably_never_executed_bb_p (cfun
, bb
))
4195 node
->frequency
= NODE_FREQUENCY_NORMAL
;
4199 /* Build PREDICT_EXPR. */
4201 build_predict_expr (enum br_predictor predictor
, enum prediction taken
)
4203 tree t
= build1 (PREDICT_EXPR
, void_type_node
,
4204 build_int_cst (integer_type_node
, predictor
));
4205 SET_PREDICT_EXPR_OUTCOME (t
, taken
);
4210 predictor_name (enum br_predictor predictor
)
4212 return predictor_info
[predictor
].name
;
4215 /* Predict branch probabilities and estimate profile of the tree CFG. */
4219 const pass_data pass_data_profile
=
4221 GIMPLE_PASS
, /* type */
4222 "profile_estimate", /* name */
4223 OPTGROUP_NONE
, /* optinfo_flags */
4224 TV_BRANCH_PROB
, /* tv_id */
4225 PROP_cfg
, /* properties_required */
4226 0, /* properties_provided */
4227 0, /* properties_destroyed */
4228 0, /* todo_flags_start */
4229 0, /* todo_flags_finish */
4232 class pass_profile
: public gimple_opt_pass
4235 pass_profile (gcc::context
*ctxt
)
4236 : gimple_opt_pass (pass_data_profile
, ctxt
)
4239 /* opt_pass methods: */
4240 bool gate (function
*) final override
{ return flag_guess_branch_prob
; }
4241 unsigned int execute (function
*) final override
;
4243 }; // class pass_profile
4246 pass_profile::execute (function
*fun
)
4250 if (profile_status_for_fn (cfun
) == PROFILE_GUESSED
)
4253 loop_optimizer_init (LOOPS_NORMAL
);
4254 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4255 flow_loops_dump (dump_file
, NULL
, 0);
4257 nb_loops
= number_of_loops (fun
);
4261 tree_estimate_probability (false);
4262 cfun
->cfg
->full_profile
= true;
4267 loop_optimizer_finalize ();
4268 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4269 gimple_dump_cfg (dump_file
, dump_flags
);
4270 if (profile_status_for_fn (fun
) == PROFILE_ABSENT
)
4271 profile_status_for_fn (fun
) = PROFILE_GUESSED
;
4272 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4275 for (auto loop
: loops_list (cfun
, LI_FROM_INNERMOST
))
4276 if (expected_loop_iterations_by_profile (loop
, &iterations
))
4277 fprintf (dump_file
, "Loop %d got predicted to iterate %f times.\n",
4278 loop
->num
, iterations
.to_double ());
4286 make_pass_profile (gcc::context
*ctxt
)
4288 return new pass_profile (ctxt
);
4291 /* Return true when PRED predictor should be removed after early
4292 tree passes. Most of the predictors are beneficial to survive
4293 as early inlining can also distribute then into caller's bodies. */
4296 strip_predictor_early (enum br_predictor pred
)
4300 case PRED_TREE_EARLY_RETURN
:
4307 /* Get rid of all builtin_expect calls and GIMPLE_PREDICT statements
4308 we no longer need. EARLY is set to true when called from early
4312 strip_predict_hints (function
*fun
, bool early
)
4317 bool changed
= false;
4319 FOR_EACH_BB_FN (bb
, fun
)
4321 gimple_stmt_iterator bi
;
4322 for (bi
= gsi_start_bb (bb
); !gsi_end_p (bi
);)
4324 gimple
*stmt
= gsi_stmt (bi
);
4326 if (gimple_code (stmt
) == GIMPLE_PREDICT
)
4329 || strip_predictor_early (gimple_predict_predictor (stmt
)))
4331 gsi_remove (&bi
, true);
4336 else if (is_gimple_call (stmt
))
4338 tree fndecl
= gimple_call_fndecl (stmt
);
4341 && ((fndecl
!= NULL_TREE
4342 && fndecl_built_in_p (fndecl
, BUILT_IN_EXPECT
)
4343 && gimple_call_num_args (stmt
) == 2)
4344 || (fndecl
!= NULL_TREE
4345 && fndecl_built_in_p (fndecl
,
4346 BUILT_IN_EXPECT_WITH_PROBABILITY
)
4347 && gimple_call_num_args (stmt
) == 3)
4348 || (gimple_call_internal_p (stmt
)
4349 && gimple_call_internal_fn (stmt
) == IFN_BUILTIN_EXPECT
)))
4351 var
= gimple_call_lhs (stmt
);
4356 = gimple_build_assign (var
, gimple_call_arg (stmt
, 0));
4357 gsi_replace (&bi
, ass_stmt
, true);
4361 gsi_remove (&bi
, true);
4369 return changed
? TODO_cleanup_cfg
: 0;
4374 const pass_data pass_data_strip_predict_hints
=
4376 GIMPLE_PASS
, /* type */
4377 "*strip_predict_hints", /* name */
4378 OPTGROUP_NONE
, /* optinfo_flags */
4379 TV_BRANCH_PROB
, /* tv_id */
4380 PROP_cfg
, /* properties_required */
4381 0, /* properties_provided */
4382 0, /* properties_destroyed */
4383 0, /* todo_flags_start */
4384 0, /* todo_flags_finish */
4387 class pass_strip_predict_hints
: public gimple_opt_pass
4390 pass_strip_predict_hints (gcc::context
*ctxt
)
4391 : gimple_opt_pass (pass_data_strip_predict_hints
, ctxt
)
4394 /* opt_pass methods: */
4395 opt_pass
* clone () final override
4397 return new pass_strip_predict_hints (m_ctxt
);
4399 void set_pass_param (unsigned int n
, bool param
) final override
4401 gcc_assert (n
== 0);
4405 unsigned int execute (function
*) final override
;
4410 }; // class pass_strip_predict_hints
4413 pass_strip_predict_hints::execute (function
*fun
)
4415 return strip_predict_hints (fun
, early_p
);
4421 make_pass_strip_predict_hints (gcc::context
*ctxt
)
4423 return new pass_strip_predict_hints (ctxt
);
4426 /* Rebuild function frequencies. Passes are in general expected to
4427 maintain profile by hand, however in some cases this is not possible:
4428 for example when inlining several functions with loops freuqencies might run
4429 out of scale and thus needs to be recomputed. */
4432 rebuild_frequencies (void)
4434 /* If we have no profile, do nothing. Note that after inlining
4435 profile_status_for_fn may not represent the actual presence/absence of
4437 if (profile_status_for_fn (cfun
) == PROFILE_ABSENT
4438 && !ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
.initialized_p ())
4442 /* See if everything is OK and update count_max. */
4444 bool inconsistency_found
= false;
4445 bool uninitialized_probablity_found
= false;
4446 bool uninitialized_count_found
= false;
4448 cfun
->cfg
->count_max
= profile_count::uninitialized ();
4449 FOR_BB_BETWEEN (bb
, ENTRY_BLOCK_PTR_FOR_FN (cfun
), NULL
, next_bb
)
4451 cfun
->cfg
->count_max
= cfun
->cfg
->count_max
.max (bb
->count
);
4452 /* Uninitialized count may be result of inlining or an omision in an
4453 optimization pass. */
4454 if (!bb
->count
.initialized_p ())
4456 uninitialized_count_found
= true;
4458 fprintf (dump_file
, "BB %i has uninitialized count\n",
4461 if (bb
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
)
4462 && (!uninitialized_probablity_found
|| !inconsistency_found
))
4464 profile_count sum
= profile_count::zero ();
4468 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
4471 /* Uninitialized probability may be result of inlining or an
4472 omision in an optimization pass. */
4473 if (!e
->probability
.initialized_p ())
4477 "Edge %i->%i has uninitialized probability\n",
4478 e
->src
->index
, e
->dest
->index
);
4481 if (sum
.differs_from_p (bb
->count
))
4485 "BB %i has invalid sum of incomming counts\n",
4487 inconsistency_found
= true;
4492 /* If everything is OK, do not re-propagate frequencies. */
4493 if (!inconsistency_found
4494 && (!uninitialized_count_found
|| uninitialized_probablity_found
)
4495 && !cfun
->cfg
->count_max
.very_large_p ())
4498 fprintf (dump_file
, "Profile is consistent\n");
4501 /* Do not re-propagate if we have profile feedback. Even if the profile is
4502 inconsistent from previous transofrmations, it is probably more realistic
4503 for hot part of the program than result of repropagating.
4505 Consider example where we previously has
4508 then [large probability for true]
4510 and we later proved that test is always 0. In this case, if profile was
4511 read correctly, we must have duplicated the conditional (for example by
4512 inlining) in to a context where test is false. From profile feedback
4513 we know that most executions if the conditionals were true, so the
4514 important copy is not the one we look on.
4516 Propagating from probabilities would make profile look consistent, but
4517 because probablities after code duplication may not be representative
4518 for a given run, we would only propagate the error further. */
4519 if (ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
.ipa ().nonzero_p ()
4520 && !uninitialized_count_found
)
4524 "Profile is inconsistent but read from profile feedback;"
4525 " not rebuilding\n");
4529 loop_optimizer_init (LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS
);
4530 connect_infinite_loops_to_exit ();
4531 estimate_bb_frequencies ();
4532 remove_fake_exit_edges ();
4533 loop_optimizer_finalize ();
4535 fprintf (dump_file
, "Rebuilt basic block counts\n");
4542 const pass_data pass_data_rebuild_frequencies
=
4544 GIMPLE_PASS
, /* type */
4545 "rebuild_frequencies", /* name */
4546 OPTGROUP_NONE
, /* optinfo_flags */
4547 TV_REBUILD_FREQUENCIES
, /* tv_id */
4548 PROP_cfg
, /* properties_required */
4549 0, /* properties_provided */
4550 0, /* properties_destroyed */
4551 0, /* todo_flags_start */
4552 0, /* todo_flags_finish */
4555 class pass_rebuild_frequencies
: public gimple_opt_pass
4558 pass_rebuild_frequencies (gcc::context
*ctxt
)
4559 : gimple_opt_pass (pass_data_rebuild_frequencies
, ctxt
)
4562 /* opt_pass methods: */
4563 opt_pass
* clone () final override
4565 return new pass_rebuild_frequencies (m_ctxt
);
4567 void set_pass_param (unsigned int n
, bool param
) final override
4569 gcc_assert (n
== 0);
4573 unsigned int execute (function
*) final override
4575 rebuild_frequencies ();
4582 }; // class pass_rebuild_frequencies
4587 make_pass_rebuild_frequencies (gcc::context
*ctxt
)
4589 return new pass_rebuild_frequencies (ctxt
);
4592 /* Perform a dry run of the branch prediction pass and report comparsion of
4593 the predicted and real profile into the dump file. */
4596 report_predictor_hitrates (void)
4600 loop_optimizer_init (LOOPS_NORMAL
);
4601 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4602 flow_loops_dump (dump_file
, NULL
, 0);
4604 nb_loops
= number_of_loops (cfun
);
4608 tree_estimate_probability (true);
4613 loop_optimizer_finalize ();
4616 /* Force edge E to be cold.
4617 If IMPOSSIBLE is true, for edge to have count and probability 0 otherwise
4618 keep low probability to represent possible error in a guess. This is used
4619 i.e. in case we predict loop to likely iterate given number of times but
4620 we are not 100% sure.
4622 This function locally updates profile without attempt to keep global
4623 consistency which cannot be reached in full generality without full profile
4624 rebuild from probabilities alone. Doing so is not necessarily a good idea
4625 because frequencies and counts may be more realistic then probabilities.
4627 In some cases (such as for elimination of early exits during full loop
4628 unrolling) the caller can ensure that profile will get consistent
4632 force_edge_cold (edge e
, bool impossible
)
4634 profile_count count_sum
= profile_count::zero ();
4635 profile_probability prob_sum
= profile_probability::never ();
4638 bool uninitialized_exit
= false;
4640 /* When branch probability guesses are not known, then do nothing. */
4641 if (!impossible
&& !e
->count ().initialized_p ())
4644 profile_probability goal
= (impossible
? profile_probability::never ()
4645 : profile_probability::very_unlikely ());
4647 /* If edge is already improbably or cold, just return. */
4648 if (e
->probability
<= goal
4649 && (!impossible
|| e
->count () == profile_count::zero ()))
4651 FOR_EACH_EDGE (e2
, ei
, e
->src
->succs
)
4654 if (e
->flags
& EDGE_FAKE
)
4656 if (e2
->count ().initialized_p ())
4657 count_sum
+= e2
->count ();
4658 if (e2
->probability
.initialized_p ())
4659 prob_sum
+= e2
->probability
;
4661 uninitialized_exit
= true;
4664 /* If we are not guessing profiles but have some other edges out,
4665 just assume the control flow goes elsewhere. */
4666 if (uninitialized_exit
)
4667 e
->probability
= goal
;
4668 /* If there are other edges out of e->src, redistribute probabilitity
4670 else if (prob_sum
> profile_probability::never ())
4672 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4674 fprintf (dump_file
, "Making edge %i->%i %s by redistributing "
4675 "probability to other edges. Original probability: ",
4676 e
->src
->index
, e
->dest
->index
,
4677 impossible
? "impossible" : "cold");
4678 e
->probability
.dump (dump_file
);
4679 fprintf (dump_file
, "\n");
4681 set_edge_probability_and_rescale_others (e
, goal
);
4682 if (current_ir_type () != IR_GIMPLE
4683 && e
->src
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
))
4684 update_br_prob_note (e
->src
);
4686 /* If all edges out of e->src are unlikely, the basic block itself
4690 if (prob_sum
== profile_probability::never ())
4691 e
->probability
= profile_probability::always ();
4695 e
->probability
= profile_probability::never ();
4696 /* If BB has some edges out that are not impossible, we cannot
4697 assume that BB itself is. */
4700 if (current_ir_type () != IR_GIMPLE
4701 && e
->src
!= ENTRY_BLOCK_PTR_FOR_FN (cfun
))
4702 update_br_prob_note (e
->src
);
4703 if (e
->src
->count
== profile_count::zero ())
4705 if (count_sum
== profile_count::zero () && impossible
)
4708 if (e
->src
== ENTRY_BLOCK_PTR_FOR_FN (cfun
))
4710 else if (current_ir_type () == IR_GIMPLE
)
4711 for (gimple_stmt_iterator gsi
= gsi_start_bb (e
->src
);
4712 !gsi_end_p (gsi
); gsi_next (&gsi
))
4714 if (stmt_can_terminate_bb_p (gsi_stmt (gsi
)))
4720 /* FIXME: Implement RTL path. */
4725 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4727 "Making bb %i impossible and dropping count to 0.\n",
4729 e
->src
->count
= profile_count::zero ();
4730 FOR_EACH_EDGE (e2
, ei
, e
->src
->preds
)
4731 force_edge_cold (e2
, impossible
);
4736 /* If we did not adjusting, the source basic block has no likely edeges
4737 leaving other direction. In that case force that bb cold, too.
4738 This in general is difficult task to do, but handle special case when
4739 BB has only one predecestor. This is common case when we are updating
4740 after loop transforms. */
4741 if (!(prob_sum
> profile_probability::never ())
4742 && count_sum
== profile_count::zero ()
4743 && single_pred_p (e
->src
) && e
->src
->count
.to_frequency (cfun
)
4744 > (impossible
? 0 : 1))
4746 int old_frequency
= e
->src
->count
.to_frequency (cfun
);
4747 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4748 fprintf (dump_file
, "Making bb %i %s.\n", e
->src
->index
,
4749 impossible
? "impossible" : "cold");
4750 int new_frequency
= MIN (e
->src
->count
.to_frequency (cfun
),
4751 impossible
? 0 : 1);
4753 e
->src
->count
= profile_count::zero ();
4755 e
->src
->count
= e
->count ().apply_scale (new_frequency
,
4757 force_edge_cold (single_pred_edge (e
->src
), impossible
);
4759 else if (dump_file
&& (dump_flags
& TDF_DETAILS
)
4760 && maybe_hot_bb_p (cfun
, e
->src
))
4761 fprintf (dump_file
, "Giving up on making bb %i %s.\n", e
->src
->index
,
4762 impossible
? "impossible" : "cold");
4768 namespace selftest
{
4770 /* Test that value range of predictor values defined in predict.def is
4771 within range (50, 100]. */
4773 struct branch_predictor
4779 #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) { NAME, HITRATE },
4782 test_prediction_value_range ()
4784 branch_predictor predictors
[] = {
4785 #include "predict.def"
4786 { NULL
, PROB_UNINITIALIZED
}
4789 for (unsigned i
= 0; predictors
[i
].name
!= NULL
; i
++)
4791 if (predictors
[i
].probability
== PROB_UNINITIALIZED
)
4794 unsigned p
= 100 * predictors
[i
].probability
/ REG_BR_PROB_BASE
;
4795 ASSERT_TRUE (p
>= 50 && p
<= 100);
4799 #undef DEF_PREDICTOR
4801 /* Run all of the selfests within this file. */
4806 test_prediction_value_range ();
4809 } // namespace selftest
4810 #endif /* CHECKING_P. */