https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89518
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Status|UNCONFIRMED |ASSIGNED Last reconfirmed| |2019-02-27 Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- We do not have a (a / b) * b + (a % b) simplification rule. The following adds one: Index: gcc/match.pd =================================================================== --- gcc/match.pd (revision 269242) +++ gcc/match.pd (working copy) @@ -2729,6 +2729,13 @@ (define_operator_list COND_TERNARY (mult (convert1? (exact_div @0 @@1)) (convert2? @1)) (convert @0)) +/* Simplify (A / B) * B + (A % B) -> A. */ +(for div (trunc_div ceil_div floor_div round_div) + mod (trunc_mod ceil_mod floor_mod round_mod) + (simplify + (plus:c (mult:c (div @0 @1) @1) (mod @0 @1)) + @0)) + /* ((X /[ex] A) +- B) * A --> X +- A * B. */ (for op (plus minus) (simplify