Re: [PATCH v6] forwprop: add simplify_phi_result_movdiv() [PR101179]

Jeffrey Law <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>

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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.