2002-04-24 Aldy Hernandez <aldyh@redhat.com>
[official-gcc.git] / gcc / predict.c
blob1d8691c9d2222862a9aa1e0344e7025726c68d7f
1 /* Branch prediction routines for the GNU compiler.
2 Copyright (C) 2000, 2001, 2002 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
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING. If not, write to the Free
18 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
19 02111-1307, USA. */
21 /* References:
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. */
31 #include "config.h"
32 #include "system.h"
33 #include "tree.h"
34 #include "rtl.h"
35 #include "tm_p.h"
36 #include "hard-reg-set.h"
37 #include "basic-block.h"
38 #include "insn-config.h"
39 #include "regs.h"
40 #include "flags.h"
41 #include "output.h"
42 #include "function.h"
43 #include "except.h"
44 #include "toplev.h"
45 #include "recog.h"
46 #include "expr.h"
47 #include "predict.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,
60 basic_block, 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. */
69 struct predictor_info
71 const char *const name; /* Name used in the debugging dumps. */
72 const int hitrate; /* Expected hitrate used by
73 predict_insn_def call. */
74 const int flags;
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. */
90 {NULL, 0, 0}
92 #undef DEF_PREDICTOR
94 void
95 predict_insn (insn, predictor, probability)
96 rtx insn;
97 int probability;
98 enum br_predictor predictor;
100 if (!any_condjump_p (insn))
101 abort ();
103 REG_NOTES (insn)
104 = gen_rtx_EXPR_LIST (REG_BR_PRED,
105 gen_rtx_CONCAT (VOIDmode,
106 GEN_INT ((int) predictor),
107 GEN_INT ((int) probability)),
108 REG_NOTES (insn));
111 /* Predict insn by given predictor. */
113 void
114 predict_insn_def (insn, predictor, taken)
115 rtx insn;
116 enum br_predictor predictor;
117 enum prediction taken;
119 int probability = predictor_info[(int) predictor].hitrate;
121 if (taken != TAKEN)
122 probability = REG_BR_PROB_BASE - probability;
124 predict_insn (insn, predictor, probability);
127 /* Predict edge E with given probability if possible. */
129 void
130 predict_edge (e, predictor, probability)
131 edge e;
132 int probability;
133 enum br_predictor predictor;
135 rtx last_insn;
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))
141 return;
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. */
152 void
153 predict_edge_def (e, predictor, taken)
154 edge e;
155 enum br_predictor predictor;
156 enum prediction taken;
158 int probability = predictor_info[(int) predictor].hitrate;
160 if (taken != TAKEN)
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. */
169 void
170 invert_br_probabilities (insn)
171 rtx insn;
173 rtx note;
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. */
185 static void
186 dump_prediction (predictor, probability, bb, used)
187 enum br_predictor predictor;
188 int probability;
189 basic_block bb;
190 int used;
192 edge e = bb->succ;
194 if (!rtl_dump_file)
195 return;
197 while (e && (e->flags & EDGE_FALLTHRU))
198 e = e->succ_next;
200 fprintf (rtl_dump_file, " %s heuristics%s: %.1f%%",
201 predictor_info[predictor].name,
202 used ? "" : " (ignored)", probability * 100.0 / REG_BR_PROB_BASE);
204 if (bb->count)
206 fprintf (rtl_dump_file, " exec ");
207 fprintf (rtl_dump_file, HOST_WIDEST_INT_PRINT_DEC, bb->count);
208 if (e)
210 fprintf (rtl_dump_file, " hit ");
211 fprintf (rtl_dump_file, HOST_WIDEST_INT_PRINT_DEC, e->count);
212 fprintf (rtl_dump_file, " (%.1f%%)", e->count * 100.0 / bb->count);
216 fprintf (rtl_dump_file, "\n");
219 /* Combine all REG_BR_PRED notes into single probability and attach REG_BR_PROB
220 note if not already present. Remove now useless REG_BR_PRED notes. */
222 static void
223 combine_predictions_for_insn (insn, bb)
224 rtx insn;
225 basic_block bb;
227 rtx prob_note = find_reg_note (insn, REG_BR_PROB, 0);
228 rtx *pnote = &REG_NOTES (insn);
229 rtx note;
230 int best_probability = PROB_EVEN;
231 int best_predictor = END_PREDICTORS;
232 int combined_probability = REG_BR_PROB_BASE / 2;
233 int d;
234 bool first_match = false;
235 bool found = false;
237 if (rtl_dump_file)
238 fprintf (rtl_dump_file, "Predictions for insn %i bb %i\n", INSN_UID (insn),
239 bb->index);
241 /* We implement "first match" heuristics and use probability guessed
242 by predictor with smallest index. In the future we will use better
243 probability combination techniques. */
244 for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
245 if (REG_NOTE_KIND (note) == REG_BR_PRED)
247 int predictor = INTVAL (XEXP (XEXP (note, 0), 0));
248 int probability = INTVAL (XEXP (XEXP (note, 0), 1));
250 found = true;
251 if (best_predictor > predictor)
252 best_probability = probability, best_predictor = predictor;
254 d = (combined_probability * probability
255 + (REG_BR_PROB_BASE - combined_probability)
256 * (REG_BR_PROB_BASE - probability));
258 /* Use FP math to avoid overflows of 32bit integers. */
259 if (d == 0)
260 /* If one probability is 0% and one 100%, avoid division by zero. */
261 combined_probability = REG_BR_PROB_BASE / 2;
262 else
263 combined_probability = (((double) combined_probability) * probability
264 * REG_BR_PROB_BASE / d + 0.5);
267 /* Decide which heuristic to use. In case we didn't match anything,
268 use no_prediction heuristic, in case we did match, use either
269 first match or Dempster-Shaffer theory depending on the flags. */
271 if (predictor_info [best_predictor].flags & PRED_FLAG_FIRST_MATCH)
272 first_match = true;
274 if (!found)
275 dump_prediction (PRED_NO_PREDICTION, combined_probability, bb, true);
276 else
278 dump_prediction (PRED_DS_THEORY, combined_probability, bb, !first_match);
279 dump_prediction (PRED_FIRST_MATCH, best_probability, bb, first_match);
282 if (first_match)
283 combined_probability = best_probability;
284 dump_prediction (PRED_COMBINED, combined_probability, bb, true);
286 while (*pnote)
288 if (REG_NOTE_KIND (*pnote) == REG_BR_PRED)
290 int predictor = INTVAL (XEXP (XEXP (*pnote, 0), 0));
291 int probability = INTVAL (XEXP (XEXP (*pnote, 0), 1));
293 dump_prediction (predictor, probability, bb,
294 !first_match || best_predictor == predictor);
295 *pnote = XEXP (*pnote, 1);
297 else
298 pnote = &XEXP (*pnote, 1);
301 if (!prob_note)
303 REG_NOTES (insn)
304 = gen_rtx_EXPR_LIST (REG_BR_PROB,
305 GEN_INT (combined_probability), REG_NOTES (insn));
307 /* Save the prediction into CFG in case we are seeing non-degenerated
308 conditional jump. */
309 if (bb->succ->succ_next)
311 BRANCH_EDGE (bb)->probability = combined_probability;
312 FALLTHRU_EDGE (bb)->probability
313 = REG_BR_PROB_BASE - combined_probability;
318 /* Statically estimate the probability that a branch will be taken.
319 ??? In the next revision there will be a number of other predictors added
320 from the above references. Further, each heuristic will be factored out
321 into its own function for clarity (and to facilitate the combination of
322 predictions). */
324 void
325 estimate_probability (loops_info)
326 struct loops *loops_info;
328 sbitmap *dominators, *post_dominators;
329 int i;
330 int found_noreturn = 0;
332 dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
333 post_dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
334 calculate_dominance_info (NULL, dominators, CDI_DOMINATORS);
335 calculate_dominance_info (NULL, post_dominators, CDI_POST_DOMINATORS);
337 /* Try to predict out blocks in a loop that are not part of a
338 natural loop. */
339 for (i = 0; i < loops_info->num; i++)
341 int j;
342 int exits;
343 struct loop *loop = &loops_info->array[i];
345 flow_loop_scan (loops_info, loop, LOOP_EXIT_EDGES);
346 exits = loop->num_exits;
348 for (j = loop->first->index; j <= loop->last->index; ++j)
349 if (TEST_BIT (loop->nodes, j))
351 int header_found = 0;
352 edge e;
354 /* Loop branch heuristics - predict an edge back to a
355 loop's head as taken. */
356 for (e = BASIC_BLOCK(j)->succ; e; e = e->succ_next)
357 if (e->dest == loop->header
358 && e->src == loop->latch)
360 header_found = 1;
361 predict_edge_def (e, PRED_LOOP_BRANCH, TAKEN);
364 /* Loop exit heuristics - predict an edge exiting the loop if the
365 conditinal has no loop header successors as not taken. */
366 if (!header_found)
367 for (e = BASIC_BLOCK(j)->succ; e; e = e->succ_next)
368 if (e->dest->index < 0
369 || !TEST_BIT (loop->nodes, e->dest->index))
370 predict_edge
371 (e, PRED_LOOP_EXIT,
372 (REG_BR_PROB_BASE
373 - predictor_info [(int) PRED_LOOP_EXIT].hitrate)
374 / exits);
378 /* Attempt to predict conditional jumps using a number of heuristics. */
379 for (i = 0; i < n_basic_blocks; i++)
381 basic_block bb = BASIC_BLOCK (i);
382 rtx last_insn = bb->end;
383 rtx cond, earliest;
384 edge e;
386 /* If block has no successor, predict all possible paths to it as
387 improbable, as the block contains a call to a noreturn function and
388 thus can be executed only once. */
389 if (bb->succ == NULL && !found_noreturn)
391 int y;
393 /* ??? Postdominator claims each noreturn block to be postdominated
394 by each, so we need to run only once. This needs to be changed
395 once postdominace algorithm is updated to say something more
396 sane. */
397 found_noreturn = 1;
398 for (y = 0; y < n_basic_blocks; y++)
399 if (!TEST_BIT (post_dominators[y], i))
400 for (e = BASIC_BLOCK (y)->succ; e; e = e->succ_next)
401 if (e->dest->index >= 0
402 && TEST_BIT (post_dominators[e->dest->index], i))
403 predict_edge_def (e, PRED_NORETURN, NOT_TAKEN);
406 if (GET_CODE (last_insn) != JUMP_INSN || ! any_condjump_p (last_insn))
407 continue;
409 for (e = bb->succ; e; e = e->succ_next)
411 /* Predict edges to blocks that return immediately to be
412 improbable. These are usually used to signal error states. */
413 if (e->dest == EXIT_BLOCK_PTR
414 || (e->dest->succ && !e->dest->succ->succ_next
415 && e->dest->succ->dest == EXIT_BLOCK_PTR))
416 predict_edge_def (e, PRED_ERROR_RETURN, NOT_TAKEN);
418 /* Look for block we are guarding (ie we dominate it,
419 but it doesn't postdominate us). */
420 if (e->dest != EXIT_BLOCK_PTR && e->dest != bb
421 && TEST_BIT (dominators[e->dest->index], e->src->index)
422 && !TEST_BIT (post_dominators[e->src->index], e->dest->index))
424 rtx insn;
426 /* The call heuristic claims that a guarded function call
427 is improbable. This is because such calls are often used
428 to signal exceptional situations such as printing error
429 messages. */
430 for (insn = e->dest->head; insn != NEXT_INSN (e->dest->end);
431 insn = NEXT_INSN (insn))
432 if (GET_CODE (insn) == CALL_INSN
433 /* Constant and pure calls are hardly used to signalize
434 something exceptional. */
435 && ! CONST_OR_PURE_CALL_P (insn))
437 predict_edge_def (e, PRED_CALL, NOT_TAKEN);
438 break;
443 cond = get_condition (last_insn, &earliest);
444 if (! cond)
445 continue;
447 /* Try "pointer heuristic."
448 A comparison ptr == 0 is predicted as false.
449 Similarly, a comparison ptr1 == ptr2 is predicted as false. */
450 if (GET_RTX_CLASS (GET_CODE (cond)) == '<'
451 && ((REG_P (XEXP (cond, 0)) && REG_POINTER (XEXP (cond, 0)))
452 || (REG_P (XEXP (cond, 1)) && REG_POINTER (XEXP (cond, 1)))))
454 if (GET_CODE (cond) == EQ)
455 predict_insn_def (last_insn, PRED_POINTER, NOT_TAKEN);
456 else if (GET_CODE (cond) == NE)
457 predict_insn_def (last_insn, PRED_POINTER, TAKEN);
459 else
461 /* Try "opcode heuristic."
462 EQ tests are usually false and NE tests are usually true. Also,
463 most quantities are positive, so we can make the appropriate guesses
464 about signed comparisons against zero. */
465 switch (GET_CODE (cond))
467 case CONST_INT:
468 /* Unconditional branch. */
469 predict_insn_def (last_insn, PRED_UNCONDITIONAL,
470 cond == const0_rtx ? NOT_TAKEN : TAKEN);
471 break;
473 case EQ:
474 case UNEQ:
475 /* Floating point comparisons appears to behave in a very
476 inpredictable way because of special role of = tests in
477 FP code. */
478 if (FLOAT_MODE_P (GET_MODE (XEXP (cond, 0))))
480 /* Comparisons with 0 are often used for booleans and there is
481 nothing usefull to predict about them. */
482 else if (XEXP (cond, 1) == const0_rtx
483 || XEXP (cond, 0) == const0_rtx)
485 else
486 predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, NOT_TAKEN);
487 break;
489 case NE:
490 case LTGT:
491 /* Floating point comparisons appears to behave in a very
492 inpredictable way because of special role of = tests in
493 FP code. */
494 if (FLOAT_MODE_P (GET_MODE (XEXP (cond, 0))))
496 /* Comparisons with 0 are often used for booleans and there is
497 nothing usefull to predict about them. */
498 else if (XEXP (cond, 1) == const0_rtx
499 || XEXP (cond, 0) == const0_rtx)
501 else
502 predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, TAKEN);
503 break;
505 case ORDERED:
506 predict_insn_def (last_insn, PRED_FPOPCODE, TAKEN);
507 break;
509 case UNORDERED:
510 predict_insn_def (last_insn, PRED_FPOPCODE, NOT_TAKEN);
511 break;
513 case LE:
514 case LT:
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, NOT_TAKEN);
518 break;
520 case GE:
521 case GT:
522 if (XEXP (cond, 1) == const0_rtx || XEXP (cond, 1) == const1_rtx
523 || XEXP (cond, 1) == constm1_rtx)
524 predict_insn_def (last_insn, PRED_OPCODE_POSITIVE, TAKEN);
525 break;
527 default:
528 break;
532 /* Attach the combined probability to each conditional jump. */
533 for (i = 0; i < n_basic_blocks; i++)
534 if (GET_CODE (BLOCK_END (i)) == JUMP_INSN
535 && any_condjump_p (BLOCK_END (i)))
536 combine_predictions_for_insn (BLOCK_END (i), BASIC_BLOCK (i));
538 sbitmap_vector_free (post_dominators);
539 sbitmap_vector_free (dominators);
541 estimate_bb_frequencies (loops_info);
544 /* __builtin_expect dropped tokens into the insn stream describing expected
545 values of registers. Generate branch probabilities based off these
546 values. */
548 void
549 expected_value_to_br_prob ()
551 rtx insn, cond, ev = NULL_RTX, ev_reg = NULL_RTX;
553 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
555 switch (GET_CODE (insn))
557 case NOTE:
558 /* Look for expected value notes. */
559 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EXPECTED_VALUE)
561 ev = NOTE_EXPECTED_VALUE (insn);
562 ev_reg = XEXP (ev, 0);
563 delete_insn (insn);
565 continue;
567 case CODE_LABEL:
568 /* Never propagate across labels. */
569 ev = NULL_RTX;
570 continue;
572 case JUMP_INSN:
573 /* Look for simple conditional branches. If we haven't got an
574 expected value yet, no point going further. */
575 if (GET_CODE (insn) != JUMP_INSN || ev == NULL_RTX
576 || ! any_condjump_p (insn))
577 continue;
578 break;
580 default:
581 /* Look for insns that clobber the EV register. */
582 if (ev && reg_set_p (ev_reg, insn))
583 ev = NULL_RTX;
584 continue;
587 /* Collect the branch condition, hopefully relative to EV_REG. */
588 /* ??? At present we'll miss things like
589 (expected_value (eq r70 0))
590 (set r71 -1)
591 (set r80 (lt r70 r71))
592 (set pc (if_then_else (ne r80 0) ...))
593 as canonicalize_condition will render this to us as
594 (lt r70, r71)
595 Could use cselib to try and reduce this further. */
596 cond = XEXP (SET_SRC (pc_set (insn)), 0);
597 cond = canonicalize_condition (insn, cond, 0, NULL, ev_reg);
598 if (! cond || XEXP (cond, 0) != ev_reg
599 || GET_CODE (XEXP (cond, 1)) != CONST_INT)
600 continue;
602 /* Substitute and simplify. Given that the expression we're
603 building involves two constants, we should wind up with either
604 true or false. */
605 cond = gen_rtx_fmt_ee (GET_CODE (cond), VOIDmode,
606 XEXP (ev, 1), XEXP (cond, 1));
607 cond = simplify_rtx (cond);
609 /* Turn the condition into a scaled branch probability. */
610 if (cond != const_true_rtx && cond != const0_rtx)
611 abort ();
612 predict_insn_def (insn, PRED_BUILTIN_EXPECT,
613 cond == const_true_rtx ? TAKEN : NOT_TAKEN);
617 /* This is used to carry information about basic blocks. It is
618 attached to the AUX field of the standard CFG block. */
620 typedef struct block_info_def
622 /* Estimated frequency of execution of basic_block. */
623 volatile double frequency;
625 /* To keep queue of basic blocks to process. */
626 basic_block next;
628 /* True if block needs to be visited in prop_freqency. */
629 int tovisit:1;
631 /* Number of predecessors we need to visit first. */
632 int npredecessors;
633 } *block_info;
635 /* Similar information for edges. */
636 typedef struct edge_info_def
638 /* In case edge is an loopback edge, the probability edge will be reached
639 in case header is. Estimated number of iterations of the loop can be
640 then computed as 1 / (1 - back_edge_prob).
642 Volatile is needed to avoid differences in the optimized and unoptimized
643 builds on machines where FP registers are wider than double. */
644 volatile double back_edge_prob;
645 /* True if the edge is an loopback edge in the natural loop. */
646 int back_edge:1;
647 } *edge_info;
649 #define BLOCK_INFO(B) ((block_info) (B)->aux)
650 #define EDGE_INFO(E) ((edge_info) (E)->aux)
652 /* Helper function for estimate_bb_frequencies.
653 Propagate the frequencies for loops headed by HEAD. */
655 static void
656 propagate_freq (head)
657 basic_block head;
659 basic_block bb = head;
660 basic_block last = bb;
661 edge e;
662 basic_block nextbb;
663 int n;
665 /* For each basic block we need to visit count number of his predecessors
666 we need to visit first. */
667 for (n = 0; n < n_basic_blocks; n++)
669 basic_block bb = BASIC_BLOCK (n);
670 if (BLOCK_INFO (bb)->tovisit)
672 int count = 0;
674 for (e = bb->pred; e; e = e->pred_next)
675 if (BLOCK_INFO (e->src)->tovisit && !(e->flags & EDGE_DFS_BACK))
676 count++;
677 else if (BLOCK_INFO (e->src)->tovisit
678 && rtl_dump_file && !EDGE_INFO (e)->back_edge)
679 fprintf (rtl_dump_file,
680 "Irreducible region hit, ignoring edge to %i->%i\n",
681 e->src->index, bb->index);
682 BLOCK_INFO (bb)->npredecessors = count;
686 BLOCK_INFO (head)->frequency = 1;
687 for (; bb; bb = nextbb)
689 double cyclic_probability = 0, frequency = 0;
691 nextbb = BLOCK_INFO (bb)->next;
692 BLOCK_INFO (bb)->next = NULL;
694 /* Compute frequency of basic block. */
695 if (bb != head)
697 #ifdef ENABLE_CHECKING
698 for (e = bb->pred; e; e = e->pred_next)
699 if (BLOCK_INFO (e->src)->tovisit && !(e->flags & EDGE_DFS_BACK))
700 abort ();
701 #endif
703 for (e = bb->pred; e; e = e->pred_next)
704 if (EDGE_INFO (e)->back_edge)
705 cyclic_probability += EDGE_INFO (e)->back_edge_prob;
706 else if (!(e->flags & EDGE_DFS_BACK))
707 frequency += (e->probability
708 * BLOCK_INFO (e->src)->frequency /
709 REG_BR_PROB_BASE);
711 if (cyclic_probability > 1.0 - 1.0 / REG_BR_PROB_BASE)
712 cyclic_probability = 1.0 - 1.0 / REG_BR_PROB_BASE;
714 BLOCK_INFO (bb)->frequency = frequency / (1 - cyclic_probability);
717 BLOCK_INFO (bb)->tovisit = 0;
719 /* Compute back edge frequencies. */
720 for (e = bb->succ; e; e = e->succ_next)
721 if (e->dest == head)
722 EDGE_INFO (e)->back_edge_prob
723 = ((e->probability * BLOCK_INFO (bb)->frequency)
724 / REG_BR_PROB_BASE);
726 /* Propagate to successor blocks. */
727 for (e = bb->succ; e; e = e->succ_next)
728 if (!(e->flags & EDGE_DFS_BACK)
729 && BLOCK_INFO (e->dest)->npredecessors)
731 BLOCK_INFO (e->dest)->npredecessors--;
732 if (!BLOCK_INFO (e->dest)->npredecessors)
734 if (!nextbb)
735 nextbb = e->dest;
736 else
737 BLOCK_INFO (last)->next = e->dest;
739 last = e->dest;
745 /* Estimate probabilities of loopback edges in loops at same nest level. */
747 static void
748 estimate_loops_at_level (first_loop)
749 struct loop *first_loop;
751 struct loop *l, *loop = first_loop;
753 for (loop = first_loop; loop; loop = loop->next)
755 int n;
756 edge e;
758 estimate_loops_at_level (loop->inner);
760 /* Find current loop back edge and mark it. */
761 for (e = loop->latch->succ; e->dest != loop->header; e = e->succ_next)
764 EDGE_INFO (e)->back_edge = 1;
766 /* In case the loop header is shared, ensure that it is the last
767 one sharing the same header, so we avoid redundant work. */
768 if (loop->shared)
770 for (l = loop->next; l; l = l->next)
771 if (l->header == loop->header)
772 break;
774 if (l)
775 continue;
778 /* Now merge all nodes of all loops with given header as not visited. */
779 for (l = loop->shared ? first_loop : loop; l != loop->next; l = l->next)
780 if (loop->header == l->header)
781 EXECUTE_IF_SET_IN_SBITMAP (l->nodes, 0, n,
782 BLOCK_INFO (BASIC_BLOCK (n))->tovisit = 1
785 propagate_freq (loop->header);
789 /* Convert counts measured by profile driven feedback to frequencies. */
791 static void
792 counts_to_freqs ()
794 HOST_WIDEST_INT count_max = 1;
795 int i;
797 for (i = 0; i < n_basic_blocks; i++)
798 count_max = MAX (BASIC_BLOCK (i)->count, count_max);
800 for (i = -2; i < n_basic_blocks; i++)
802 basic_block bb;
804 if (i == -2)
805 bb = ENTRY_BLOCK_PTR;
806 else if (i == -1)
807 bb = EXIT_BLOCK_PTR;
808 else
809 bb = BASIC_BLOCK (i);
811 bb->frequency = (bb->count * BB_FREQ_MAX + count_max / 2) / count_max;
815 /* Return true if function is likely to be expensive, so there is no point to
816 optimize performance of prologue, epilogue or do inlining at the expense
817 of code size growth. THRESHOLD is the limit of number of isntructions
818 function can execute at average to be still considered not expensive. */
820 bool
821 expensive_function_p (threshold)
822 int threshold;
824 unsigned int sum = 0;
825 int i;
826 unsigned int limit;
828 /* We can not compute accurately for large thresholds due to scaled
829 frequencies. */
830 if (threshold > BB_FREQ_MAX)
831 abort ();
833 /* Frequencies are out of range. This either means that function contains
834 internal loop executing more than BB_FREQ_MAX times or profile feedback
835 is available and function has not been executed at all. */
836 if (ENTRY_BLOCK_PTR->frequency == 0)
837 return true;
839 /* Maximally BB_FREQ_MAX^2 so overflow won't happen. */
840 limit = ENTRY_BLOCK_PTR->frequency * threshold;
841 for (i = 0; i < n_basic_blocks; i++)
843 basic_block bb = BASIC_BLOCK (i);
844 rtx insn;
846 for (insn = bb->head; insn != NEXT_INSN (bb->end);
847 insn = NEXT_INSN (insn))
848 if (active_insn_p (insn))
850 sum += bb->frequency;
851 if (sum > limit)
852 return true;
856 return false;
859 /* Estimate basic blocks frequency by given branch probabilities. */
861 static void
862 estimate_bb_frequencies (loops)
863 struct loops *loops;
865 int i;
866 double freq_max = 0;
868 mark_dfs_back_edges ();
869 if (flag_branch_probabilities)
871 counts_to_freqs ();
872 return;
875 /* Fill in the probability values in flowgraph based on the REG_BR_PROB
876 notes. */
877 for (i = 0; i < n_basic_blocks; i++)
879 rtx last_insn = BLOCK_END (i);
881 if (GET_CODE (last_insn) != JUMP_INSN || !any_condjump_p (last_insn)
882 /* Avoid handling of conditional jumps jumping to fallthru edge. */
883 || BASIC_BLOCK (i)->succ->succ_next == NULL)
885 /* We can predict only conditional jumps at the moment.
886 Expect each edge to be equally probable.
887 ?? In the future we want to make abnormal edges improbable. */
888 int nedges = 0;
889 edge e;
891 for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
893 nedges++;
894 if (e->probability != 0)
895 break;
897 if (!e)
898 for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
899 e->probability = (REG_BR_PROB_BASE + nedges / 2) / nedges;
903 ENTRY_BLOCK_PTR->succ->probability = REG_BR_PROB_BASE;
905 /* Set up block info for each basic block. */
906 alloc_aux_for_blocks (sizeof (struct block_info_def));
907 alloc_aux_for_edges (sizeof (struct edge_info_def));
908 for (i = -2; i < n_basic_blocks; i++)
910 edge e;
911 basic_block bb;
913 if (i == -2)
914 bb = ENTRY_BLOCK_PTR;
915 else if (i == -1)
916 bb = EXIT_BLOCK_PTR;
917 else
918 bb = BASIC_BLOCK (i);
920 BLOCK_INFO (bb)->tovisit = 0;
921 for (e = bb->succ; e; e = e->succ_next)
922 EDGE_INFO (e)->back_edge_prob = ((double) e->probability
923 / REG_BR_PROB_BASE);
926 /* First compute probabilities locally for each loop from innermost
927 to outermost to examine probabilities for back edges. */
928 estimate_loops_at_level (loops->tree_root);
930 /* Now fake loop around whole function to finalize probabilities. */
931 for (i = 0; i < n_basic_blocks; i++)
932 BLOCK_INFO (BASIC_BLOCK (i))->tovisit = 1;
934 BLOCK_INFO (ENTRY_BLOCK_PTR)->tovisit = 1;
935 BLOCK_INFO (EXIT_BLOCK_PTR)->tovisit = 1;
936 propagate_freq (ENTRY_BLOCK_PTR);
938 for (i = 0; i < n_basic_blocks; i++)
939 if (BLOCK_INFO (BASIC_BLOCK (i))->frequency > freq_max)
940 freq_max = BLOCK_INFO (BASIC_BLOCK (i))->frequency;
942 for (i = -2; i < n_basic_blocks; i++)
944 basic_block bb;
945 volatile double tmp;
947 if (i == -2)
948 bb = ENTRY_BLOCK_PTR;
949 else if (i == -1)
950 bb = EXIT_BLOCK_PTR;
951 else
952 bb = BASIC_BLOCK (i);
954 /* ??? Prevent rounding differences due to optimization on x86. */
955 tmp = BLOCK_INFO (bb)->frequency * BB_FREQ_MAX;
956 tmp /= freq_max;
957 tmp += 0.5;
958 bb->frequency = tmp;
961 free_aux_for_blocks ();
962 free_aux_for_edges ();