[Bug tree-optimization/46309] optimization a==3||a==1

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat Sep 24 09:57:00 GMT 2011


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46309

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org
          Component|c++                         |tree-optimization

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-09-24 08:36:27 UTC ---
With s/bool/int/ we generate identical code for both, without jumps.
Anyway, more important is that we don't seem to optimize the
x == CST1 || x == CST2 where __builtin_popcount (CST1 ^ CST2) == 1
in fold-const.c and don't even optimize range tests if the constants alternate
and, more importantly, don't seem to do anything similar to fold_range_test at
the GIMPLE level.

int
f1 (int a, int b)
{
  int v1 = (a == 3);
  int v2 = (a == 1);
  int v3 = (a == 4);
  int v4 = (a == 2);
  return v1 || v2 || v3 || v4;
}

int
f2 (int a, int b)
{
  int v1 = (a == 1);
  int v2 = (a == 2);
  int v3 = (a == 3);
  int v4 = (a == 4);
  return v1 || v2 || v3 || v4;
}

int
f3 (int a, int b)
{
  int v1 = (a == 3);
  int v2 = (a == 1);
  return v1 || v2;
}

int
f4 (int a, int b)
{
  int v1 = (a == 1);
  int v2 = (a == 2);
  return v1 || v2;
}

int
f5 (int a, int b)
{
  return a == 3 || a == 1 || a == 4 || a == 2;
}

int
f6 (int a, int b)
{
  return a == 1 || a == 2 || a == 3 || a == 4;
}

int
f7 (int a, int b)
{
  return a == 3 || a == 1;
}

int
f8 (int a, int b)
{
  return a == 1 || a == 2;
}

int
f9 (int a, int b)
{
  return a == 3 || a == 1 || a == 2 || a == 4;
}



More information about the Gcc-bugs mailing list