]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Make some integer specific ranges generic Value_Range's.
authorAldy Hernandez <aldyh@redhat.com>
Tue, 19 Mar 2024 17:22:08 +0000 (18:22 +0100)
committerAldy Hernandez <aldyh@redhat.com>
Sun, 28 Apr 2024 19:03:00 +0000 (21:03 +0200)
There are some irange uses that should be Value_Range, because they
can be either integers or pointers.  This will become a problem when
prange comes live.

gcc/ChangeLog:

* tree-ssa-loop-split.cc (split_at_bb_p): Make int_range a Value_Range.
* tree-ssa-strlen.cc (get_range): Same.
* value-query.cc (range_query::get_tree_range):  Handle both
integers and pointers.
* vr-values.cc (simplify_using_ranges::fold_cond_with_ops): Make
r0 and r1 Value_Range's.

gcc/tree-ssa-loop-split.cc
gcc/tree-ssa-strlen.cc
gcc/value-query.cc
gcc/vr-values.cc

index a770ea371a2d9d89ebd0436a1c54cc6e34b43024..a6be0cef7b0938fce5856c36ae4a41b0f8146735 100644 (file)
@@ -144,18 +144,18 @@ split_at_bb_p (class loop *loop, basic_block bb, tree *border, affine_iv *iv,
           value range.  */
        else
          {
-           int_range<2> r;
+           Value_Range r (TREE_TYPE (op0));
            get_global_range_query ()->range_of_expr (r, op0, stmt);
            if (!r.varying_p () && !r.undefined_p ()
                && TREE_CODE (op1) == INTEGER_CST)
              {
                wide_int val = wi::to_wide (op1);
-               if (known_eq (val, r.lower_bound ()))
+               if (known_eq (val, wi::to_wide (r.lbound ())))
                  {
                    code = (code == EQ_EXPR) ? LE_EXPR : GT_EXPR;
                    break;
                  }
-               else if (known_eq (val, r.upper_bound ()))
+               else if (known_eq (val, wi::to_wide (r.ubound ())))
                  {
                    code = (code == EQ_EXPR) ? GE_EXPR : LT_EXPR;
                    break;
index e09c9cc081f5bb59403123ef0fc7c8a24ac5cfc2..61c3da22322cfed7bd1d8c1884f63c77af2620e1 100644 (file)
@@ -215,7 +215,7 @@ get_range (tree val, gimple *stmt, wide_int minmax[2],
       rvals = get_range_query (cfun);
     }
 
-  value_range vr;
+  Value_Range vr (TREE_TYPE (val));
   if (!rvals->range_of_expr (vr, val, stmt))
     return NULL_TREE;
 
index eda71dc89d3f8c789980f6aa9eccf836ec4e9b5d..052b7511565433ee99e01e86975ce19810dfdc6c 100644 (file)
@@ -156,11 +156,9 @@ range_query::get_tree_range (vrange &r, tree expr, gimple *stmt)
     {
     case INTEGER_CST:
       {
-       irange &i = as_a <irange> (r);
        if (TREE_OVERFLOW_P (expr))
          expr = drop_tree_overflow (expr);
-       wide_int w = wi::to_wide (expr);
-       i.set (TREE_TYPE (expr), w, w);
+       r.set (expr, expr);
        return true;
       }
 
index ff68d40c3551f21f2baf5e13aeee59f5a79e6fb2..0572bf6c8c733c94483c7906cab24159085c5fb3 100644 (file)
@@ -310,7 +310,8 @@ tree
 simplify_using_ranges::fold_cond_with_ops (enum tree_code code,
                                           tree op0, tree op1, gimple *s)
 {
-  int_range_max r0, r1;
+  Value_Range r0 (TREE_TYPE (op0));
+  Value_Range r1 (TREE_TYPE (op1));
   if (!query->range_of_expr (r0, op0, s)
       || !query->range_of_expr (r1, op1, s))
     return NULL_TREE;