From 71baa009496c9ba6e1f71aebb4e96b03c32b3957 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Wed, 24 May 2023 09:06:26 -0400 Subject: [PATCH] Make ssa_cache a range_query. By providing range_of_expr as a range_query, we can fold and do other interesting things using values from the global table. Make ranger's knonw globals available via const_query. * gimple-range-cache.cc (ssa_cache::range_of_expr): New. * gimple-range-cache.h (class ssa_cache): Inherit from range_query. (ranger_cache::const_query): New. * gimple-range.cc (gimple_ranger::const_query): New. * gimple-range.h (gimple_ranger::const_query): New prototype. --- gcc/gimple-range-cache.cc | 14 ++++++++++++++ gcc/gimple-range-cache.h | 5 ++++- gcc/gimple-range.cc | 8 ++++++++ gcc/gimple-range.h | 1 + 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index f25abaffd341..52165d2405bc 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -545,6 +545,20 @@ ssa_cache::~ssa_cache () delete m_range_allocator; } +// Enable a query to evaluate staements/ramnges based on picking up ranges +// from just an ssa-cache. + +bool +ssa_cache::range_of_expr (vrange &r, tree expr, gimple *stmt) +{ + if (!gimple_range_ssa_p (expr)) + return get_tree_range (r, expr, stmt); + + if (!get_range (r, expr)) + gimple_range_global (r, expr, cfun); + return true; +} + // Return TRUE if the global range of NAME has a cache entry. bool diff --git a/gcc/gimple-range-cache.h b/gcc/gimple-range-cache.h index 4fc982304300..afcf8d7de7b6 100644 --- a/gcc/gimple-range-cache.h +++ b/gcc/gimple-range-cache.h @@ -52,7 +52,7 @@ private: // has been visited during this incarnation. Once the ranger evaluates // a name, it is typically not re-evaluated again. -class ssa_cache +class ssa_cache : public range_query { public: ssa_cache (); @@ -63,6 +63,8 @@ public: virtual void clear_range (tree name); virtual void clear (); void dump (FILE *f = stderr); + virtual bool range_of_expr (vrange &r, tree expr, gimple *stmt); + protected: vec m_tab; vrange_allocator *m_range_allocator; @@ -103,6 +105,7 @@ public: bool get_global_range (vrange &r, tree name) const; bool get_global_range (vrange &r, tree name, bool ¤t_p); void set_global_range (tree name, const vrange &r, bool changed = true); + range_query &const_query () { return m_globals; } void propagate_updated_value (tree name, basic_block bb); diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index 4fae3f95e6ab..01e62d3ff390 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -70,6 +70,14 @@ gimple_ranger::~gimple_ranger () m_stmt_list.release (); } +// Return a range_query which accesses just the known global values. + +range_query & +gimple_ranger::const_query () +{ + return m_cache.const_query (); +} + bool gimple_ranger::range_of_expr (vrange &r, tree expr, gimple *stmt) { diff --git a/gcc/gimple-range.h b/gcc/gimple-range.h index e3aa9475f5e8..6587e4923ff4 100644 --- a/gcc/gimple-range.h +++ b/gcc/gimple-range.h @@ -64,6 +64,7 @@ public: bool fold_stmt (gimple_stmt_iterator *gsi, tree (*) (tree)); void register_inferred_ranges (gimple *s); void register_transitive_inferred_ranges (basic_block bb); + range_query &const_query (); protected: bool fold_range_internal (vrange &r, gimple *s, tree name); void prefill_name (vrange &r, tree name); -- 2.47.2