https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126294
--- Comment #1 from Kael Franco <kaelfandrew at gmail dot com> ---
gcc/match.pd has:
/* Simplify (t * u) / v -> t * (u / v) if u is multiple of v. */
(simplify
(div (mult@3 @0 INTEGER_CST@1) INTEGER_CST@2)
(if (INTEGRAL_TYPE_P (type)
&& wi::multiple_of_p (wi::to_widest (@1), wi::to_widest (@2), SIGNED))
(if (TYPE_OVERFLOW_UNDEFINED (type) && !TYPE_OVERFLOW_SANITIZED (type))
(mult @0 (div! @1 @2))
(with {int_range_max vr0, vr1;}
(if (gimple_match_range_of_expr (vr0, @0, @3)
&& gimple_match_range_of_expr (vr1, @1)
&& range_op_handler (MULT_EXPR).overflow_free_p (vr0, vr1))
(mult @0 (div! @1 @2))))
)))