On 8/10/2026 10:32 AM, Daniel Barboza wrote:
This new forwprop  step is my attempt to implement Richi's suggestions from
v1 of this work [1] where he suggested to push things out of match.pd.

The idea is to simplify DIV/MOD into RSHIFT/BIT_AND ops in which the
divisor are pow2 integers in a PHI.  E.g.:

phi_var = PHI <16,4>
_x = _y % phi_var

Can be turned into:

phi_var = PHI <15,3>
_x = _y & phi_var

As long as we know that _y is a positive number or '_x' is used just in
zero equality comparisons.

Most of 101179 use cases are solved by this change.  PHI with 2+ args
are supported as long as every phi_arg meets the criteria.

Boostrapped and regression tested with x86_64, aarch64 and riscv64.

[1] https://gcc.gnu.org/pipermail/gcc-patches/2026-May/716303.html

        PR tree-optimization/101179

gcc/ChangeLog:

        * tree-ssa-forwprop.cc (simplify_phi_result_movdiv): New
        forwprop step where MOD/DIV ops with pow2 divisors can be
        simplified to BIT_AND/RSHIFT.
        (pass_forwprop::execute): Call simplify_phi_result_movdiv.

gcc/testsuite/ChangeLog:

        * gcc.dg/tree-ssa/pr101179.c: New test.
Can we really optimize the signed case when the result is used in a comparison against zero?  Consider something like:

y / (x ? 4 : 16) == 0

Where "y" is a small negative number, say -2.  In the original form that expression would be true.  In the right shifted form it would be false.

Did I miss something here?

Jeff

Reply via email to