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]>
---
 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