https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95731
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I think doing it only in the last reassoc would have the advantage that it wouldn't break other optimizations done by reassoc. E.g. if (a >= 0 && b >= 0 && a < 32 && b < 128) which can be now optimized into a < 32U && b < 128U couldn't be optimized unless we teach the reassoc code that (a | b) >= 0 is equivalent to a >= 0 && b >= 0. The user can write it that way though: void bar (int, int); void foo (int a, int b) { if (a >= 0 && b >= 0 && a < 32 && b < 128) bar (a, b); } void baz (int a, int b) { if ((a | b) >= 0 && a < 32 && b < 128) bar (a, b); }