[Bug tree-optimization/56711] missed optimization for __uint128_t of (unsigned long long)x != x

pinskia at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sun Mar 24 17:23:00 GMT 2013


Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
             Target|                            |x86_64-linux-gnu
             Status|UNCONFIRMED                 |NEW
           Keywords|                            |missed-optimization
   Last reconfirmed|                            |2013-03-24
          Component|rtl-optimization            |tree-optimization
     Ever Confirmed|0                           |1
            Summary|spectaculary bad code       |missed optimization for
                   |generated for __uint128_t   |__uint128_t of (unsigned
                   |                            |long long)x != x
           Severity|normal                      |enhancement

--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> 2013-03-24 17:22:57 UTC ---
>The code gcc generates is 92 bytes long, the one from clang only 65. 

If you are going to compare GCC to clang with respect of code size then you
should analyze the code at least.  It is very obvious what GCC is not doing.

Well looking at the generated code GCC does not optimize:
    if ((unsigned long)x != x) break;

Into just:
x>>64 == 0

An another example is:
int f(unsigned a)
  return (unsigned short)a != a;

int g(unsigned a)
  return a>>16 == 0;

More information about the Gcc-bugs mailing list