From: Andrew MacLeod <[email protected]>

The following adds an edge argument to get_tree_range and invoke_range_of_expr
to support range_on_edge queries for GENERIC expressions.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        * 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 | 22 ++++++++++++++--------
 gcc/value-query.h  |  5 +++--
 2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/gcc/value-query.cc b/gcc/value-query.cc
index c4e50834646..194a3ffa41c 100644
--- a/gcc/value-query.cc
+++ b/gcc/value-query.cc
@@ -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);
        }
diff --git a/gcc/value-query.h b/gcc/value-query.h
index ee648709199..eb5b867fc84 100644
--- a/gcc/value-query.h
+++ b/gcc/value-query.h
@@ -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;
-- 
2.51.0

Reply via email to