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 >
