https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96433
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org --- Comment #5 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Maybe we can just pattern match this simple cases which seems like what clang does: (simplify (le:c @0 (mult:c (div @0 @1) @1) ( { true_value; } )) (simplify (gt:c @0 (mult:c (div @0 @1) @1) ( { false_value; } )) That is these are all optimized: //const __SIZE_TYPE__ N = 3; int foo(__SIZE_TYPE__ len, __SIZE_TYPE__ N) { __SIZE_TYPE__ newlen = (len / N) * N; return newlen <= len; } int foo0(__SIZE_TYPE__ len, __SIZE_TYPE__ N) { __SIZE_TYPE__ newlen = (len / N) * N; return newlen > len; } int foo1(__SIZE_TYPE__ len, __SIZE_TYPE__ N) { __SIZE_TYPE__ newlen = (len / N) * N; return !(len >= newlen); }