From: Andrew MacLeod Date: Tue, 11 Nov 2025 07:27:43 +0000 (+0100) Subject: Support edge query for range_query::get_tree_range X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b22e843467caec89ac943659fec6c8375c6c81d;p=thirdparty%2Fgcc.git 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 --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;