https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94718
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I guess: int foo (int x, int y) { return (x < 0) != (y < 0); } int bar (int x, int y) { return (x < 0) == (y < 0); } int baz (int x, int y) { return (x >= 0) != (y >= 0); } int qux (int x, int y) { return (x >= 0) == (y <= 0); } which we don't optimize ATM is equivalent to: #define I (-__INT_MAX__ - 1) int foo (int x, int y) { return (x & I) != (y & I); } int bar (int x, int y) { return (x & I) == (y & I); } int baz (int x, int y) { return (~x & I) != (~y & I); } int qux (int x, int y) { return (~x & I) == (~y & I); } int quux (int x, int y) { return ((x & I) ^ I) != ((y & I) ^ I); } int corge (int x, int y) { return ((x & I) ^ I) == ((~y & I) ^ I); } which we do (already in *.original dump), but then #define I (-__INT_MAX__ - 1) int foo (int x, int y) { int s = (x & I); int t = (y & I); return s != t; } int bar (int x, int y) { int s = (x & I); int t = (y & I); return s == t; } int baz (int x, int y) { int s = (~x & I); int t = (~y & I); return s != t; } int qux (int x, int y) { int s = (~x & I); int t = (~y & I); return s == t; } int quux (int x, int y) { int s = ((x & I) ^ I); int t = ((y & I) ^ I); return s != t; } int corge (int x, int y) { int s = ((x & I) ^ I); int t = ((~y & I) ^ I); return s == t; } is not again, which means we optimize this somewhere in fold-const.c or where and don't in match.pd.