bb-reorder.c (make_reorder_chain_1): Protect against when redundant edges are omitted.
[gcc.git] / gcc / predict.c
1 /* Branch prediction routines for the GNU compiler.
2 Copyright (C) 2000, 2001, 2002 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 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.
10
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.
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 #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"
48
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)
57
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));
65
66 /* Information we hold about each branch predictor.
67 Filled using information from predict.def. */
68
69 struct predictor_info
70 {
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;
75 };
76
77 /* Use given predictor without Dempster-Shaffer theory if it matches
78 using first_match heuristics. */
79 #define PRED_FLAG_FIRST_MATCH 1
80
81 /* Recompute hitrate in percent to our representation. */
82
83 #define HITRATE(VAL) ((int) ((VAL) * REG_BR_PROB_BASE + 50) / 100)
84
85 #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) {NAME, HITRATE, FLAGS},
86 static const struct predictor_info predictor_info[]= {
87 #include "predict.def"
88
89 /* Upper bound on predictors. */
90 {NULL, 0, 0}
91 };
92 #undef DEF_PREDICTOR
93
94 void
95 predict_insn (insn, predictor, probability)
96 rtx insn;
97 int probability;
98 enum br_predictor predictor;
99 {
100 if (!any_condjump_p (insn))
101 abort ();
102
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
113 void
114 predict_insn_def (insn, predictor, taken)
115 rtx insn;
116 enum br_predictor predictor;
117 enum prediction taken;
118 {
119 int probability = predictor_info[(int) predictor].hitrate;
120
121 if (taken != TAKEN)
122 probability = REG_BR_PROB_BASE - probability;
123
124 predict_insn (insn, predictor, probability);
125 }
126
127 /* Predict edge E with given probability if possible. */
128
129 void
130 predict_edge (e, predictor, probability)
131 edge e;
132 int probability;
133 enum br_predictor predictor;
134 {
135 rtx last_insn;
136 last_insn = e->src->end;
137
138 /* We can store the branch prediction information only about
139 conditional jumps. */
140 if (!any_condjump_p (last_insn))
141 return;
142
143 /* We always store probability of branching. */
144 if (e->flags & EDGE_FALLTHRU)
145 probability = REG_BR_PROB_BASE - probability;
146
147 predict_insn (last_insn, predictor, probability);
148 }
149
150 /* Predict edge E by given predictor if possible. */
151
152 void
153 predict_edge_def (e, predictor, taken)
154 edge e;
155 enum br_predictor predictor;
156 enum prediction taken;
157 {
158 int probability = predictor_info[(int) predictor].hitrate;
159
160 if (taken != TAKEN)
161 probability = REG_BR_PROB_BASE - probability;
162
163 predict_edge (e, predictor, probability);
164 }
165
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. */
168
169 void
170 invert_br_probabilities (insn)
171 rtx insn;
172 {
173 rtx note;
174
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)));
181 }
182
183 /* Dump information about the branch prediction to the output file. */
184
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;
191 {
192 edge e = bb->succ;
193
194 if (!rtl_dump_file)
195 return;
196
197 while (e && (e->flags & EDGE_FALLTHRU))
198 e = e->succ_next;
199
200 fprintf (rtl_dump_file, " %s heuristics%s: %.1f%%",
201 predictor_info[predictor].name,
202 used ? "" : " (ignored)", probability * 100.0 / REG_BR_PROB_BASE);
203
204 if (bb->count)
205 {
206 fprintf (rtl_dump_file, " exec ");
207 fprintf (rtl_dump_file, HOST_WIDEST_INT_PRINT_DEC, bb->count);
208 if (e)
209 {
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);
213 }
214 }
215
216 fprintf (rtl_dump_file, "\n");
217 }
218
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. */
221
222 static void
223 combine_predictions_for_insn (insn, bb)
224 rtx insn;
225 basic_block bb;
226 {
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;
236
237 if (rtl_dump_file)
238 fprintf (rtl_dump_file, "Predictions for insn %i bb %i\n", INSN_UID (insn),
239 bb->index);
240
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)
246 {
247 int predictor = INTVAL (XEXP (XEXP (note, 0), 0));
248 int probability = INTVAL (XEXP (XEXP (note, 0), 1));
249
250 found = true;
251 if (best_predictor > predictor)
252 best_probability = probability, best_predictor = predictor;
253
254 d = (combined_probability * probability
255 + (REG_BR_PROB_BASE - combined_probability)
256 * (REG_BR_PROB_BASE - probability));
257
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);
265 }
266
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. */
270
271 if (predictor_info [best_predictor].flags & PRED_FLAG_FIRST_MATCH)
272 first_match = true;
273
274 if (!found)
275 dump_prediction (PRED_NO_PREDICTION, combined_probability, bb, true);
276 else
277 {
278 dump_prediction (PRED_DS_THEORY, combined_probability, bb, !first_match);
279 dump_prediction (PRED_FIRST_MATCH, best_probability, bb, first_match);
280 }
281
282 if (first_match)
283 combined_probability = best_probability;
284 dump_prediction (PRED_COMBINED, combined_probability, bb, true);
285
286 while (*pnote)
287 {
288 if (REG_NOTE_KIND (*pnote) == REG_BR_PRED)
289 {
290 int predictor = INTVAL (XEXP (XEXP (*pnote, 0), 0));
291 int probability = INTVAL (XEXP (XEXP (*pnote, 0), 1));
292
293 dump_prediction (predictor, probability, bb,
294 !first_match || best_predictor == predictor);
295 *pnote = XEXP (*pnote, 1);
296 }
297 else
298 pnote = &XEXP (*pnote, 1);
299 }
300
301 if (!prob_note)
302 {
303 REG_NOTES (insn)
304 = gen_rtx_EXPR_LIST (REG_BR_PROB,
305 GEN_INT (combined_probability), REG_NOTES (insn));
306
307 /* Save the prediction into CFG in case we are seeing non-degenerated
308 conditional jump. */
309 if (bb->succ->succ_next)
310 {
311 BRANCH_EDGE (bb)->probability = combined_probability;
312 FALLTHRU_EDGE (bb)->probability
313 = REG_BR_PROB_BASE - combined_probability;
314 }
315 }
316 }
317
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). */
323
324 void
325 estimate_probability (loops_info)
326 struct loops *loops_info;
327 {
328 sbitmap *dominators, *post_dominators;
329 int i;
330 int found_noreturn = 0;
331
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);
336
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++)
340 {
341 int j;
342 int exits;
343 struct loop *loop = &loops_info->array[i];
344
345 flow_loop_scan (loops_info, loop, LOOP_EXIT_EDGES);
346 exits = loop->num_exits;
347
348 for (j = loop->first->index; j <= loop->last->index; ++j)
349 if (TEST_BIT (loop->nodes, j))
350 {
351 int header_found = 0;
352 edge e;
353
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)
359 {
360 header_found = 1;
361 predict_edge_def (e, PRED_LOOP_BRANCH, TAKEN);
362 }
363
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);
375 }
376 }
377
378 /* Attempt to predict conditional jumps using a number of heuristics. */
379 for (i = 0; i < n_basic_blocks; i++)
380 {
381 basic_block bb = BASIC_BLOCK (i);
382 rtx last_insn = bb->end;
383 rtx cond, earliest;
384 edge e;
385
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)
390 {
391 int y;
392
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);
404 }
405
406 if (GET_CODE (last_insn) != JUMP_INSN || ! any_condjump_p (last_insn))
407 continue;
408
409 for (e = bb->succ; e; e = e->succ_next)
410 {
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);
417
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))
423 {
424 rtx insn;
425
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))
436 {
437 predict_edge_def (e, PRED_CALL, NOT_TAKEN);
438 break;
439 }
440 }
441 }
442
443 cond = get_condition (last_insn, &earliest);
444 if (! cond)
445 continue;
446
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)))))
453 {
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);
458 }
459 else
460
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
483 || XEXP (cond, 0) == const0_rtx)
484 ;
485 else
486 predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, NOT_TAKEN);
487 break;
488
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))))
495 ;
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)
500 ;
501 else
502 predict_insn_def (last_insn, PRED_OPCODE_NONEQUAL, TAKEN);
503 break;
504
505 case ORDERED:
506 predict_insn_def (last_insn, PRED_FPOPCODE, TAKEN);
507 break;
508
509 case UNORDERED:
510 predict_insn_def (last_insn, PRED_FPOPCODE, NOT_TAKEN);
511 break;
512
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;
519
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;
526
527 default:
528 break;
529 }
530 }
531
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));
537
538 sbitmap_vector_free (post_dominators);
539 sbitmap_vector_free (dominators);
540
541 estimate_bb_frequencies (loops_info);
542 }
543 \f
544 /* __builtin_expect dropped tokens into the insn stream describing expected
545 values of registers. Generate branch probabilities based off these
546 values. */
547
548 void
549 expected_value_to_br_prob ()
550 {
551 rtx insn, cond, ev = NULL_RTX, ev_reg = NULL_RTX;
552
553 for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
554 {
555 switch (GET_CODE (insn))
556 {
557 case NOTE:
558 /* Look for expected value notes. */
559 if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EXPECTED_VALUE)
560 {
561 ev = NOTE_EXPECTED_VALUE (insn);
562 ev_reg = XEXP (ev, 0);
563 delete_insn (insn);
564 }
565 continue;
566
567 case CODE_LABEL:
568 /* Never propagate across labels. */
569 ev = NULL_RTX;
570 continue;
571
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;
579
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;
585 }
586
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;
601
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);
608
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);
614 }
615 }
616 \f
617 /* This is used to carry information about basic blocks. It is
618 attached to the AUX field of the standard CFG block. */
619
620 typedef struct block_info_def
621 {
622 /* Estimated frequency of execution of basic_block. */
623 volatile double frequency;
624
625 /* To keep queue of basic blocks to process. */
626 basic_block next;
627
628 /* True if block needs to be visited in prop_freqency. */
629 int tovisit:1;
630
631 /* Number of predecessors we need to visit first. */
632 int npredecessors;
633 } *block_info;
634
635 /* Similar information for edges. */
636 typedef struct edge_info_def
637 {
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).
641
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;
648
649 #define BLOCK_INFO(B) ((block_info) (B)->aux)
650 #define EDGE_INFO(E) ((edge_info) (E)->aux)
651
652 /* Helper function for estimate_bb_frequencies.
653 Propagate the frequencies for loops headed by HEAD. */
654
655 static void
656 propagate_freq (head)
657 basic_block head;
658 {
659 basic_block bb = head;
660 basic_block last = bb;
661 edge e;
662 basic_block nextbb;
663 int n;
664
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++)
668 {
669 basic_block bb = BASIC_BLOCK (n);
670 if (BLOCK_INFO (bb)->tovisit)
671 {
672 int count = 0;
673
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;
683 }
684 }
685
686 BLOCK_INFO (head)->frequency = 1;
687 for (; bb; bb = nextbb)
688 {
689 double cyclic_probability = 0, frequency = 0;
690
691 nextbb = BLOCK_INFO (bb)->next;
692 BLOCK_INFO (bb)->next = NULL;
693
694 /* Compute frequency of basic block. */
695 if (bb != head)
696 {
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
702
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);
710
711 if (cyclic_probability > 1.0 - 1.0 / REG_BR_PROB_BASE)
712 cyclic_probability = 1.0 - 1.0 / REG_BR_PROB_BASE;
713
714 BLOCK_INFO (bb)->frequency = frequency / (1 - cyclic_probability);
715 }
716
717 BLOCK_INFO (bb)->tovisit = 0;
718
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);
725
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)
730 {
731 BLOCK_INFO (e->dest)->npredecessors--;
732 if (!BLOCK_INFO (e->dest)->npredecessors)
733 {
734 if (!nextbb)
735 nextbb = e->dest;
736 else
737 BLOCK_INFO (last)->next = e->dest;
738
739 last = e->dest;
740 }
741 }
742 }
743 }
744
745 /* Estimate probabilities of loopback edges in loops at same nest level. */
746
747 static void
748 estimate_loops_at_level (first_loop)
749 struct loop *first_loop;
750 {
751 struct loop *l, *loop = first_loop;
752
753 for (loop = first_loop; loop; loop = loop->next)
754 {
755 int n;
756 edge e;
757
758 estimate_loops_at_level (loop->inner);
759
760 /* Find current loop back edge and mark it. */
761 for (e = loop->latch->succ; e->dest != loop->header; e = e->succ_next)
762 ;
763
764 EDGE_INFO (e)->back_edge = 1;
765
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)
769 {
770 for (l = loop->next; l; l = l->next)
771 if (l->header == loop->header)
772 break;
773
774 if (l)
775 continue;
776 }
777
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
783 );
784
785 propagate_freq (loop->header);
786 }
787 }
788
789 /* Convert counts measured by profile driven feedback to frequencies. */
790
791 static void
792 counts_to_freqs ()
793 {
794 HOST_WIDEST_INT count_max = 1;
795 int i;
796
797 for (i = 0; i < n_basic_blocks; i++)
798 count_max = MAX (BASIC_BLOCK (i)->count, count_max);
799
800 for (i = -2; i < n_basic_blocks; i++)
801 {
802 basic_block bb;
803
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);
810
811 bb->frequency = (bb->count * BB_FREQ_MAX + count_max / 2) / count_max;
812 }
813 }
814
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. */
819
820 bool
821 expensive_function_p (threshold)
822 int threshold;
823 {
824 unsigned int sum = 0;
825 int i;
826 unsigned int limit;
827
828 /* We can not compute accurately for large thresholds due to scaled
829 frequencies. */
830 if (threshold > BB_FREQ_MAX)
831 abort ();
832
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;
838
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++)
842 {
843 basic_block bb = BASIC_BLOCK (i);
844 rtx insn;
845
846 for (insn = bb->head; insn != NEXT_INSN (bb->end);
847 insn = NEXT_INSN (insn))
848 if (active_insn_p (insn))
849 {
850 sum += bb->frequency;
851 if (sum > limit)
852 return true;
853 }
854 }
855
856 return false;
857 }
858
859 /* Estimate basic blocks frequency by given branch probabilities. */
860
861 static void
862 estimate_bb_frequencies (loops)
863 struct loops *loops;
864 {
865 int i;
866 double freq_max = 0;
867
868 mark_dfs_back_edges ();
869 if (flag_branch_probabilities)
870 {
871 counts_to_freqs ();
872 return;
873 }
874
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++)
878 {
879 rtx last_insn = BLOCK_END (i);
880
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)
884 {
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;
890
891 for (e = BASIC_BLOCK (i)->succ; e; e = e->succ_next)
892 {
893 nedges++;
894 if (e->probability != 0)
895 break;
896 }
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;
900 }
901 }
902
903 ENTRY_BLOCK_PTR->succ->probability = REG_BR_PROB_BASE;
904
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++)
909 {
910 edge e;
911 basic_block bb;
912
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);
919
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);
924 }
925
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);
929
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;
933
934 BLOCK_INFO (ENTRY_BLOCK_PTR)->tovisit = 1;
935 BLOCK_INFO (EXIT_BLOCK_PTR)->tovisit = 1;
936 propagate_freq (ENTRY_BLOCK_PTR);
937
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;
941
942 for (i = -2; i < n_basic_blocks; i++)
943 {
944 basic_block bb;
945
946 if (i == -2)
947 bb = ENTRY_BLOCK_PTR;
948 else if (i == -1)
949 bb = EXIT_BLOCK_PTR;
950 else
951 bb = BASIC_BLOCK (i);
952 bb->frequency
953 = BLOCK_INFO (bb)->frequency * BB_FREQ_MAX / freq_max + 0.5;
954 }
955
956 free_aux_for_blocks ();
957 free_aux_for_edges ();
958 }