https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88784
--- Comment #3 from Qi Feng <ffengqi at gcc dot gnu.org> --- I have extended the transformations as following, the first five are the original ones: * unsigned Use UINT_MAX for demonstration, similar for UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, ULLONG_MAX x > y && x != 0 --> x > y x > y || x != 0 --> x != 0 x <= y || x != 0 --> true x <= y || x == 0 --> x <= y x > y && x == 0 --> false x < y && x != UINT_MAX --> x < y x < y || x != UINT_MAX --> x != UINT_MAX x >= y || x != UINT_MAX --> true x >= y || x == UINT_MAX --> x >= y x < y && x == UINT_MAX --> false * signed Use INT_MIN, INT_MAX for demonstration, similar for SCHAR_MIN, SHRT_MIN, INT_MIN, LONG_MIN, LLONG_MIN, SCHAR_MAX, SHRT_MAX, INT_MAX, LONG_MAX, LLONG_MAX x > y && x != INT_MIN --> x > y x > y || x != INT_MIN --> x != INT_MIN x <= y || x != INT_MIN --> true x <= y || x == INT_MIN --> x <= y x > y && x == INT_MIN --> false x < y && x != INT_MAX --> x < y x < y || x != INT_MAX --> x != UINT_MAX x >= y || x != INT_MAX --> true x >= y || x == INT_MAX --> x >= y x < y && x == INT_MAX --> false Want to know if I missed something.