]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Make ssa_cache a range_query.
authorAndrew MacLeod <amacleod@redhat.com>
Wed, 24 May 2023 13:06:26 +0000 (09:06 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Wed, 24 May 2023 20:40:11 +0000 (16:40 -0400)
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
gcc/gimple-range-cache.h
gcc/gimple-range.cc
gcc/gimple-range.h

index f25abaffd341e44fa8c5147e9fd08c0320ed6469..52165d2405bcb8e50db40bc6c5adc1b96f7eb033 100644 (file)
@@ -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
index 4fc982304300cb3fc54fd4f9227d2f00ba3f1d70..afcf8d7de7b63d18025978aa3c09b52cb8e8d664 100644 (file)
@@ -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<vrange_storage *> 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 &current_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);
 
index 4fae3f95e6abd0ee9eb7add9866a0eab96466ee8..01e62d3ff3901143bde33dc73c0debf41d0c0fdd 100644 (file)
@@ -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)
 {
index e3aa9475f5e8ddc896b4d356734e3e412bad2620..6587e4923ff44e10826a697ecced237a0ad23c88 100644 (file)
@@ -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);