]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Support edge query for range_query::get_tree_range
authorAndrew MacLeod <amacleod@redhat.com>
Tue, 11 Nov 2025 07:27:43 +0000 (08:27 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 11 Nov 2025 08:55:32 +0000 (09:55 +0100)
The following adds an edge argument to get_tree_range and invoke_range_of_expr
to support range_on_edge queries for GENERIC expressions.

* value-query.cc (range_query::invoke_range_of_expr): New
edge argument.  If set invoke range_on_edge.
(range_query::get_tree_range): Likewise and adjust.
* value-query.h (range_query::invoke_range_of_expr): New
edge argument.
(range_query::get_tree_range): Likewise.

gcc/value-query.cc
gcc/value-query.h

index c4e508346465b7e665c435f5d937b42e6db065bb..194a3ffa41c876780dcaf260a888c7424fcbe811 100644 (file)
@@ -294,18 +294,24 @@ range_query::~range_query ()
 
 bool
 range_query::invoke_range_of_expr (vrange &r, tree expr, gimple *stmt,
-                                  basic_block bbentry, basic_block bbexit)
+                                  basic_block bbentry, basic_block bbexit,
+                                  edge e)
 {
   if (bbentry)
     {
-      gcc_checking_assert (!stmt && !bbexit);
+      gcc_checking_assert (!stmt && !bbexit && !e);
       return range_on_entry (r, bbentry, expr);
     }
   if (bbexit)
     {
-      gcc_checking_assert (!stmt);
+      gcc_checking_assert (!stmt && !e);
       return range_on_exit (r, bbexit, expr);
     }
+  if (e)
+    {
+      gcc_checking_assert (!stmt);
+      return range_on_edge (r, e, expr);
+    }
 
   return range_of_expr (r, expr, stmt);
 }
@@ -316,7 +322,7 @@ range_query::invoke_range_of_expr (vrange &r, tree expr, gimple *stmt,
 
 bool
 range_query::get_tree_range (vrange &r, tree expr, gimple *stmt,
-                            basic_block bbentry, basic_block bbexit)
+                            basic_block bbentry, basic_block bbexit, edge e)
 {
   tree type;
   if (TYPE_P (expr))
@@ -364,7 +370,7 @@ range_query::get_tree_range (vrange &r, tree expr, gimple *stmt,
     case SSA_NAME:
       // If this is not an abnormal or virtual ssa, invoke range_of_expr.
       if (gimple_range_ssa_p (expr))
-       return invoke_range_of_expr (r, expr, stmt, bbentry, bbexit);
+       return invoke_range_of_expr (r, expr, stmt, bbentry, bbexit, e);
       gimple_range_global (r, expr);
       return true;
 
@@ -402,8 +408,8 @@ range_query::get_tree_range (vrange &r, tree expr, gimple *stmt,
        {
          value_range r0 (TREE_TYPE (op0));
          value_range r1 (TREE_TYPE (op1));
-         invoke_range_of_expr (r0, op0, stmt, bbentry, bbexit);
-         invoke_range_of_expr (r1, op1, stmt, bbentry, bbexit);
+         invoke_range_of_expr (r0, op0, stmt, bbentry, bbexit, e);
+         invoke_range_of_expr (r1, op1, stmt, bbentry, bbexit, e);
          if (!op.fold_range (r, type, r0, r1))
            r.set_varying (type);
        }
@@ -421,7 +427,7 @@ range_query::get_tree_range (vrange &r, tree expr, gimple *stmt,
          value_range r1 (type);
          r1.set_varying (type);
          invoke_range_of_expr (r0, TREE_OPERAND (expr, 0), stmt, bbentry,
-                               bbexit);
+                               bbexit, e);
          if (!op.fold_range (r, type, r0, r1))
            r.set_varying (type);
        }
index ee648709199986c39e37670e9fa22920843be387..eb5b867fc8494e65b3fec68f2c9a2e42177c3fa3 100644 (file)
@@ -92,9 +92,10 @@ public:
 
 protected:
   bool get_tree_range (vrange &v, tree expr, gimple *stmt,
-                      basic_block bbentry = NULL, basic_block bbexit = NULL);
+                      basic_block bbentry = NULL, basic_block bbexit = NULL,
+                      edge e = NULL);
   bool invoke_range_of_expr (vrange &v, tree expr, gimple *stmt,
-                            basic_block bbentry, basic_block bbexit);
+                            basic_block bbentry, basic_block bbexit, edge e);
   bool get_arith_expr_range (vrange &r, tree expr, gimple *stmt);
   relation_oracle *m_relation;
   infer_range_oracle *m_infer;