https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92342

--- Comment #17 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Tried timing:
__attribute__((noipa)) int f(int a,int b, int c)
{
  return a==c?b:0;
}

__attribute__((noipa)) int g(int a, int b, int c)
{
  return b & -(a==c);
}

int
main (int argc, const char **argv)
{
  unsigned int c = 0;
  if (argv[1][0] == 'f')
    {
      for (int i = 0; i < 1000000000; i++)
        c += f(1,1,i&1);
    }
  else
    {
      for (int i = 0; i < 1000000000; i++)
        c += g(1,1,i&1);
    }
  asm volatile ("" : : "r" (c));
  return 0;
}
and the same without the "i&", i.e. alternating results and always same, and
both functions are the same speed in both cases, and cmov is shorter.
Without cmov, such as with -m32 -O2 -march=i586, g seems to be faster, so we
probably should teach ifcvt.c to try it.

Reply via email to