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.

Reply via email to