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