https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101301
--- Comment #6 from Thomas Koenig <tkoenig at gcc dot gnu.org> --- If I create a foo3 function with int foo3 (int n) { if (__builtin_expect_with_probability (n >= 55555, 1, 0.55)) { if (__builtin_expect_with_probability (n >= 77777, 1, 0.33/0.55)) { if (__builtin_expect_with_probability (n == 77777, 1, 0.1/0.33)) return 7; if (__builtin_expect_with_probability (n == 88888, 1, 0.1/0.23)) return 8; if (__builtin_expect_with_probability (n == 99999, 1, 0.1/0.11)) return 9; return 0; } else { if (__builtin_expect_with_probability (n == 55555, 1, 0.1/0.22)) return 5; if (__builtin_expect_with_probability (n == 66666, 1, 0.1/0.11)) return 6; return 0; } } else { if (__builtin_expect_with_probability (n >= 33333, 1, 0.22/0.45)) { if (__builtin_expect_with_probability (n == 33333, 1, 0.1/0.22)) return 3; if (__builtin_expect_with_probability (n == 44444, 1, 0.1/0.11)) return 4; return 0; } else { if (__builtin_expect_with_probability (n == 11111, 1, 0.1/0.23)) return 1; if (__builtin_expect_with_probability (n == 22222, 1, 0.1/0.13)) return 2; return 0; } } } the numbers on POWER9 become [tkoenig@gcc135 ~]$ gcc -O3 bench.c a.c [tkoenig@gcc135 ~]$ ./a.out foo: 7.134855 foo2: 7.842507 foo3: 6.624406 [tkoenig@gcc135 ~]$ gcc -mcpu=native -O3 bench.c a.c [tkoenig@gcc135 ~]$ ./a.out foo: 6.458520 foo2: 7.696735 foo3: 6.196469 where, on a few runs, the differene betweeh foo and foo3 with -mcpu=native sometimes disappears and sometimes is larger (gcc135 is not a benchmark machine). So, I'd say there some advantage in the compiler not lying to itself :-)