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
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
&& (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
);
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. */
223 combine_predictions_for_insn (insn
, bb
)
227 rtx prob_note
= find_reg_note (insn
, REG_BR_PROB
, 0);
228 rtx
*pnote
= ®_NOTES (insn
);
230 int best_probability
= PROB_EVEN
;
231 int best_predictor
= END_PREDICTORS
;
232 int combined_probability
= REG_BR_PROB_BASE
/ 2;
234 bool first_match
= false;
238 fprintf (rtl_dump_file
, "Predictions for insn %i bb %i\n", INSN_UID (insn
),
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));
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. */
260 /* If one probability is 0% and one 100%, avoid division by zero. */
261 combined_probability
= REG_BR_PROB_BASE
/ 2;
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
)
275 dump_prediction (PRED_NO_PREDICTION
, combined_probability
, bb
, true);
278 dump_prediction (PRED_DS_THEORY
, combined_probability
, bb
, !first_match
);
279 dump_prediction (PRED_FIRST_MATCH
, best_probability
, bb
, first_match
);
283 combined_probability
= best_probability
;
284 dump_prediction (PRED_COMBINED
, combined_probability
, bb
, true);
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);
298 pnote
= &XEXP (*pnote
, 1);
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
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
325 estimate_probability (loops_info
)
326 struct loops
*loops_info
;
328 sbitmap
*dominators
, *post_dominators
;
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
339 for (i
= 0; i
< loops_info
->num
; i
++)
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;
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
)
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. */
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
))
373 - predictor_info
[(int) PRED_LOOP_EXIT
].hitrate
)
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
;
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
)
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
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
))
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
))
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
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
);
443 cond
= get_condition (last_insn
, &earliest
);
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
);
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
))
468 /* Unconditional branch. */
469 predict_insn_def (last_insn
, PRED_UNCONDITIONAL
,
470 cond
== const0_rtx
? NOT_TAKEN
: TAKEN
);
475 /* Floating point comparisons appears to behave in a very
476 inpredictable way because of special role of = tests in
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
)
486 predict_insn_def (last_insn
, PRED_OPCODE_NONEQUAL
, NOT_TAKEN
);
491 /* Floating point comparisons appears to behave in a very
492 inpredictable way because of special role of = tests in
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
)
502 predict_insn_def (last_insn
, PRED_OPCODE_NONEQUAL
, TAKEN
);
506 predict_insn_def (last_insn
, PRED_FPOPCODE
, TAKEN
);
510 predict_insn_def (last_insn
, PRED_FPOPCODE
, 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
, NOT_TAKEN
);
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
);
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
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
))
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);
568 /* Never propagate across labels. */
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
))
581 /* Look for insns that clobber the EV register. */
582 if (ev
&& reg_set_p (ev_reg
, insn
))
587 /* Collect the branch condition, hopefully relative to EV_REG. */
588 /* ??? At present we'll miss things like
589 (expected_value (eq r70 0))
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
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
)
602 /* Substitute and simplify. Given that the expression we're
603 building involves two constants, we should wind up with either
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
)
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. */
628 /* True if block needs to be visited in prop_freqency. */
631 /* Number of predecessors we need to visit first. */
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. */
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. */
656 propagate_freq (head
)
659 basic_block bb
= head
;
660 basic_block last
= bb
;
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
)
674 for (e
= bb
->pred
; e
; e
= e
->pred_next
)
675 if (BLOCK_INFO (e
->src
)->tovisit
&& !(e
->flags
& EDGE_DFS_BACK
))
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. */
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
))
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
/
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
)
722 EDGE_INFO (e
)->back_edge_prob
723 = ((e
->probability
* BLOCK_INFO (bb
)->frequency
)
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
)
737 BLOCK_INFO (last
)->next
= e
->dest
;
745 /* Estimate probabilities of loopback edges in loops at same nest level. */
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
)
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. */
770 for (l
= loop
->next
; l
; l
= l
->next
)
771 if (l
->header
== loop
->header
)
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. */
794 HOST_WIDEST_INT count_max
= 1;
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
++)
805 bb
= ENTRY_BLOCK_PTR
;
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. */
821 expensive_function_p (threshold
)
824 unsigned int sum
= 0;
828 /* We can not compute accurately for large thresholds due to scaled
830 if (threshold
> BB_FREQ_MAX
)
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)
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
);
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
;
859 /* Estimate basic blocks frequency by given branch probabilities. */
862 estimate_bb_frequencies (loops
)
868 mark_dfs_back_edges ();
869 if (flag_branch_probabilities
)
875 /* Fill in the probability values in flowgraph based on the REG_BR_PROB
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. */
891 for (e
= BASIC_BLOCK (i
)->succ
; e
; e
= e
->succ_next
)
894 if (e
->probability
!= 0)
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
++)
914 bb
= ENTRY_BLOCK_PTR
;
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
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
++)
948 bb
= ENTRY_BLOCK_PTR
;
952 bb
= BASIC_BLOCK (i
);
954 /* ??? Prevent rounding differences due to optimization on x86. */
955 tmp
= BLOCK_INFO (bb
)->frequency
* BB_FREQ_MAX
;
961 free_aux_for_blocks ();
962 free_aux_for_edges ();