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