Hi, I run my script on execute testsuite and looked into few testcases. The problem I found was roundoff errors - i.e. when expanding switch we set 50% chage that out of bound value is above or bellow. Both gets rounded to 0, because switch is executed once and the value is bellow.
Partly this can be fixed by making probably_never_executed to consider frequencies when counts are too coarse: Index: predict.c =================================================================== --- predict.c (revision 202133) +++ predict.c (working copy) @@ -232,8 +232,22 @@ bool probably_never_executed_bb_p (struct function *fun, const_basic_block bb) { gcc_checking_assert (fun); - if (profile_info && flag_branch_probabilities) - return ((bb->count + profile_info->runs / 2) / profile_info->runs) == 0; + if (profile_status_for_function (fun) == PROFILE_READ) + { + if ((bb->count * 4 + profile_info->runs / 2) / profile_info->runs > 0) + return false; + if (!bb->frequency) + return true; + if (!ENTRY_BLOCK_PTR->frequency) + return false; + if (ENTRY_BLOCK_PTR->count && ENTRY_BLOCK_PTR->count < REG_BR_PROB_BASE) + { + return (RDIV (bb->frequency * ENTRY_BLOCK_PTR->count, + ENTRY_BLOCK_PTR->frequency) + < REG_BR_PROB_BASE / 4); + } + return true; + } if ((!profile_info || !flag_branch_probabilities) && (cgraph_get_node (fun->decl)->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED)) In other cases it was mostly loop unrolling in combination with jump threading. So I modified my script to separately report when failure happens for test trained once and test trained hundred times. FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20000422-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20000910-2.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20020413-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20030903-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20031204-1.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20031204-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20060420-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20060905-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20120427-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20120427-2.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20120808-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20121108-1.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/20121108-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/920501-6.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/920501-6.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/920726-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/981001-1.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/981001-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/990628-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/991216-2.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/991216-2.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/cmpdi-1.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/cmpdi-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/float-floor.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/float-floor.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/pr33870-1.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/pr33870-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/pr33870.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/pr33870.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/pr36093.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/pr37573.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/pr43784.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/pr43784.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/switch-1.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/switch-1.c FAIL1 /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/va-arg-22.c FAIL /home/jh/trunk/gcc/testsuite/gcc.c-torture/execute/va-arg-22.c FAIL1 is failure after one run, FIAL is failure after 100 train runs. We should take look at FAILs and see if there are bugs to fix. For FAIL1 I think it is kind of design problem: while implementing counts&frequencies the idea was that small counts do not matter, so integer arithmetic is all right. I wonder if with current C++ wonderland we can't simply switch count to a better representation. Either sreal or fixedpoint with capping (the integer overflow issues are tiring, too). Honza