1 /* Branch prediction routines for the GNU compiler.
2 Copyright (C) 2000, 2001 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 2, 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 COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 [1] "Branch Prediction for Free"
24 Ball and Larus; PLDI '93.
25 [2] "Static Branch Frequency and Program Profile Analysis"
26 Wu and Larus; MICRO-27.
27 [3] "Corpus-based Static Branch Prediction"
28 Calder, Grunwald, Lindsay, Martin, Mozer, and Zorn; PLDI '95. */
36 #include "hard-reg-set.h"
37 #include "basic-block.h"
38 #include "insn-config.h"
49 /* Random guesstimation given names. */
50 #define PROB_NEVER (0)
51 #define PROB_VERY_UNLIKELY (REG_BR_PROB_BASE / 10 - 1)
52 #define PROB_UNLIKELY (REG_BR_PROB_BASE * 4 / 10 - 1)
53 #define PROB_EVEN (REG_BR_PROB_BASE / 2)
54 #define PROB_LIKELY (REG_BR_PROB_BASE - PROB_UNLIKELY)
55 #define PROB_VERY_LIKELY (REG_BR_PROB_BASE - PROB_VERY_UNLIKELY)
56 #define PROB_ALWAYS (REG_BR_PROB_BASE)
58 static void combine_predictions_for_insn PARAMS ((rtx, basic_block));
59 static void dump_prediction PARAMS ((enum br_predictor, int,
61 static void estimate_loops_at_level PARAMS ((struct loop *loop));
62 static void propagate_freq PARAMS ((basic_block));
63 static void estimate_bb_frequencies PARAMS ((struct loops *));
64 static void counts_to_freqs PARAMS ((void));
66 /* Information we hold about each branch predictor.
67 Filled using information from predict.def. */
71 const char *const name; /* Name used in the debugging dumps. */
72 const int hitrate; /* Expected hitrate used by
73 predict_insn_def call. */
77 /* Use given predictor without Dempster-Shaffer theory if it matches
78 using first_match heuristics. */
79 #define PRED_FLAG_FIRST_MATCH 1
81 /* Recompute hitrate in percent to our representation. */
83 #define HITRATE(VAL) ((int) ((VAL) * REG_BR_PROB_BASE + 50) / 100)
85 #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) {NAME, HITRATE, FLAGS},
86 static const struct predictor_info predictor_info[]= {
87 #include "predict.def"
89 /* Upper bound on predictors. */
95 predict_insn (insn, predictor, probability)
98 enum br_predictor predictor;
100 if (!any_condjump_p (insn))
104 = gen_rtx_EXPR_LIST (REG_BR_PRED,
105 gen_rtx_CONCAT (VOIDmode,
106 GEN_INT ((int) predictor),
107 GEN_INT ((int) probability)),
111 /* Predict insn by given predictor. */
114 predict_insn_def (insn, predictor, taken)
116 enum br_predictor predictor;
117 enum prediction taken;
119 int probability = predictor_info[(int) predictor].hitrate;
122 probability = REG_BR_PROB_BASE - probability;
124 predict_insn (insn, predictor, probability);
127 /* Predict edge E with given probability if possible. */
130 predict_edge (e, predictor, probability)
133 enum br_predictor predictor;
136 last_insn = e->src->end;
138 /* We can store the branch prediction information only about
139 conditional jumps. */
140 if (!any_condjump_p (last_insn))
143 /* We always store probability of branching. */
144 if (e->flags & EDGE_FALLTHRU)
145 probability = REG_BR_PROB_BASE - probability;
147 predict_insn (last_insn, predictor, probability);
150 /* Predict edge E by given predictor if possible. */
153 predict_edge_def (e, predictor, taken)
155 enum br_predictor predictor;
156 enum prediction taken;
158 int probability = predictor_info[(int) predictor].hitrate;
161 probability = REG_BR_PROB_BASE - probability;
163 predict_edge (e, predictor, probability);
166 /* Invert all branch predictions or probability notes in the INSN. This needs
167 to be done each time we invert the condition used by the jump. */
170 invert_br_probabilities (insn)
175 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
176 if (REG_NOTE_KIND (note) == REG_BR_PROB)
177 XEXP (note, 0) = GEN_INT (REG_BR_PROB_BASE - INTVAL (XEXP (note, 0)));
178 else if (REG_NOTE_KIND (note) == REG_BR_PRED)
179 XEXP (XEXP (note, 0), 1)
180 = GEN_INT (REG_BR_PROB_BASE - INTVAL (XEXP (XEXP (note, 0), 1)));
183 /* Dump information about the branch prediction to the output file. */
186 dump_prediction (predictor, probability, bb, used)
187 enum br_predictor predictor;
197 while (e->flags & EDGE_FALLTHRU)
200 fprintf (rtl_dump_file, " %s heuristics%s: %.1f%%",
201 predictor_info[predictor].name,
202 used ? "" : " (ignored)", probability * 100.0 / REG_BR_PROB_BASE);
206 fprintf (rtl_dump_file, " exec ");
207 fprintf (rtl_dump_file, HOST_WIDEST_INT_PRINT_DEC, bb->count);
208 fprintf (rtl_dump_file, " hit ");
209 fprintf (rtl_dump_file, HOST_WIDEST_INT_PRINT_DEC, e->count);
210 fprintf (rtl_dump_file, " (%.1f%%)", e->count * 100.0 / bb->count);
213 fprintf (rtl_dump_file, "\n");
216 /* Combine all REG_BR_PRED notes into single probability and attach REG_BR_PROB
217 note if not already present. Remove now useless REG_BR_PRED notes. */
220 combine_predictions_for_insn (insn, bb)
224 rtx prob_note = find_reg_note (insn, REG_BR_PROB, 0);
225 rtx *pnote = ®_NOTES (insn);
227 int best_probability = PROB_EVEN;
228 int best_predictor = END_PREDICTORS;
229 int combined_probability = REG_BR_PROB_BASE / 2;
231 bool first_match = false;
235 fprintf (rtl_dump_file, "Predictions for insn %i bb %i\n", INSN_UID (insn),
238 /* We implement "first match" heuristics and use probability guessed
239 by predictor with smallest index. In the future we will use better
240 probability combination techniques. */
241 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
242 if (REG_NOTE_KIND (note) == REG_BR_PRED)
244 int predictor = INTVAL (XEXP (XEXP (note, 0), 0));
245 int probability = INTVAL (XEXP (XEXP (note, 0), 1));
248 if (best_predictor > predictor)
249 best_probability = probability, best_predictor = predictor;
251 d = (combined_probability * probability
252 + (REG_BR_PROB_BASE - combined_probability)
253 * (REG_BR_PROB_BASE - probability));
255 /* Use FP math to avoid overflows of 32bit integers. */
256 combined_probability = (((double) combined_probability) * probability
257 * REG_BR_PROB_BASE / d + 0.5);
260 /* Decide which heuristic to use. In case we didn't match anything,
261 use no_prediction heuristic, in case we did match, use either
262 first match or Dempster-Shaffer theory depending on the flags. */
264 if (predictor_info [best_predictor].flags & PRED_FLAG_FIRST_MATCH)
268 dump_prediction (PRED_NO_PREDICTION, combined_probability, bb, true);
271 dump_prediction (PRED_DS_THEORY, combined_probability, bb, !first_match);
272 dump_prediction (PRED_FIRST_MATCH, best_probability, bb, first_match);
276 combined_probability = best_probability;
277 dump_prediction (PRED_COMBINED, combined_probability, bb, true);
281 if (REG_NOTE_KIND (*pnote) == REG_BR_PRED)
283 int predictor = INTVAL (XEXP (XEXP (*pnote, 0), 0));
284 int probability = INTVAL (XEXP (XEXP (*pnote, 0), 1));
286 dump_prediction (predictor, probability, bb,
287 !first_match || best_predictor == predictor);
288 *pnote = XEXP (*pnote, 1);
291 pnote = &XEXP (*pnote, 1);
297 = gen_rtx_EXPR_LIST (REG_BR_PROB,
298 GEN_INT (combined_probability), REG_NOTES (insn));
300 /* Save the prediction into CFG in case we are seeing non-degenerated
302 if (bb->succ->succ_next)
304 BRANCH_EDGE (bb)->probability = combined_probability;
305 FALLTHRU_EDGE (bb)->probability
306 = REG_BR_PROB_BASE - combined_probability;
311 /* Statically estimate the probability that a branch will be taken.
312 ??? In the next revision there will be a number of other predictors added
313 from the above references. Further, each heuristic will be factored out
314 into its own function for clarity (and to facilitate the combination of
318 estimate_probability (loops_info)
319 struct loops *loops_info;
321 sbitmap *dominators, *post_dominators;
323 int found_noreturn = 0;
325 dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
326 post_dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
327 calculate_dominance_info (NULL, dominators, CDI_DOMINATORS);
328 calculate_dominance_info (NULL, post_dominators, CDI_POST_DOMINATORS);
330 /* Try to predict out blocks in a loop that are not part of a
332 for (i = 0; i < loops_info->num; i++)
336 struct loop *loop = &loops_info->array[i];
338 flow_loop_scan (loops_info, loop, LOOP_EXIT_EDGES);
339 exits = loop->num_exits;
341 for (j = loop->first->index; j <= loop->last->index; ++j)
342 if (TEST_BIT (loop->nodes, j))
344 int header_found = 0;
347 /* Loop branch heuristics - predict an edge back to a
348 loop's head as taken. */
349 for (e = BASIC_BLOCK(j)->succ; e; e = e->succ_next)
350 if (e->dest == loop->header
351 && e->src == loop->latch)
354 predict_edge_def (e, PRED_LOOP_BRANCH, TAKEN);
357 /* Loop exit heuristics - predict an edge exiting the loop if the
358 conditinal has no loop header successors as not taken. */
360 for (e = BASIC_BLOCK(j)->succ; e; e = e->succ_next)
361 if (e->dest->index < 0
362 || !TEST_BIT (loop->nodes, e->dest->index))
366 - predictor_info [(int)PRED_LOOP_EXIT].hitrate)
371 /* Attempt to predict conditional jumps using a number of heuristics. */
372 for (i = 0; i < n_basic_blocks; i++)
374 basic_block bb = BASIC_BLOCK (i);
375 rtx last_insn = bb->end;
379 /* If block has no successor, predict all possible paths to it as
380 improbable, as the block contains a call to a noreturn function and
381 thus can be executed only once. */
382 if (bb->succ == NULL && !found_noreturn)
386 /* ??? Postdominator claims each noreturn block to be postdominated
387 by each, so we need to run only once. This needs to be changed
388 once postdominace algorithm is updated to say something more
391 for (y = 0; y < n_basic_blocks; y++)
392 if (!TEST_BIT (post_dominators[y], i))
393 for (e = BASIC_BLOCK (y)->succ; e; e = e->succ_next)
394 if (e->dest->index >= 0
395 && TEST_BIT (post_dominators[e->dest->index], i))
396 predict_edge_def (e, PRED_NORETURN, NOT_TAKEN);
399 if (GET_CODE (last_insn) != JUMP_INSN || ! any_condjump_p (last_insn))
402 for (e = bb->succ; e; e = e->succ_next)
404 /* Predict edges to blocks that return immediately to be
405 improbable. These are usually used to signal error states. */
406 if (e->dest == EXIT_BLOCK_PTR
407 || (e->dest->succ && !e->dest->succ->succ_next
408 && e->dest->succ->dest == EXIT_BLOCK_PTR))
409 predict_edge_def (e, PRED_ERROR_RETURN, NOT_TAKEN);
411 /* Look for block we are guarding (ie we dominate it,
412 but it doesn't postdominate us). */
413 if (e->dest != EXIT_BLOCK_PTR && e->dest != bb
414 && TEST_BIT (dominators[e->dest->index], e->src->index)
415 && !TEST_BIT (post_dominators[e->src->index], e->dest->index))
419 /* The call heuristic claims that a guarded function call
420 is improbable. This is because such calls are often used
421 to signal exceptional situations such as printing error
423 for (insn = e->dest->head; insn != NEXT_INSN (e->dest->end);
424 insn = NEXT_INSN (insn))
425 if (GET_CODE (insn) == CALL_INSN
426 /* Constant and pure calls are hardly used to signalize
427 something exceptional. */
428 && ! CONST_OR_PURE_CALL_P (insn))
430 predict_edge_def (e, PRED_CALL, NOT_TAKEN);
436 cond = get_condition (last_insn, &earliest);
440 /* Try "pointer heuristic."
441 A comparison ptr == 0 is predicted as false.
442 Similarly, a comparison ptr1 == ptr2 is predicted as false. */
443 if (GET_RTX_CLASS (GET_CODE (cond)) == '<'
444 && ((REG_P (XEXP (cond, 0)) && REG_POINTER (XEXP (cond, 0)))
445 || (REG_P (XEXP (cond, 1)) && REG_POINTER (XEXP (cond, 1)))))
447 if (GET_CODE (cond) == EQ)
448 predict_insn_def (last_insn, PRED_POINTER, NOT_TAKEN);
449 else if (GET_CODE (cond) == NE)
450 predict_insn_def (last_insn, PRED_POINTER, TAKEN);
454 /* Try "opcode heuristic."
455 EQ tests are usually false and NE tests are usually true. Also,
456 most quantities are positive, so we can make the appropriate guesses
457 about signed comparisons against zero. */
458 switch (GET_CODE (cond))
461 /* Unconditional branch. */
462 predict_insn_def (last_insn, PRED_UNCONDITIONAL,
463 cond == const0_rtx ? NOT_TAKEN : TAKEN);
468 /* Floating point comparisons appears to behave in a very
469 inpredictable way because of special role of = tests in
471 if (FLOAT_MODE_P (GET_MODE (XEXP (cond, 0))))
473 /* Comparisons with 0 are often used for booleans and there is
474 nothing usefull to predict about them. */
475 else if (XEXP (cond, 1) == const0_rtx
476 || XEXP (cond, 0) == const0_rtx)
479 predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, NOT_TAKEN);
484 /* Floating point comparisons appears to behave in a very
485 inpredictable way because of special role of = tests in
487 if (FLOAT_MODE_P (GET_MODE (XEXP (cond, 0))))
489 /* Comparisons with 0 are often used for booleans and there is
490 nothing usefull to predict about them. */
491 else if (XEXP (cond, 1) == const0_rtx
492 || XEXP (cond, 0) == const0_rtx)
495 predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, TAKEN);
499 predict_insn_def (last_insn, PRED_FPOPCODE, TAKEN);
503 predict_insn_def (last_insn, PRED_FPOPCODE, NOT_TAKEN);
508 if (XEXP (cond, 1) == const0_rtx || XEXP (cond, 1) == const1_rtx
509 || XEXP (cond, 1) == constm1_rtx)
510 predict_insn_def (last_insn, PRED_OPCODE_POSITIVE, NOT_TAKEN);
515 if (XEXP (cond, 1) == const0_rtx || XEXP (cond, 1) == const1_rtx
516 || XEXP (cond, 1) == constm1_rtx)
517 predict_insn_def (last_insn, PRED_OPCODE_POSITIVE, TAKEN);
525 /* Attach the combined probability to each conditional jump. */
526 for (i = 0; i < n_basic_blocks; i++)
527 if (GET_CODE (BLOCK_END (i)) == JUMP_INSN
528 && any_condjump_p (BLOCK_END (i)))
529 combine_predictions_for_insn (BLOCK_END (i), BASIC_BLOCK (i));
531 sbitmap_vector_free (post_dominators);
532 sbitmap_vector_free (dominators);
534 estimate_bb_frequencies (loops_info);
537 /* __builtin_expect dropped tokens into the insn stream describing expected
538 values of registers. Generate branch probabilities based off these
542 expected_value_to_br_prob ()
544 rtx insn, cond, ev = NULL_RTX, ev_reg = NULL_RTX;
546 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
548 switch (GET_CODE (insn))
551 /* Look for expected value notes. */
552 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EXPECTED_VALUE)
554 ev = NOTE_EXPECTED_VALUE (insn);
555 ev_reg = XEXP (ev, 0);
561 /* Never propagate across labels. */
566 /* Look for simple conditional branches. If we haven't got an
567 expected value yet, no point going further. */
568 if (GET_CODE (insn) != JUMP_INSN || ev == NULL_RTX
569 || ! any_condjump_p (insn))
574 /* Look for insns that clobber the EV register. */
575 if (ev && reg_set_p (ev_reg, insn))
580 /* Collect the branch condition, hopefully relative to EV_REG. */
581 /* ??? At present we'll miss things like
582 (expected_value (eq r70 0))
584 (set r80 (lt r70 r71))
585 (set pc (if_then_else (ne r80 0) ...))
586 as canonicalize_condition will render this to us as
588 Could use cselib to try and reduce this further. */
589 cond = XEXP (SET_SRC (pc_set (insn)), 0);
590 cond = canonicalize_condition (insn, cond, 0, NULL, ev_reg);
591 if (! cond || XEXP (cond, 0) != ev_reg
592 || GET_CODE (XEXP (cond, 1)) != CONST_INT)
595 /* Substitute and simplify. Given that the expression we're
596 building involves two constants, we should wind up with either
598 cond = gen_rtx_fmt_ee (GET_CODE (cond), VOIDmode,
599 XEXP (ev, 1), XEXP (cond, 1));
600 cond = simplify_rtx (cond);
602 /* Turn the condition into a scaled branch probability. */
603 if (cond != const_true_rtx && cond != const0_rtx)
605 predict_insn_def (insn, PRED_BUILTIN_EXPECT,
606 cond == const_true_rtx ? TAKEN : NOT_TAKEN);
610 /* This is used to carry information about basic blocks. It is
611 attached to the AUX field of the standard CFG block. */
613 typedef struct block_info_def
615 /* Estimated frequency of execution of basic_block. */
616 volatile double frequency;
618 /* To keep queue of basic blocks to process. */
621 /* True if block needs to be visited in prop_freqency. */
624 /* Number of predecessors we need to visit first. */
628 /* Similar information for edges. */
629 typedef struct edge_info_def
631 /* In case edge is an loopback edge, the probability edge will be reached
632 in case header is. Estimated number of iterations of the loop can be
633 then computed as 1 / (1 - back_edge_prob).
635 Volatile is needed to avoid differences in the optimized and unoptimized
636 builds on machines where FP registers are wider than double. */
637 volatile double back_edge_prob;
638 /* True if the edge is an loopback edge in the natural loop. */
642 #define BLOCK_INFO(B) ((block_info) (B)->aux)
643 #define EDGE_INFO(E) ((edge_info) (E)->aux)
645 /* Helper function for estimate_bb_frequencies.
646 Propagate the frequencies for loops headed by HEAD. */
649 propagate_freq (head)
652 basic_block bb = head;
653 basic_block last = bb;
658 /* For each basic block we need to visit count number of his predecessors
659 we need to visit first. */
660 for (n = 0; n < n_basic_blocks; n++)
662 basic_block bb = BASIC_BLOCK (n);
663 if (BLOCK_INFO (bb)->tovisit)
667 for (e = bb->pred; e; e = e->pred_next)
668 if (BLOCK_INFO (e->src)->tovisit && !(e->flags & EDGE_DFS_BACK))
670 else if (BLOCK_INFO (e->src)->tovisit
671 && rtl_dump_file && !EDGE_INFO (e)->back_edge)
672 fprintf (rtl_dump_file,
673 "Irreducible region hit, ignoring edge to %i->%i\n",
674 e->src->index, bb->index);
675 BLOCK_INFO (bb)->npredecessors = count;
679 BLOCK_INFO (head)->frequency = 1;
680 for (; bb; bb = nextbb)
682 double cyclic_probability = 0, frequency = 0;
684 nextbb = BLOCK_INFO (bb)->next;
685 BLOCK_INFO (bb)->next = NULL;
687 /* Compute frequency of basic block. */
690 #ifdef ENABLE_CHECKING
691 for (e = bb->pred; e; e = e->pred_next)
692 if (BLOCK_INFO (e->src)->tovisit && !(e->flags & EDGE_DFS_BACK))
696 for (e = bb->pred; e; e = e->pred_next)
697 if (EDGE_INFO (e)->back_edge)
698 cyclic_probability += EDGE_INFO (e)->back_edge_prob;
699 else if (!(e->flags & EDGE_DFS_BACK))
700 frequency += (e->probability
701 * BLOCK_INFO (e->src)->frequency /
704 if (cyclic_probability > 1.0 - 1.0 / REG_BR_PROB_BASE)
705 cyclic_probability = 1.0 - 1.0 / REG_BR_PROB_BASE;
707 BLOCK_INFO (bb)->frequency = frequency / (1 - cyclic_probability);
710 BLOCK_INFO (bb)->tovisit = 0;
712 /* Compute back edge frequencies. */
713 for (e = bb->succ; e; e = e->succ_next)
715 EDGE_INFO (e)->back_edge_prob
716 = ((e->probability * BLOCK_INFO (bb)->frequency)
719 /* Propagate to successor blocks. */
720 for (e = bb->succ; e; e = e->succ_next)
721 if (!(e->flags & EDGE_DFS_BACK)
722 && BLOCK_INFO (e->dest)->npredecessors)
724 BLOCK_INFO (e->dest)->npredecessors--;
725 if (!BLOCK_INFO (e->dest)->npredecessors)
730 BLOCK_INFO (last)->next = e->dest;
738 /* Estimate probabilities of loopback edges in loops at same nest level. */
741 estimate_loops_at_level (first_loop)
742 struct loop *first_loop;
744 struct loop *l, *loop = first_loop;
746 for (loop = first_loop; loop; loop = loop->next)
751 estimate_loops_at_level (loop->inner);
753 /* Find current loop back edge and mark it. */
754 for (e = loop->latch->succ; e->dest != loop->header; e = e->succ_next)
757 EDGE_INFO (e)->back_edge = 1;
759 /* In case the loop header is shared, ensure that it is the last
760 one sharing the same header, so we avoid redundant work. */
763 for (l = loop->next; l; l = l->next)
764 if (l->header == loop->header)
771 /* Now merge all nodes of all loops with given header as not visited. */
772 for (l = loop->shared ? first_loop : loop; l != loop->next; l = l->next)
773 if (loop->header == l->header)
774 EXECUTE_IF_SET_IN_SBITMAP (l->nodes, 0, n,
775 BLOCK_INFO (BASIC_BLOCK (n))->tovisit = 1
778 propagate_freq (loop->header);
782 /* Convert counts measured by profile driven feedback to frequencies. */
787 HOST_WIDEST_INT count_max = 1;
790 for (i = 0; i < n_basic_blocks; i++)
791 count_max = MAX (BASIC_BLOCK (i)->count, count_max);
793 for (i = -2; i < n_basic_blocks; i++)
798 bb = ENTRY_BLOCK_PTR;
802 bb = BASIC_BLOCK (i);
804 bb->frequency = (bb->count * BB_FREQ_MAX + count_max / 2) / count_max;
808 /* Return true if function is likely to be expensive, so there is no point to
809 optimize performance of prologue, epilogue or do inlining at the expense
810 of code size growth. THRESHOLD is the limit of number of isntructions
811 function can execute at average to be still considered not expensive. */
814 expensive_function_p (threshold)
817 unsigned int sum = 0;
821 /* We can not compute accurately for large thresholds due to scaled
823 if (threshold > BB_FREQ_MAX)
826 /* Frequencies are out of range. This either means that function contains
827 internal loop executing more than BB_FREQ_MAX times or profile feedback
828 is available and function has not been executed at all. */
829 if (ENTRY_BLOCK_PTR->frequency == 0)
832 /* Maximally BB_FREQ_MAX^2 so overflow won't happen. */
833 limit = ENTRY_BLOCK_PTR->frequency * threshold;
834 for (i = 0; i < n_basic_blocks; i++)
836 basic_block bb = BASIC_BLOCK (i);
839 for (insn = bb->head; insn != NEXT_INSN (bb->end);
840 insn = NEXT_INSN (insn))
841 if (active_insn_p (insn))
843 sum += bb->frequency;
852 /* Estimate basic blocks frequency by given branch probabilities. */
855 estimate_bb_frequencies (loops)
861 mark_dfs_back_edges ();
862 if (flag_branch_probabilities)
868 /* Fill in the probability values in flowgraph based on the REG_BR_PROB
870 for (i = 0; i < n_basic_blocks; i++)
872 rtx last_insn = BLOCK_END (i);
874 edge fallthru, branch;
876 if (GET_CODE (last_insn) != JUMP_INSN || !any_condjump_p (last_insn)
877 /* Avoid handling of conditional jumps jumping to fallthru edge. */
878 || BASIC_BLOCK (i)->succ->succ_next == NULL)
880 /* We can predict only conditional jumps at the moment.
881 Expect each edge to be equally probable.
882 ?? In the future we want to make abnormal edges improbable. */
886 for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
889 if (e->probability != 0)
893 for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
894 e->probability = (REG_BR_PROB_BASE + nedges / 2) / nedges;
898 probability = INTVAL (XEXP (find_reg_note (last_insn,
899 REG_BR_PROB, 0), 0));
900 fallthru = BASIC_BLOCK (i)->succ;
901 if (!fallthru->flags & EDGE_FALLTHRU)
902 fallthru = fallthru->succ_next;
903 branch = BASIC_BLOCK (i)->succ;
904 if (branch->flags & EDGE_FALLTHRU)
905 branch = branch->succ_next;
907 branch->probability = probability;
908 fallthru->probability = REG_BR_PROB_BASE - probability;
912 ENTRY_BLOCK_PTR->succ->probability = REG_BR_PROB_BASE;
914 /* Set up block info for each basic block. */
915 alloc_aux_for_blocks (sizeof (struct block_info_def));
916 alloc_aux_for_edges (sizeof (struct edge_info_def));
917 for (i = -2; i < n_basic_blocks; i++)
923 bb = ENTRY_BLOCK_PTR;
927 bb = BASIC_BLOCK (i);
929 BLOCK_INFO (bb)->tovisit = 0;
930 for (e = bb->succ; e; e = e->succ_next)
931 EDGE_INFO (e)->back_edge_prob = ((double) e->probability
935 /* First compute probabilities locally for each loop from innermost
936 to outermost to examine probabilities for back edges. */
937 estimate_loops_at_level (loops->tree_root);
939 /* Now fake loop around whole function to finalize probabilities. */
940 for (i = 0; i < n_basic_blocks; i++)
941 BLOCK_INFO (BASIC_BLOCK (i))->tovisit = 1;
943 BLOCK_INFO (ENTRY_BLOCK_PTR)->tovisit = 1;
944 BLOCK_INFO (EXIT_BLOCK_PTR)->tovisit = 1;
945 propagate_freq (ENTRY_BLOCK_PTR);
947 for (i = 0; i < n_basic_blocks; i++)
948 if (BLOCK_INFO (BASIC_BLOCK (i))->frequency > freq_max)
949 freq_max = BLOCK_INFO (BASIC_BLOCK (i))->frequency;
951 for (i = -2; i < n_basic_blocks; i++)
956 bb = ENTRY_BLOCK_PTR;
960 bb = BASIC_BLOCK (i);
962 = BLOCK_INFO (bb)->frequency * BB_FREQ_MAX / freq_max + 0.5;
965 free_aux_for_blocks ();
966 free_aux_for_edges ();