xref: /dragonfly/contrib/gcc-8.0/gcc/predict.h (revision 38fd1498)
1*38fd1498Szrj /* Definitions for branch prediction routines in the GNU compiler.
2*38fd1498Szrj    Copyright (C) 2001-2018 Free Software Foundation, Inc.
3*38fd1498Szrj 
4*38fd1498Szrj This file is part of GCC.
5*38fd1498Szrj 
6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
7*38fd1498Szrj the terms of the GNU General Public License as published by the Free
8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
9*38fd1498Szrj version.
10*38fd1498Szrj 
11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14*38fd1498Szrj for more details.
15*38fd1498Szrj 
16*38fd1498Szrj You should have received a copy of the GNU General Public License
17*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
18*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
19*38fd1498Szrj 
20*38fd1498Szrj #ifndef GCC_PREDICT_H
21*38fd1498Szrj #define GCC_PREDICT_H
22*38fd1498Szrj 
23*38fd1498Szrj #include "profile-count.h"
24*38fd1498Szrj 
25*38fd1498Szrj /* Random guesstimation given names.
26*38fd1498Szrj    PROB_VERY_UNLIKELY should be small enough so basic block predicted
27*38fd1498Szrj    by it gets below HOT_BB_FREQUENCY_FRACTION.  */
28*38fd1498Szrj #define PROB_VERY_UNLIKELY	(REG_BR_PROB_BASE / 2000 - 1)
29*38fd1498Szrj #define PROB_EVEN		(REG_BR_PROB_BASE / 2)
30*38fd1498Szrj #define PROB_VERY_LIKELY	(REG_BR_PROB_BASE - PROB_VERY_UNLIKELY)
31*38fd1498Szrj #define PROB_ALWAYS		(REG_BR_PROB_BASE)
32*38fd1498Szrj #define PROB_UNLIKELY           (REG_BR_PROB_BASE / 5 - 1)
33*38fd1498Szrj #define PROB_LIKELY             (REG_BR_PROB_BASE - PROB_UNLIKELY)
34*38fd1498Szrj #define PROB_UNINITIALIZED      (-1)
35*38fd1498Szrj 
36*38fd1498Szrj #define DEF_PREDICTOR(ENUM, NAME, HITRATE, FLAGS) ENUM,
37*38fd1498Szrj enum br_predictor
38*38fd1498Szrj {
39*38fd1498Szrj #include "predict.def"
40*38fd1498Szrj 
41*38fd1498Szrj   /* Upper bound on non-language-specific builtins.  */
42*38fd1498Szrj   END_PREDICTORS
43*38fd1498Szrj };
44*38fd1498Szrj #undef DEF_PREDICTOR
45*38fd1498Szrj enum prediction
46*38fd1498Szrj {
47*38fd1498Szrj    NOT_TAKEN,
48*38fd1498Szrj    TAKEN
49*38fd1498Szrj };
50*38fd1498Szrj 
51*38fd1498Szrj /* In emit-rtl.c.  */
52*38fd1498Szrj extern profile_probability split_branch_probability;
53*38fd1498Szrj 
54*38fd1498Szrj extern gcov_type get_hot_bb_threshold (void);
55*38fd1498Szrj extern void set_hot_bb_threshold (gcov_type);
56*38fd1498Szrj extern bool maybe_hot_count_p (struct function *, profile_count);
57*38fd1498Szrj extern bool maybe_hot_bb_p (struct function *, const_basic_block);
58*38fd1498Szrj extern bool maybe_hot_edge_p (edge);
59*38fd1498Szrj extern bool probably_never_executed_bb_p (struct function *, const_basic_block);
60*38fd1498Szrj extern bool probably_never_executed_edge_p (struct function *, edge);
61*38fd1498Szrj extern bool optimize_function_for_size_p (struct function *);
62*38fd1498Szrj extern bool optimize_function_for_speed_p (struct function *);
63*38fd1498Szrj extern optimization_type function_optimization_type (struct function *);
64*38fd1498Szrj extern bool optimize_bb_for_size_p (const_basic_block);
65*38fd1498Szrj extern bool optimize_bb_for_speed_p (const_basic_block);
66*38fd1498Szrj extern optimization_type bb_optimization_type (const_basic_block);
67*38fd1498Szrj extern bool optimize_edge_for_size_p (edge);
68*38fd1498Szrj extern bool optimize_edge_for_speed_p (edge);
69*38fd1498Szrj extern bool optimize_insn_for_size_p (void);
70*38fd1498Szrj extern bool optimize_insn_for_speed_p (void);
71*38fd1498Szrj extern bool optimize_loop_for_size_p (struct loop *);
72*38fd1498Szrj extern bool optimize_loop_for_speed_p (struct loop *);
73*38fd1498Szrj extern bool optimize_loop_nest_for_speed_p (struct loop *);
74*38fd1498Szrj extern bool optimize_loop_nest_for_size_p (struct loop *);
75*38fd1498Szrj extern bool predictable_edge_p (edge);
76*38fd1498Szrj extern void rtl_profile_for_bb (basic_block);
77*38fd1498Szrj extern void rtl_profile_for_edge (edge);
78*38fd1498Szrj extern void default_rtl_profile (void);
79*38fd1498Szrj extern bool rtl_predicted_by_p (const_basic_block, enum br_predictor);
80*38fd1498Szrj extern bool gimple_predicted_by_p (const_basic_block, enum br_predictor);
81*38fd1498Szrj extern bool edge_probability_reliable_p (const_edge);
82*38fd1498Szrj extern bool br_prob_note_reliable_p (const_rtx);
83*38fd1498Szrj extern void predict_insn_def (rtx_insn *, enum br_predictor, enum prediction);
84*38fd1498Szrj extern void rtl_predict_edge (edge, enum br_predictor, int);
85*38fd1498Szrj extern void gimple_predict_edge (edge, enum br_predictor, int);
86*38fd1498Szrj extern void remove_predictions_associated_with_edge (edge);
87*38fd1498Szrj extern void predict_edge_def (edge, enum br_predictor, enum prediction);
88*38fd1498Szrj extern void invert_br_probabilities (rtx);
89*38fd1498Szrj extern void guess_outgoing_edge_probabilities (basic_block);
90*38fd1498Szrj extern void tree_guess_outgoing_edge_probabilities (basic_block);
91*38fd1498Szrj extern void tree_estimate_probability (bool);
92*38fd1498Szrj extern void handle_missing_profiles (void);
93*38fd1498Szrj extern bool update_max_bb_count (void);
94*38fd1498Szrj extern bool expensive_function_p (int);
95*38fd1498Szrj extern void estimate_bb_frequencies (bool);
96*38fd1498Szrj extern void compute_function_frequency (void);
97*38fd1498Szrj extern tree build_predict_expr (enum br_predictor, enum prediction);
98*38fd1498Szrj extern const char *predictor_name (enum br_predictor);
99*38fd1498Szrj extern void rebuild_frequencies (void);
100*38fd1498Szrj extern void report_predictor_hitrates (void);
101*38fd1498Szrj extern void force_edge_cold (edge, bool);
102*38fd1498Szrj extern void propagate_unlikely_bbs_forward (void);
103*38fd1498Szrj 
104*38fd1498Szrj extern void add_reg_br_prob_note (rtx_insn *, profile_probability);
105*38fd1498Szrj 
106*38fd1498Szrj /* In ipa-pure-const.c   */
107*38fd1498Szrj extern void warn_function_cold (tree);
108*38fd1498Szrj 
109*38fd1498Szrj #endif  /* GCC_PREDICT_H */
110