1*38fd1498Szrj/* Definitions for the branch prediction routines in the GNU compiler. 2*38fd1498Szrj Copyright (C) 2001-2018 Free Software Foundation, Inc. 3*38fd1498Szrj 4*38fd1498SzrjThis file is part of GCC. 5*38fd1498Szrj 6*38fd1498SzrjGCC is free software; you can redistribute it and/or modify it under 7*38fd1498Szrjthe terms of the GNU General Public License as published by the Free 8*38fd1498SzrjSoftware Foundation; either version 3, or (at your option) any later 9*38fd1498Szrjversion. 10*38fd1498Szrj 11*38fd1498SzrjGCC is distributed in the hope that it will be useful, but WITHOUT ANY 12*38fd1498SzrjWARRANTY; without even the implied warranty of MERCHANTABILITY or 13*38fd1498SzrjFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*38fd1498Szrjfor more details. 15*38fd1498Szrj 16*38fd1498SzrjYou should have received a copy of the GNU General Public License 17*38fd1498Szrjalong with GCC; see the file COPYING3. If not see 18*38fd1498Szrj<http://www.gnu.org/licenses/>. */ 19*38fd1498Szrj 20*38fd1498Szrj/* Before including this file, you should define a macro: 21*38fd1498Szrj 22*38fd1498Szrj DEF_PREDICTOR (ENUM, NAME, HITRATE) 23*38fd1498Szrj 24*38fd1498Szrj This macro will be called once for each predictor. The ENUM will 25*38fd1498Szrj be of type `enum predictor', and will enumerate all supported 26*38fd1498Szrj predictors. The order of DEF_PREDICTOR calls is important, as 27*38fd1498Szrj in the first match combining heuristics, the predictor appearing 28*38fd1498Szrj first in this file will win. 29*38fd1498Szrj 30*38fd1498Szrj NAME is used in the debugging output to determine predictor type. 31*38fd1498Szrj 32*38fd1498Szrj HITRATE is the probability that edge predicted by predictor as taken 33*38fd1498Szrj will be really taken (so it should be always above 34*38fd1498Szrj REG_BR_PROB_BASE / 2). */ 35*38fd1498Szrj 36*38fd1498Szrj 37*38fd1498Szrj/* A value used as final outcome of all heuristics. */ 38*38fd1498SzrjDEF_PREDICTOR (PRED_COMBINED, "combined", PROB_ALWAYS, 0) 39*38fd1498Szrj 40*38fd1498Szrj/* An outcome estimated by Dempster-Shaffer theory. */ 41*38fd1498SzrjDEF_PREDICTOR (PRED_DS_THEORY, "DS theory", PROB_ALWAYS, 0) 42*38fd1498Szrj 43*38fd1498Szrj/* A combined heuristics using probability determined by first 44*38fd1498Szrj matching heuristics from this list. */ 45*38fd1498SzrjDEF_PREDICTOR (PRED_FIRST_MATCH, "first match", PROB_ALWAYS, 0) 46*38fd1498Szrj 47*38fd1498Szrj/* Heuristic applying when no heuristic below applies. */ 48*38fd1498SzrjDEF_PREDICTOR (PRED_NO_PREDICTION, "no prediction", PROB_ALWAYS, 0) 49*38fd1498Szrj 50*38fd1498Szrj/* Mark unconditional jump as taken. */ 51*38fd1498SzrjDEF_PREDICTOR (PRED_UNCONDITIONAL, "unconditional jump", PROB_ALWAYS, 52*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 53*38fd1498Szrj 54*38fd1498Szrj/* Use number of loop iterations determined by # of iterations 55*38fd1498Szrj analysis to set probability. We don't want to use Dempster-Shaffer 56*38fd1498Szrj theory here, as the predictions is exact. */ 57*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_ITERATIONS, "loop iterations", PROB_UNINITIALIZED, 58*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 59*38fd1498Szrj 60*38fd1498Szrj/* Assume that any given atomic operation has low contention, 61*38fd1498Szrj and thus the compare-and-swap operation succeeds. */ 62*38fd1498SzrjDEF_PREDICTOR (PRED_COMPARE_AND_SWAP, "compare and swap", PROB_VERY_LIKELY, 63*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 64*38fd1498Szrj 65*38fd1498Szrj/* Hints dropped by user via __builtin_expect feature. Note: the 66*38fd1498Szrj probability of PROB_VERY_LIKELY is now overwritten by param 67*38fd1498Szrj builtin_expect_probability with a default value of HITRATE(90). 68*38fd1498Szrj Refer to param.def for details. */ 69*38fd1498SzrjDEF_PREDICTOR (PRED_BUILTIN_EXPECT, "__builtin_expect", PROB_VERY_LIKELY, 70*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 71*38fd1498Szrj 72*38fd1498Szrj/* Use number of loop iterations guessed by the contents of the loop. */ 73*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_ITERATIONS_GUESSED, "guessed loop iterations", 74*38fd1498Szrj PROB_UNINITIALIZED, PRED_FLAG_FIRST_MATCH) 75*38fd1498Szrj 76*38fd1498Szrj/* Use number of loop iterations guessed by the contents of the loop. */ 77*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_ITERATIONS_MAX, "guessed loop iterations", 78*38fd1498Szrj PROB_UNINITIALIZED, PRED_FLAG_FIRST_MATCH) 79*38fd1498Szrj 80*38fd1498Szrj/* Branch containing goto is probably not taken. */ 81*38fd1498SzrjDEF_PREDICTOR (PRED_CONTINUE, "continue", HITRATE (67), 0) 82*38fd1498Szrj 83*38fd1498Szrj/* Branch to basic block containing call marked by noreturn attribute. */ 84*38fd1498SzrjDEF_PREDICTOR (PRED_NORETURN, "noreturn call", PROB_VERY_LIKELY, 85*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 86*38fd1498Szrj 87*38fd1498Szrj/* Branch to basic block containing call marked by cold function attribute. */ 88*38fd1498SzrjDEF_PREDICTOR (PRED_COLD_FUNCTION, "cold function call", PROB_VERY_LIKELY, 89*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 90*38fd1498Szrj 91*38fd1498Szrj/* Edge causing loop to terminate is probably not taken. */ 92*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_EXIT, "loop exit", HITRATE (89), 93*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 94*38fd1498Szrj 95*38fd1498Szrj/* Same as LOOP_EXIT but for loops containing recursive call. */ 96*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_EXIT_WITH_RECURSION, "loop exit with recursion", 97*38fd1498Szrj HITRATE (78), PRED_FLAG_FIRST_MATCH) 98*38fd1498Szrj 99*38fd1498Szrj/* Edge causing loop to terminate by computing value used by later 100*38fd1498Szrj conditional. */ 101*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_EXTRA_EXIT, "extra loop exit", HITRATE (67), 102*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 103*38fd1498Szrj 104*38fd1498Szrj/* Pointers are usually not NULL. */ 105*38fd1498SzrjDEF_PREDICTOR (PRED_POINTER, "pointer", HITRATE (70), 0) 106*38fd1498SzrjDEF_PREDICTOR (PRED_TREE_POINTER, "pointer (on trees)", HITRATE (70), 0) 107*38fd1498Szrj 108*38fd1498Szrj/* NE is probable, EQ not etc... */ 109*38fd1498SzrjDEF_PREDICTOR (PRED_OPCODE_POSITIVE, "opcode values positive", HITRATE (59), 0) 110*38fd1498SzrjDEF_PREDICTOR (PRED_OPCODE_NONEQUAL, "opcode values nonequal", HITRATE (66), 0) 111*38fd1498SzrjDEF_PREDICTOR (PRED_FPOPCODE, "fp_opcode", HITRATE (90), 0) 112*38fd1498SzrjDEF_PREDICTOR (PRED_TREE_OPCODE_POSITIVE, "opcode values positive (on trees)", 113*38fd1498Szrj HITRATE (59), 0) 114*38fd1498SzrjDEF_PREDICTOR (PRED_TREE_OPCODE_NONEQUAL, "opcode values nonequal (on trees)", 115*38fd1498Szrj HITRATE (66), 0) 116*38fd1498SzrjDEF_PREDICTOR (PRED_TREE_FPOPCODE, "fp_opcode (on trees)", HITRATE (90), 0) 117*38fd1498Szrj 118*38fd1498Szrj/* Branch guarding call is probably taken. */ 119*38fd1498SzrjDEF_PREDICTOR (PRED_CALL, "call", HITRATE (67), 0) 120*38fd1498Szrj 121*38fd1498Szrj/* Call predictors are for now ignored, lets leave the predictor 122*38fd1498Szrj to measure its benefit. */ 123*38fd1498SzrjDEF_PREDICTOR (PRED_INDIR_CALL, "indirect call", PROB_EVEN, 0) 124*38fd1498SzrjDEF_PREDICTOR (PRED_POLYMORPHIC_CALL, "polymorphic call", PROB_EVEN, 0) 125*38fd1498SzrjDEF_PREDICTOR (PRED_RECURSIVE_CALL, "recursive call", PROB_EVEN, 0) 126*38fd1498Szrj 127*38fd1498Szrj/* Branch causing function to terminate is probably not taken. */ 128*38fd1498SzrjDEF_PREDICTOR (PRED_TREE_EARLY_RETURN, "early return (on trees)", HITRATE (66), 129*38fd1498Szrj 0) 130*38fd1498Szrj 131*38fd1498Szrj/* Branch containing goto is probably not taken. */ 132*38fd1498SzrjDEF_PREDICTOR (PRED_GOTO, "goto", HITRATE (66), 0) 133*38fd1498Szrj 134*38fd1498Szrj/* Branch ending with return constant is probably not taken. */ 135*38fd1498SzrjDEF_PREDICTOR (PRED_CONST_RETURN, "const return", HITRATE (65), 0) 136*38fd1498Szrj 137*38fd1498Szrj/* Branch ending with return negative constant is probably not taken. */ 138*38fd1498SzrjDEF_PREDICTOR (PRED_NEGATIVE_RETURN, "negative return", HITRATE (98), 0) 139*38fd1498Szrj 140*38fd1498Szrj/* Branch ending with return; is probably not taken */ 141*38fd1498SzrjDEF_PREDICTOR (PRED_NULL_RETURN, "null return", HITRATE (71), 0) 142*38fd1498Szrj 143*38fd1498Szrj/* Branches to compare induction variable to a loop bound is 144*38fd1498Szrj extremely likely. */ 145*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_IV_COMPARE_GUESS, "guess loop iv compare", 146*38fd1498Szrj HITRATE (64), 0) 147*38fd1498Szrj 148*38fd1498Szrj/* Use number of loop iterations determined by # of iterations analysis 149*38fd1498Szrj to set probability of branches that compares IV to loop bound variable. */ 150*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_IV_COMPARE, "loop iv compare", PROB_UNINITIALIZED, 151*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 152*38fd1498Szrj 153*38fd1498Szrj/* In the following code 154*38fd1498Szrj for (loop1) 155*38fd1498Szrj if (cond) 156*38fd1498Szrj for (loop2) 157*38fd1498Szrj body; 158*38fd1498Szrj guess that cond is unlikely. */ 159*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_GUARD, "loop guard", HITRATE (73), 0) 160*38fd1498Szrj 161*38fd1498Szrj/* Same but for loops containing recursion. */ 162*38fd1498SzrjDEF_PREDICTOR (PRED_LOOP_GUARD_WITH_RECURSION, "loop guard with recursion", 163*38fd1498Szrj HITRATE (85), 0) 164*38fd1498Szrj 165*38fd1498Szrj/* Branches to hot labels are likely. */ 166*38fd1498SzrjDEF_PREDICTOR (PRED_HOT_LABEL, "hot label", HITRATE (85), 0) 167*38fd1498Szrj 168*38fd1498Szrj/* Branches to cold labels are extremely unlikely. */ 169*38fd1498SzrjDEF_PREDICTOR (PRED_COLD_LABEL, "cold label", PROB_VERY_LIKELY, 170*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 171*38fd1498Szrj 172*38fd1498Szrj 173*38fd1498Szrj/* The following predictors are used in Fortran. */ 174*38fd1498Szrj 175*38fd1498Szrj/* Branch leading to an integer overflow are extremely unlikely. */ 176*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_OVERFLOW, "Fortran overflow", PROB_ALWAYS, 177*38fd1498Szrj PRED_FLAG_FIRST_MATCH) 178*38fd1498Szrj 179*38fd1498Szrj/* Branch leading to a failure status are unlikely. This can occur for out 180*38fd1498Szrj of memory. This predictor only occurs when the user explicitly asked 181*38fd1498Szrj for a return status. By default, the code aborts, 182*38fd1498Szrj which is handled via PRED_NORETURN. */ 183*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_FAIL_ALLOC, "Fortran fail alloc", 184*38fd1498Szrj PROB_VERY_LIKELY, 0) 185*38fd1498Szrj 186*38fd1498Szrj/* Predictor is used for an allocation of an already allocated memory or 187*38fd1498Szrj deallocating an already deallocated allocatable. */ 188*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_REALLOC, "Fortran repeated allocation/deallocation", 189*38fd1498Szrj PROB_LIKELY, 0) 190*38fd1498Szrj 191*38fd1498Szrj/* Branch leading to an I/O failure status are unlikely. This predictor is 192*38fd1498Szrj used for I/O failures such as for invalid unit numbers. This predictor 193*38fd1498Szrj only occurs when the user explicitly asked for a return status. By default, 194*38fd1498Szrj the code aborts, which is handled via PRED_NORETURN. */ 195*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_FAIL_IO, "Fortran fail IO", HITRATE (85), 0) 196*38fd1498Szrj 197*38fd1498Szrj/* Branch leading to a run-time warning message which is printed only once 198*38fd1498Szrj are unlikely. The print-warning branch itself can be likely or unlikely. */ 199*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_WARN_ONCE, "Fortran warn once", HITRATE (75), 0) 200*38fd1498Szrj 201*38fd1498Szrj/* Branch belonging to a zero-sized array. */ 202*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_SIZE_ZERO, "Fortran zero-sized array", \ 203*38fd1498Szrj HITRATE (99), 0) 204*38fd1498Szrj 205*38fd1498Szrj/* Branch belonging to an invalid bound index, in a context where it is 206*38fd1498Szrj standard conform and well defined but rather pointless and, hence, rather 207*38fd1498Szrj unlikely to occur. */ 208*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_INVALID_BOUND, "Fortran invalid bound", \ 209*38fd1498Szrj HITRATE (90), 0) 210*38fd1498Szrj 211*38fd1498Szrj/* Branch belonging to the handling of absent optional arguments. This 212*38fd1498Szrj predictor is used when an optional dummy argument, associated with an 213*38fd1498Szrj absent argument, is passed on as actual argument to another procedure, 214*38fd1498Szrj which in turn has an optional argument. */ 215*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_ABSENT_DUMMY, "Fortran absent dummy", \ 216*38fd1498Szrj HITRATE (60), 0) 217*38fd1498Szrj 218*38fd1498Szrj/* Fortran DO statement generates a pre-header guard: 219*38fd1498Szrj empty = (step > 0 ? to < from : to > from), which can be predicted 220*38fd1498Szrj to be very likely. */ 221*38fd1498SzrjDEF_PREDICTOR (PRED_FORTRAN_LOOP_PREHEADER, "Fortran loop preheader", \ 222*38fd1498Szrj HITRATE (99), 0) 223