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 :-)

Reply via email to