On Sat, Sep 12, 2026 at 6:35 AM Shivam Gupta <[email protected]> wrote:
>
> When optimizing signed right-shift loops into CLZ operations, the initial
> value is checked for non-negativity using Ranger on the loop preheader
> edge.  However, `range_on_edge` returning true only indicates that the
> range query is supported; it does not guarantee that the resulting range
> is defined.
>
> Check `undefined_p ()` before applying the non-negativity test in both
> `number_of_iterations_cltz` and `number_of_iterations_cltz_complement`.
> This prevents an undefined range from being incorrectly treated as a
> valid non-negative range.
>
> Regression tested on x86_64-pc-linux-gnu.
>
> gcc/ChangeLog:
>
>         * tree-ssa-loop-niter.cc (number_of_iterations_cltz): Reject
>         undefined ranges returned by Ranger.
>         (number_of_iterations_cltz_complement): Likewise.

Ok, pushed as r17-4191. Thanks again for the fix.

>
> Signed-off-by: Shivam Gupta <[email protected]>
> ---
>  gcc/tree-ssa-loop-niter.cc | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/gcc/tree-ssa-loop-niter.cc b/gcc/tree-ssa-loop-niter.cc
> index dd10e3849..bbfa16c6d 100644
> --- a/gcc/tree-ssa-loop-niter.cc
> +++ b/gcc/tree-ssa-loop-niter.cc
> @@ -2488,6 +2488,7 @@ number_of_iterations_cltz (loop_p loop, edge exit,
>        int_range_max r (TREE_TYPE (src));
>        edge e = loop_preheader_edge (loop);
>        if (!get_range_query (cfun)->range_on_edge (r, e, src)
> +         || r.undefined_p ()
>           || !r.nonnegative_p ())
>         return false;
>      }
> @@ -2659,6 +2660,7 @@ number_of_iterations_cltz_complement (loop_p loop, edge 
> exit,
>        int_range_max r (TREE_TYPE (src));
>        edge e = loop_preheader_edge (loop);
>        if (!get_range_query (cfun)->range_on_edge (r, e, src)
> +         || r.undefined_p ()
>           || !r.nonnegative_p ())
>         return false;
>      }
> --
> 2.43.0
>

Reply via email to