https://gcc.gnu.org/g:0b22e843467caec89ac943659fec6c8375c6c81d
commit r16-5162-g0b22e843467caec89ac943659fec6c8375c6c81d Author: Andrew MacLeod <[email protected]> Date: Tue Nov 11 08:27:43 2025 +0100 Support edge query for range_query::get_tree_range 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. Diff: --- 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 c4e508346465..194a3ffa41c8 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 ee6487091999..eb5b867fc849 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;
