https://gcc.gnu.org/g:c1f89612bc0aba9c5d5c7f167d8915b7b20518cd
commit r16-5321-gc1f89612bc0aba9c5d5c7f167d8915b7b20518cd Author: Andrew MacLeod <[email protected]> Date: Fri Nov 14 15:39:18 2025 -0500 Update current query global when system global changes. This ensures a the current range_query's internal tracking of a global value matches anything another entity sets. * gimple-range.cc (gimple_ranger::update_range_info): New. * gimple-range.h (update_range_info): New prototype. * tree-ssanames.cc (set_range_info): Update the range info for the current range query. * value-query.h (update_range_info): New prototype. * value-query.cc (update_range_info): New default stub. Diff: --- gcc/gimple-range.cc | 12 ++++++++++++ gcc/gimple-range.h | 1 + gcc/tree-ssanames.cc | 2 ++ gcc/value-query.cc | 6 ++++++ gcc/value-query.h | 3 ++- 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index ced574d72f3c..c4093e61d619 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -554,6 +554,18 @@ gimple_ranger::register_transitive_inferred_ranges (basic_block bb) } } +// This is called to update ranger's concept of a global value for NAME +// with range R by an outside entity. + +void +gimple_ranger::update_range_info (tree name, const vrange &r) +{ + value_range current (TREE_TYPE (name)); + m_cache.get_global_range (current, name); + if (current.intersect (r)) + m_cache.set_global_range (name, current, true); +} + // This routine will export whatever global ranges are known to GCC // SSA_RANGE_NAME_INFO and SSA_NAME_PTR_INFO fields. diff --git a/gcc/gimple-range.h b/gcc/gimple-range.h index bae75a69ad48..5017a96fd483 100644 --- a/gcc/gimple-range.h +++ b/gcc/gimple-range.h @@ -54,6 +54,7 @@ public: virtual bool range_on_edge (vrange &r, edge e, tree name) override; virtual bool range_on_entry (vrange &r, basic_block bb, tree name) override; virtual bool range_on_exit (vrange &r, basic_block bb, tree name) override; + virtual void update_range_info (tree, const vrange &) override; void export_global_ranges (); virtual void dump (FILE *f) override; void debug (); diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc index 3d915738c987..e3788f00f7f2 100644 --- a/gcc/tree-ssanames.cc +++ b/gcc/tree-ssanames.cc @@ -457,6 +457,8 @@ set_range_info (tree name, const vrange &r) tmp.dump (dump_file); fputc ('\n', dump_file); } + // Update the active query, if needed. + get_range_query (cfun)->update_range_info (name, r); return true; } diff --git a/gcc/value-query.cc b/gcc/value-query.cc index 194a3ffa41c8..6060abb3d956 100644 --- a/gcc/value-query.cc +++ b/gcc/value-query.cc @@ -66,6 +66,12 @@ range_query::range_of_stmt (vrange &r, gimple *stmt, tree name) return false; } +// Default for updating range info is to do nothing. +void +range_query::update_range_info (tree, const vrange &) +{ +} + // If the range of expr EXPR at STMT is a single value, return it. // Otherwise return NULL_TREE. diff --git a/gcc/value-query.h b/gcc/value-query.h index eb5b867fc849..db1bb36e38fa 100644 --- a/gcc/value-query.h +++ b/gcc/value-query.h @@ -75,6 +75,8 @@ public: virtual bool range_on_entry (vrange &r, basic_block bb, tree expr); virtual bool range_on_exit (vrange &r, basic_block bb, tree expr); + virtual void update_range_info (tree name, const vrange &r); + inline class relation_oracle &relation () const { return *m_relation; } void create_relation_oracle (bool do_trans_p = true); void destroy_relation_oracle (); @@ -105,7 +107,6 @@ protected: // This is an internal interface void share_query (range_query &q); bool m_shared_copy_p; - }; // Global ranges for SSA names using SSA_NAME_RANGE_INFO.
