predict.c (estimate_probability): Reorganize opcode heuristics.
[gcc.git] / gcc / predict.c
1 /* Branch prediction routines for the GNU compiler.
2 Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
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. */
20
21 /* References:
22
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.
29
30 */
31
32
33 #include "config.h"
34 #include "system.h"
35 #include "tree.h"
36 #include "rtl.h"
37 #include "tm_p.h"
38 #include "hard-reg-set.h"
39 #include "basic-block.h"
40 #include "insn-config.h"
41 #include "regs.h"
42 #include "flags.h"
43 #include "output.h"
44 #include "function.h"
45 #include "except.h"
46 #include "toplev.h"
47 #include "recog.h"
48 #include "expr.h"
49 #include "predict.h"
50
51 /* Random guesstimation given names. */
52 #define PROB_NEVER (0)
53 #define PROB_VERY_UNLIKELY (REG_BR_PROB_BASE / 10 - 1)
54 #define PROB_UNLIKELY (REG_BR_PROB_BASE * 4 / 10 - 1)
55 #define PROB_EVEN (REG_BR_PROB_BASE / 2)
56 #define PROB_LIKELY (REG_BR_PROB_BASE - PROB_UNLIKELY)
57 #define PROB_VERY_LIKELY (REG_BR_PROB_BASE - PROB_VERY_UNLIKELY)
58 #define PROB_ALWAYS (REG_BR_PROB_BASE)
59
60 static void combine_predictions_for_insn PARAMS ((rtx, basic_block));
61 static void dump_prediction PARAMS ((enum br_predictor, int,
62 basic_block, int));
63 static void estimate_loops_at_level PARAMS ((struct loop *loop));
64 static void propagate_freq PARAMS ((basic_block));
65 static void estimate_bb_frequencies PARAMS ((struct loops *));
66 static void counts_to_freqs PARAMS ((void));
67
68 /* Information we hold about each branch predictor.
69 Filled using information from predict.def. */
70 struct predictor_info
71 {
72 const char *const name; /* Name used in the debugging dumps. */
73 const int hitrate; /* Expected hitrate used by
74 predict_insn_def call. */
75 const int flags;
76 };
77
78 /* Use given predictor without Dempster-Shaffer theory if it matches
79 using first_match heuristics. */
80 #define PRED_FLAG_FIRST_MATCH 1
81
82 /* Recompute hitrate in percent to our representation. */
83
84 #define HITRATE(VAL) ((int)((VAL) * REG_BR_PROB_BASE + 50) / 100)
85
86 #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) {NAME, HITRATE, FLAGS},
87 static const struct predictor_info predictor_info[] = {
88 #include "predict.def"
89
90 /* Upper bound on predictors. */
91 {NULL, 0, 0}
92 };
93 #undef DEF_PREDICTOR
94
95 void
96 predict_insn (insn, predictor, probability)
97 rtx insn;
98 int probability;
99 enum br_predictor predictor;
100 {
101 if (!any_condjump_p (insn))
102 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));
109 }
110
111 /* Predict insn by given predictor. */
112 void
113 predict_insn_def (insn, predictor, taken)
114 rtx insn;
115 enum br_predictor predictor;
116 enum prediction taken;
117 {
118 int probability = predictor_info[(int) predictor].hitrate;
119 if (taken != TAKEN)
120 probability = REG_BR_PROB_BASE - probability;
121 predict_insn (insn, predictor, probability);
122 }
123
124 /* Predict edge E with given probability if possible. */
125 void
126 predict_edge (e, predictor, probability)
127 edge e;
128 int probability;
129 enum br_predictor predictor;
130 {
131 rtx last_insn;
132 last_insn = e->src->end;
133
134 /* We can store the branch prediction information only about
135 conditional jumps. */
136 if (!any_condjump_p (last_insn))
137 return;
138
139 /* We always store probability of branching. */
140 if (e->flags & EDGE_FALLTHRU)
141 probability = REG_BR_PROB_BASE - probability;
142
143 predict_insn (last_insn, predictor, probability);
144 }
145
146 /* Predict edge E by given predictor if possible. */
147 void
148 predict_edge_def (e, predictor, taken)
149 edge e;
150 enum br_predictor predictor;
151 enum prediction taken;
152 {
153 int probability = predictor_info[(int) predictor].hitrate;
154
155 if (taken != TAKEN)
156 probability = REG_BR_PROB_BASE - probability;
157 predict_edge (e, predictor, probability);
158 }
159
160 /* Invert all branch predictions or probability notes in the INSN. This needs
161 to be done each time we invert the condition used by the jump. */
162 void
163 invert_br_probabilities (insn)
164 rtx insn;
165 {
166 rtx note = REG_NOTES (insn);
167
168 while (note)
169 {
170 if (REG_NOTE_KIND (note) == REG_BR_PROB)
171 XEXP (note, 0) = GEN_INT (REG_BR_PROB_BASE - INTVAL (XEXP (note, 0)));
172 else if (REG_NOTE_KIND (note) == REG_BR_PRED)
173 XEXP (XEXP (note, 0), 1)
174 = GEN_INT (REG_BR_PROB_BASE - INTVAL (XEXP (XEXP (note, 0), 1)));
175 note = XEXP (note, 1);
176 }
177 }
178
179 /* Dump information about the branch prediction to the output file. */
180 static void
181 dump_prediction (predictor, probability, bb, used)
182 enum br_predictor predictor;
183 int probability;
184 basic_block bb;
185 int used;
186 {
187 edge e = bb->succ;
188
189 if (!rtl_dump_file)
190 return;
191
192 while (e->flags & EDGE_FALLTHRU)
193 e = e->succ_next;
194
195 fprintf (rtl_dump_file, " %s heuristics%s: %.1f%%",
196 predictor_info[predictor].name,
197 used ? "" : " (ignored)",
198 probability * 100.0 / REG_BR_PROB_BASE);
199
200 if (bb->count)
201 {
202 fprintf (rtl_dump_file, " exec ");
203 fprintf (rtl_dump_file, HOST_WIDEST_INT_PRINT_DEC,
204 (HOST_WIDEST_INT) bb->count);
205 fprintf (rtl_dump_file, " hit ");
206 fprintf (rtl_dump_file, HOST_WIDEST_INT_PRINT_DEC,
207 (HOST_WIDEST_INT) e->count);
208 fprintf (rtl_dump_file, " (%.1f%%)",
209 e->count * 100.0 / bb->count);
210 }
211 fprintf (rtl_dump_file, "\n");
212 }
213
214 /* Combine all REG_BR_PRED notes into single probability and attach REG_BR_PROB
215 note if not already present. Remove now useless REG_BR_PRED notes. */
216 static void
217 combine_predictions_for_insn (insn, bb)
218 rtx insn;
219 basic_block bb;
220 {
221 rtx prob_note = find_reg_note (insn, REG_BR_PROB, 0);
222 rtx *pnote = &REG_NOTES (insn);
223 rtx note = REG_NOTES (insn);
224 int best_probability = PROB_EVEN;
225 int best_predictor = END_PREDICTORS;
226 int combined_probability = REG_BR_PROB_BASE / 2;
227 int d;
228 bool first_match = false;
229 bool found = false;
230
231 if (rtl_dump_file)
232 fprintf (rtl_dump_file, "Predictions for insn %i bb %i\n", INSN_UID (insn),
233 bb->index);
234
235 /* We implement "first match" heuristics and use probability guessed
236 by predictor with smallest index. In the future we will use better
237 probability combination techniques. */
238 while (note)
239 {
240 if (REG_NOTE_KIND (note) == REG_BR_PRED)
241 {
242 int predictor = INTVAL (XEXP (XEXP (note, 0), 0));
243 int probability = INTVAL (XEXP (XEXP (note, 0), 1));
244
245 found = true;
246 if (best_predictor > predictor)
247 best_probability = probability, best_predictor = predictor;
248
249 d = (combined_probability * probability
250 + (REG_BR_PROB_BASE - combined_probability)
251 * (REG_BR_PROB_BASE - probability));
252 /* An FP math to avoid overflows of 32bit integers. */
253 combined_probability = (((double)combined_probability) * probability
254 * REG_BR_PROB_BASE / d + 0.5);
255 }
256 note = XEXP (note, 1);
257 }
258
259 /* Decide heuristic to use. In case we didn't match anything, use
260 no_prediction heuristic, in case we did match, use either
261 first match or Dempster-Shaffer theory depending on the flags. */
262
263 if (predictor_info [best_predictor].flags & PRED_FLAG_FIRST_MATCH)
264 first_match = true;
265
266 if (!found)
267 dump_prediction (PRED_NO_PREDICTION, combined_probability, bb, true);
268 else
269 {
270 dump_prediction (PRED_DS_THEORY, combined_probability, bb,
271 !first_match);
272 dump_prediction (PRED_FIRST_MATCH, best_probability, bb, first_match);
273 }
274
275 if (first_match)
276 combined_probability = best_probability;
277 dump_prediction (PRED_COMBINED, combined_probability, bb, true);
278
279 while (*pnote)
280 {
281 if (REG_NOTE_KIND (*pnote) == REG_BR_PRED)
282 {
283 int predictor = INTVAL (XEXP (XEXP (*pnote, 0), 0));
284 int probability = INTVAL (XEXP (XEXP (*pnote, 0), 1));
285
286 dump_prediction (predictor, probability, bb,
287 !first_match || best_predictor == predictor);
288 *pnote = XEXP (*pnote, 1);
289 }
290 else
291 pnote = &XEXP (*pnote, 1);
292 }
293 if (!prob_note)
294 {
295 REG_NOTES (insn)
296 = gen_rtx_EXPR_LIST (REG_BR_PROB,
297 GEN_INT (combined_probability), REG_NOTES (insn));
298 /* Save the prediction into CFG in case we are seeing non-degenerated
299 conditional jump. */
300 if (bb->succ->succ_next)
301 {
302 BRANCH_EDGE (bb)->probability = combined_probability;
303 FALLTHRU_EDGE (bb)->probability = REG_BR_PROB_BASE - combined_probability;
304 }
305 }
306 }
307
308 /* Statically estimate the probability that a branch will be taken.
309 ??? In the next revision there will be a number of other predictors added
310 from the above references. Further, each heuristic will be factored out
311 into its own function for clarity (and to facilitate the combination of
312 predictions). */
313
314 void
315 estimate_probability (loops_info)
316 struct loops *loops_info;
317 {
318 sbitmap *dominators, *post_dominators;
319 int i;
320 int found_noreturn = 0;
321
322 dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
323 post_dominators = sbitmap_vector_alloc (n_basic_blocks, n_basic_blocks);
324 calculate_dominance_info (NULL, dominators, CDI_DOMINATORS);
325 calculate_dominance_info (NULL, post_dominators, CDI_POST_DOMINATORS);
326
327 /* Try to predict out blocks in a loop that are not part of a
328 natural loop. */
329 for (i = 0; i < loops_info->num; i++)
330 {
331 int j;
332 int exits;
333 struct loop *loop = &loops_info->array[i];
334
335 flow_loop_scan (loops_info, loop, LOOP_EXIT_EDGES);
336 exits = loop->num_exits;
337
338 for (j = loop->first->index;
339 j <= loop->last->index;
340 ++j)
341 {
342 if (TEST_BIT (loop->nodes, j))
343 {
344 int header_found = 0;
345 edge e;
346
347 /* Loop branch heuristics - predict as taken an edge back to
348 a loop's head. */
349 for (e = BASIC_BLOCK(j)->succ; e; e = e->succ_next)
350 if (e->dest == loop->header
351 && e->src == loop->latch)
352 {
353 header_found = 1;
354 predict_edge_def (e, PRED_LOOP_BRANCH, TAKEN);
355 }
356 /* Loop exit heuristics - predict as not taken an edge
357 exiting the loop if the conditinal has no loop header
358 successors. */
359 if (!header_found)
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))
363 predict_edge (e, PRED_LOOP_EXIT,
364 (REG_BR_PROB_BASE
365 - predictor_info [(int)PRED_LOOP_EXIT].hitrate)
366 / exits);
367 }
368 }
369 }
370
371 /* Attempt to predict conditional jumps using a number of heuristics. */
372 for (i = 0; i < n_basic_blocks; i++)
373 {
374 basic_block bb = BASIC_BLOCK (i);
375 rtx last_insn = bb->end;
376 rtx cond, earliest;
377 edge e;
378
379 /* If block has no successor, predict all possible paths to
380 it as improbable, as the block contains a call to a noreturn
381 function and thus can be executed only once. */
382 if (bb->succ == NULL && !found_noreturn)
383 {
384 int y;
385
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 sane.
389 */
390 found_noreturn = 1;
391 for (y = 0; y < n_basic_blocks; y++)
392 if (!TEST_BIT (post_dominators[y], i))
393 {
394 for (e = BASIC_BLOCK (y)->succ; e; e = e->succ_next)
395 if (e->dest->index >= 0
396 && TEST_BIT (post_dominators[e->dest->index], i))
397 predict_edge_def (e, PRED_NORETURN, NOT_TAKEN);
398 }
399 }
400
401 if (GET_CODE (last_insn) != JUMP_INSN
402 || ! any_condjump_p (last_insn))
403 continue;
404
405 for (e = bb->succ; e; e = e->succ_next)
406 {
407 /* Predict edges to blocks that return immediately to be
408 improbable. These are usually used to signal error states. */
409 if (e->dest == EXIT_BLOCK_PTR
410 || (e->dest->succ && !e->dest->succ->succ_next
411 && e->dest->succ->dest == EXIT_BLOCK_PTR))
412 predict_edge_def (e, PRED_ERROR_RETURN, NOT_TAKEN);
413
414 /* Look for block we are guarding (ie we dominate it,
415 but it doesn't postdominate us). */
416 if (e->dest != EXIT_BLOCK_PTR
417 && e->dest != bb
418 && TEST_BIT (dominators[e->dest->index], e->src->index)
419 && !TEST_BIT (post_dominators[e->src->index], e->dest->index))
420 {
421 rtx insn;
422 /* The call heuristic claims that a guarded function call
423 is improbable. This is because such calls are often used
424 to signal exceptional situations such as printing error
425 messages. */
426 for (insn = e->dest->head; insn != NEXT_INSN (e->dest->end);
427 insn = NEXT_INSN (insn))
428 if (GET_CODE (insn) == CALL_INSN
429 /* Constant and pure calls are hardly used to signalize
430 something exceptional. */
431 && ! CONST_OR_PURE_CALL_P (insn))
432 {
433 predict_edge_def (e, PRED_CALL, NOT_TAKEN);
434 break;
435 }
436 }
437 }
438
439 cond = get_condition (last_insn, &earliest);
440 if (! cond)
441 continue;
442
443 /* Try "pointer heuristic."
444 A comparison ptr == 0 is predicted as false.
445 Similarly, a comparison ptr1 == ptr2 is predicted as false. */
446 if (GET_RTX_CLASS (GET_CODE (cond)) == '<'
447 && ((REG_P (XEXP (cond, 0)) && REG_POINTER (XEXP (cond, 0)))
448 || (REG_P (XEXP (cond, 1)) && REG_POINTER (XEXP (cond, 1)))))
449 switch (GET_CODE (cond))
450 {
451 case EQ:
452 predict_insn_def (last_insn, PRED_POINTER, NOT_TAKEN);
453 break;
454 case NE:
455 predict_insn_def (last_insn, PRED_POINTER, TAKEN);
456 break;
457 default:
458 break;
459 }
460 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))
466 {
467 case CONST_INT:
468 /* Unconditional branch. */
469 predict_insn_def (last_insn, PRED_UNCONDITIONAL,
470 cond == const0_rtx ? NOT_TAKEN : TAKEN);
471 break;
472
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))))
479 ;
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 || XEXP (cond, 0) == const0_rtx)
483 ;
484 else
485 predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, NOT_TAKEN);
486 break;
487 case NE:
488 case LTGT:
489 /* Floating point comparisons appears to behave in a very
490 inpredictable way because of special role of = tests in
491 FP code. */
492 if (FLOAT_MODE_P (GET_MODE (XEXP (cond, 0))))
493 ;
494 /* Comparisons with 0 are often used for booleans and there is
495 nothing usefull to predict about them. */
496 else if (XEXP (cond, 1) == const0_rtx || XEXP (cond, 0) == const0_rtx)
497 ;
498 else
499 predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, TAKEN);
500 break;
501 case ORDERED:
502 predict_insn_def (last_insn, PRED_FPOPCODE, TAKEN);
503 break;
504 case UNORDERED:
505 predict_insn_def (last_insn, PRED_FPOPCODE, NOT_TAKEN);
506 break;
507 case LE:
508 case LT:
509 if (XEXP (cond, 1) == const0_rtx || XEXP (cond, 1) == const1_rtx
510 || XEXP (cond, 1) == constm1_rtx)
511 predict_insn_def (last_insn, PRED_OPCODE_POSITIVE, NOT_TAKEN);
512 break;
513 case GE:
514 case GT:
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);
518 break;
519
520 default:
521 break;
522 }
523 }
524
525 /* Attach the combined probability to each conditional jump. */
526 for (i = 0; i < n_basic_blocks; i++)
527 {
528 rtx last_insn = BLOCK_END (i);
529
530 if (GET_CODE (last_insn) != JUMP_INSN
531 || ! any_condjump_p (last_insn))
532 continue;
533 combine_predictions_for_insn (last_insn, BASIC_BLOCK (i));
534 }
535 sbitmap_vector_free (post_dominators);
536 sbitmap_vector_free (dominators);
537
538 estimate_bb_frequencies (loops_info);
539 }
540 \f
541 /* __builtin_expect dropped tokens into the insn stream describing
542 expected values of registers. Generate branch probabilities
543 based off these values. */
544
545 void
546 expected_value_to_br_prob ()
547 {
548 rtx insn, cond, ev = NULL_RTX, ev_reg = NULL_RTX;
549
550 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
551 {
552 switch (GET_CODE (insn))
553 {
554 case NOTE:
555 /* Look for expected value notes. */
556 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EXPECTED_VALUE)
557 {
558 ev = NOTE_EXPECTED_VALUE (insn);
559 ev_reg = XEXP (ev, 0);
560 delete_insn (insn);
561 }
562 continue;
563
564 case CODE_LABEL:
565 /* Never propagate across labels. */
566 ev = NULL_RTX;
567 continue;
568
569 default:
570 /* Look for insns that clobber the EV register. */
571 if (ev && reg_set_p (ev_reg, insn))
572 ev = NULL_RTX;
573 continue;
574
575 case JUMP_INSN:
576 /* Look for simple conditional branches. If we haven't got an
577 expected value yet, no point going further. */
578 if (GET_CODE (insn) != JUMP_INSN || ev == NULL_RTX)
579 continue;
580 if (! any_condjump_p (insn))
581 continue;
582 break;
583 }
584
585 /* Collect the branch condition, hopefully relative to EV_REG. */
586 /* ??? At present we'll miss things like
587 (expected_value (eq r70 0))
588 (set r71 -1)
589 (set r80 (lt r70 r71))
590 (set pc (if_then_else (ne r80 0) ...))
591 as canonicalize_condition will render this to us as
592 (lt r70, r71)
593 Could use cselib to try and reduce this further. */
594 cond = XEXP (SET_SRC (pc_set (insn)), 0);
595 cond = canonicalize_condition (insn, cond, 0, NULL, ev_reg);
596 if (! cond
597 || XEXP (cond, 0) != ev_reg
598 || GET_CODE (XEXP (cond, 1)) != CONST_INT)
599 continue;
600
601 /* Substitute and simplify. Given that the expression we're
602 building involves two constants, we should wind up with either
603 true or false. */
604 cond = gen_rtx_fmt_ee (GET_CODE (cond), VOIDmode,
605 XEXP (ev, 1), XEXP (cond, 1));
606 cond = simplify_rtx (cond);
607
608 /* Turn the condition into a scaled branch probability. */
609 if (cond != const_true_rtx && cond != const0_rtx)
610 abort ();
611 predict_insn_def (insn, PRED_BUILTIN_EXPECT,
612 cond == const_true_rtx ? TAKEN : NOT_TAKEN);
613 }
614 }
615 \f
616 /* This is used to carry information about basic blocks. It is
617 attached to the AUX field of the standard CFG block. */
618
619 typedef struct block_info_def
620 {
621 /* Estimated frequency of execution of basic_block. */
622 volatile double frequency;
623
624 /* To keep queue of basic blocks to process. */
625 basic_block next;
626
627 /* True if block needs to be visited in prop_freqency. */
628 int tovisit:1;
629
630 /* Number of predecessors we need to visit first. */
631 int npredecessors;
632 } *block_info;
633
634 /* Similar information for edges. */
635 typedef struct edge_info_def
636 {
637 /* In case edge is an loopback edge, the probability edge will be reached
638 in case header is. Estimated number of iterations of the loop can be
639 then computed as 1 / (1 - back_edge_prob).
640
641 Volatile is needed to avoid differences in the optimized and unoptimized
642 builds on machines where FP registers are wider than double. */
643 volatile double back_edge_prob;
644 /* True if the edge is an loopback edge in the natural loop. */
645 int back_edge:1;
646 } *edge_info;
647
648 #define BLOCK_INFO(B) ((block_info) (B)->aux)
649 #define EDGE_INFO(E) ((edge_info) (E)->aux)
650
651 /* Helper function for estimate_bb_frequencies.
652 Propagate the frequencies for loops headed by HEAD. */
653 static void
654 propagate_freq (head)
655 basic_block head;
656 {
657 basic_block bb = head;
658 basic_block last = bb;
659 edge e;
660 basic_block nextbb;
661 int n;
662
663 /* For each basic block we need to visit count number of his predecessors
664 we need to visit first. */
665 for (n = 0; n < n_basic_blocks; n++)
666 {
667 basic_block bb = BASIC_BLOCK (n);
668 if (BLOCK_INFO (bb)->tovisit)
669 {
670 int count = 0;
671 for (e = bb->pred; e; e = e->pred_next)
672 if (BLOCK_INFO (e->src)->tovisit && !(e->flags & EDGE_DFS_BACK))
673 count++;
674 else if (BLOCK_INFO (e->src)->tovisit
675 && rtl_dump_file && !EDGE_INFO (e)->back_edge)
676 fprintf (rtl_dump_file,
677 "Irreducible region hit, ignoring edge to %i->%i\n",
678 e->src->index, bb->index);
679 BLOCK_INFO (bb)->npredecessors = count;
680 }
681 }
682
683 BLOCK_INFO (head)->frequency = 1;
684 for (; bb; bb = nextbb)
685 {
686 volatile double cyclic_probability = 0, frequency = 0;
687
688 nextbb = BLOCK_INFO (bb)->next;
689 BLOCK_INFO (bb)->next = NULL;
690
691 /* Compute frequency of basic block. */
692 if (bb != head)
693 {
694 #ifdef ENABLE_CHECKING
695 for (e = bb->pred; e; e = e->pred_next)
696 if (BLOCK_INFO (e->src)->tovisit && !(e->flags & EDGE_DFS_BACK))
697 abort ();
698 #endif
699
700 for (e = bb->pred; e; e = e->pred_next)
701 if (EDGE_INFO (e)->back_edge)
702 cyclic_probability += EDGE_INFO (e)->back_edge_prob;
703 else if (!(e->flags & EDGE_DFS_BACK))
704 frequency += (e->probability
705 * BLOCK_INFO (e->src)->frequency /
706 REG_BR_PROB_BASE);
707
708 if (cyclic_probability > 1.0 - 1.0 / REG_BR_PROB_BASE)
709 cyclic_probability = 1.0 - 1.0 / REG_BR_PROB_BASE;
710
711 BLOCK_INFO (bb)->frequency = frequency / (1 - cyclic_probability);
712 }
713
714 BLOCK_INFO (bb)->tovisit = 0;
715
716 /* Compute back edge frequencies. */
717 for (e = bb->succ; e; e = e->succ_next)
718 if (e->dest == head)
719 EDGE_INFO (e)->back_edge_prob = (e->probability
720 * BLOCK_INFO (bb)->frequency
721 / REG_BR_PROB_BASE);
722
723 /* Propagate to successor blocks. */
724 for (e = bb->succ; e; e = e->succ_next)
725 if (!(e->flags & EDGE_DFS_BACK)
726 && BLOCK_INFO (e->dest)->npredecessors)
727 {
728 BLOCK_INFO (e->dest)->npredecessors--;
729 if (!BLOCK_INFO (e->dest)->npredecessors)
730 {
731 if (!nextbb)
732 nextbb = e->dest;
733 else
734 BLOCK_INFO (last)->next = e->dest;
735 last = e->dest;
736 }
737 }
738 }
739 }
740
741 /* Estimate probabilities of loopback edges in loops at same nest level. */
742 static void
743 estimate_loops_at_level (first_loop)
744 struct loop *first_loop;
745 {
746 struct loop *l, *loop = first_loop;
747
748 for (loop = first_loop; loop; loop = loop->next)
749 {
750 int n;
751 edge e;
752
753 estimate_loops_at_level (loop->inner);
754
755 /* Find current loop back edge and mark it. */
756 for (e = loop->latch->succ; e->dest != loop->header; e = e->succ_next);
757
758 EDGE_INFO (e)->back_edge = 1;
759
760 /* In case the loop header is shared, ensure that it is the last
761 one sharing the same header, so we avoid redundant work. */
762 if (loop->shared)
763 {
764 for (l = loop->next; l; l = l->next)
765 if (l->header == loop->header)
766 break;
767 if (l)
768 continue;
769 }
770
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
776 );
777 propagate_freq (loop->header);
778 }
779 }
780
781 /* Convert counts measured by profile driven feedback to frequencies. */
782 static void
783 counts_to_freqs ()
784 {
785 HOST_WIDEST_INT count_max = 1;
786 int i;
787
788 for (i = 0; i < n_basic_blocks; i++)
789 if (BASIC_BLOCK (i)->count > count_max)
790 count_max = BASIC_BLOCK (i)->count;
791
792 for (i = -2; i < n_basic_blocks; i++)
793 {
794 basic_block bb;
795 if (i == -2)
796 bb = ENTRY_BLOCK_PTR;
797 else if (i == -1)
798 bb = EXIT_BLOCK_PTR;
799 else
800 bb = BASIC_BLOCK (i);
801 bb->frequency = ((bb->count * BB_FREQ_MAX + count_max / 2)
802 / count_max);
803 }
804 }
805
806 /* Return true if function is likely to be expensive, so there is no point
807 to optimizer performance of prologue, epilogue or do inlining at the
808 expense of code size growth. THRESHOLD is the limit of number
809 of isntructions function can execute at average to be still considered
810 not expensive. */
811 bool
812 expensive_function_p (threshold)
813 int threshold;
814 {
815 unsigned int sum = 0;
816 int i;
817 unsigned int limit;
818
819 /* We can not compute accurately for large thresholds due to scaled
820 frequencies. */
821 if (threshold > BB_FREQ_MAX)
822 abort ();
823
824 /* Frequencies are out of range. This either means that function contains
825 internal loop executing more than BB_FREQ_MAX times or profile feedback
826 is available and function has not been executed at all. */
827 if (ENTRY_BLOCK_PTR->frequency == 0)
828 return true;
829
830 /* Maximally BB_FREQ_MAX^2 so overflow won't happen. */
831 limit = ENTRY_BLOCK_PTR->frequency * threshold;
832 for (i = 0; i < n_basic_blocks; i++)
833 {
834 basic_block bb = BASIC_BLOCK (i);
835 rtx insn;
836
837 for (insn = bb->head; insn != NEXT_INSN (bb->end);
838 insn = NEXT_INSN (insn))
839 {
840 if (active_insn_p (insn))
841 {
842 sum += bb->frequency;
843 if (sum > limit)
844 return true;
845 }
846 }
847 }
848 return false;
849 }
850
851 /* Estimate basic blocks frequency by given branch probabilities. */
852 static void
853 estimate_bb_frequencies (loops)
854 struct loops *loops;
855 {
856 int i;
857 double freq_max = 0;
858
859 mark_dfs_back_edges ();
860 if (flag_branch_probabilities)
861 {
862 counts_to_freqs ();
863 return;
864 }
865
866 /* Fill in the probability values in flowgraph based on the REG_BR_PROB
867 notes. */
868 for (i = 0; i < n_basic_blocks; i++)
869 {
870 rtx last_insn = BLOCK_END (i);
871 int probability;
872 edge fallthru, branch;
873
874 if (GET_CODE (last_insn) != JUMP_INSN || !any_condjump_p (last_insn)
875 /* Avoid handling of conditional jumps jumping to fallthru edge. */
876 || BASIC_BLOCK (i)->succ->succ_next == NULL)
877 {
878 /* We can predict only conditional jumps at the moment.
879 Expect each edge to be equally probable.
880 ?? In the future we want to make abnormal edges improbable. */
881 int nedges = 0;
882 edge e;
883
884 for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
885 {
886 nedges++;
887 if (e->probability != 0)
888 break;
889 }
890 if (!e)
891 for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
892 e->probability = (REG_BR_PROB_BASE + nedges / 2) / nedges;
893 }
894 else
895 {
896 probability = INTVAL (XEXP (find_reg_note (last_insn,
897 REG_BR_PROB, 0), 0));
898 fallthru = BASIC_BLOCK (i)->succ;
899 if (!fallthru->flags & EDGE_FALLTHRU)
900 fallthru = fallthru->succ_next;
901 branch = BASIC_BLOCK (i)->succ;
902 if (branch->flags & EDGE_FALLTHRU)
903 branch = branch->succ_next;
904
905 branch->probability = probability;
906 fallthru->probability = REG_BR_PROB_BASE - probability;
907 }
908 }
909 ENTRY_BLOCK_PTR->succ->probability = REG_BR_PROB_BASE;
910
911 /* Set up block info for each basic block. */
912 alloc_aux_for_blocks (sizeof (struct block_info_def));
913 alloc_aux_for_edges (sizeof (struct edge_info_def));
914 for (i = -2; i < n_basic_blocks; i++)
915 {
916 edge e;
917 basic_block bb;
918
919 if (i == -2)
920 bb = ENTRY_BLOCK_PTR;
921 else if (i == -1)
922 bb = EXIT_BLOCK_PTR;
923 else
924 bb = BASIC_BLOCK (i);
925 BLOCK_INFO (bb)->tovisit = 0;
926 for (e = bb->succ; e; e = e->succ_next)
927 EDGE_INFO (e)->back_edge_prob = ((double) e->probability
928 / REG_BR_PROB_BASE);
929 }
930 /* First compute probabilities locally for each loop from innermost
931 to outermost to examine probabilities for back edges. */
932 estimate_loops_at_level (loops->tree_root);
933
934 /* Now fake loop around whole function to finalize probabilities. */
935 for (i = 0; i < n_basic_blocks; i++)
936 BLOCK_INFO (BASIC_BLOCK (i))->tovisit = 1;
937 BLOCK_INFO (ENTRY_BLOCK_PTR)->tovisit = 1;
938 BLOCK_INFO (EXIT_BLOCK_PTR)->tovisit = 1;
939 propagate_freq (ENTRY_BLOCK_PTR);
940
941 for (i = 0; i < n_basic_blocks; i++)
942 if (BLOCK_INFO (BASIC_BLOCK (i))->frequency > freq_max)
943 freq_max = BLOCK_INFO (BASIC_BLOCK (i))->frequency;
944 for (i = -2; i < n_basic_blocks; i++)
945 {
946 basic_block bb;
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);
953 bb->frequency = (BLOCK_INFO (bb)->frequency * BB_FREQ_MAX / freq_max
954 + 0.5);
955 }
956
957 free_aux_for_blocks ();
958 free_aux_for_edges ();
959 }