This patch provides an API to allow the global range curently stored by a range query to be updated.

Previously, when a pass or other tool determined a range, there was no good way to pass that on to the current query. This sometimes causes some synchronization issues.

This patch also causes set_range_info() to use this routine to make sure that whenever a global range is updated, it is reflected in the current query.

Bootstraps on x86_64-pc-linux-gnu with no regressions.  pushed.

Andrew


From c1f89612bc0aba9c5d5c7f167d8915b7b20518cd Mon Sep 17 00:00:00 2001
From: Andrew MacLeod <[email protected]>
Date: Fri, 14 Nov 2025 15:39:18 -0500
Subject: [PATCH 1/4] 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.
---
 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 ced574d72f3..c4093e61d61 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 bae75a69ad4..5017a96fd48 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 3d915738c98..e3788f00f7f 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 194a3ffa41c..6060abb3d95 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 eb5b867fc84..db1bb36e38f 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.
-- 
2.45.0

Reply via email to