https://gcc.gnu.org/g:52ceb1698c9f46be900fe3719c2967fe74bcd1f7
commit r17-4191-g52ceb1698c9f46be900fe3719c2967fe74bcd1f7 Author: Shivam Gupta <[email protected]> Date: Sat Sep 12 19:04:58 2026 +0530 tree-optimization: Handle undefined ranges in CLZ loop optimization 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. Signed-off-by: Shivam Gupta <[email protected]> Diff: --- 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 dd10e3849497..bbfa16c6d6ba 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; }
