https://gcc.gnu.org/bugzilla/show_bug.cgi?id=15792
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Known to fail| | --- Comment #12 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Gabriel Ravier from comment #11) > Seems like the issue is present again, except it's test1 that gets the > better asm now. Perhaps this should be re-opened ? This bug was about 32bit x86 and the code looks good in GCC 9, 10, 11, and 12 and the trunk. If you were testing on x86_64, you need to use __int128_t to see what the original issue was about: void gh(); void test(__int128_t x) { long g = (long)x|((long)(x>>64)); if (g) gh(); } void test1(__int128_t x) { if (x) gh(); } GCC 4.8+ produces: test1: .cfi_startproc orq %rdi, %rsi jne .L7 rep ret For both. There was an extra mov in GCC 4.5.0-4.7.0 for test though. In GCC 4.4.0, test1 was two compare and jumps (ok). GCC 4.1.2 had the bad code generation which was mentioned in comment #0.