]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
update_range_info can mark a statement for recalculation.
authorAndrew MacLeod <amacleod@redhat.com>
Wed, 3 Dec 2025 18:24:11 +0000 (13:24 -0500)
committerAndrew MacLeod <amacleod@redhat.com>
Mon, 4 May 2026 15:45:26 +0000 (11:45 -0400)
Add an alternative update_range_info method which marks the SSA_NAME as
"to be recalcualted" the next time it is used.

* gimple-range-cache.cc (ranger_cache::ranger_cache): Allocate bitmap.
(ranger_cache::~ranger_cache): Free bitmap.
(ranger_cache::mark_stale): New.
(ranger_cache::get_global_range): Check if NAME is marked stale.
* gimple-range-cache.h (ranger_cache::mark_stale): New.
* gimple-range.cc (gimple_ranger::update_range_info): New variant.
* gimple-range.h (update_range_info): New prototype.
* gimple.h (gimple_set_modified): Call update_range_info.
* value-query.cc (range_query::update_range_info): New variant.
* value-query.h (range_query::update_range_info): New prototype.

gcc/gimple-range-cache.cc
gcc/gimple-range-cache.h
gcc/gimple-range.cc
gcc/gimple-range.h
gcc/gimple.h
gcc/value-query.cc
gcc/value-query.h

index 380590b6dca60dd9ddc7ee355587d393e1b8551b..02af482838deb9e077de41b9f3b92d92e042236e 100644 (file)
@@ -1019,10 +1019,12 @@ ranger_cache::ranger_cache (int not_executable_flag, bool use_imm_uses)
        gori_ssa ()->exports (bb);
     }
   m_update = new update_list ();
+  m_stale = BITMAP_ALLOC (NULL);
 }
 
 ranger_cache::~ranger_cache ()
 {
+  BITMAP_FREE (m_stale);
   delete m_update;
   destroy_infer_oracle ();
   destroy_relation_oracle ();
@@ -1064,6 +1066,17 @@ ranger_cache::get_global_range (vrange &r, tree name) const
   return false;
 }
 
+// Mark NAME as stale.  The next query of NAME forces a recalculation.
+
+void
+ranger_cache::mark_stale (tree name)
+{
+  // Only mark it as stale if it has been processed. If it has no range
+  // it will be calculated at the next request anyway.
+  if (m_globals.has_range (name))
+    bitmap_set_bit (m_stale, SSA_NAME_VERSION (name));
+}
+
 // Get the global range for NAME, and return in R.  Return false if the
 // global range is not set, and R will contain the legacy global value.
 // CURRENT_P is set to true if the value was in cache and not stale.
@@ -1102,6 +1115,13 @@ ranger_cache::get_global_range (vrange &r, tree name, bool &current_p)
       m_globals.set_range (name, r);
     }
 
+  // If NAME is out of date, clear the bit and mark as not current.
+  if (bitmap_bit_p (m_stale, SSA_NAME_VERSION (name)))
+    {
+      bitmap_clear_bit (m_stale, SSA_NAME_VERSION (name));
+      current_p = false;
+    }
+
   // If the existing value was not current, mark it as always current.
   if (!current_p)
     m_temporal->set_always_current (name, true);
index 9e01005016e3c1c230d781708a08252f93dce6e7..e01f35a548dbf4c617528bd147563cc29d3e1944 100644 (file)
@@ -111,6 +111,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);
+  void mark_stale (tree name);
   void update_consumers (tree name);
   range_query &const_query () { return m_globals; }
 
@@ -143,6 +144,7 @@ private:
 
   vec<basic_block> m_workback;
   class update_list *m_update;
+  bitmap m_stale;
 };
 
 #endif // GCC_SSA_RANGE_CACHE_H
index 4c768ed3a07d2a885b74886fb8999414e81d088a..a65d626b43ccc3b61b0f861a04e2657196dd8061 100644 (file)
@@ -556,6 +556,14 @@ gimple_ranger::register_transitive_inferred_ranges (basic_block bb)
     }
 }
 
+// Indicate NAME should have its range recalculated next time it is used.
+
+void
+gimple_ranger::update_range_info (tree name)
+{
+  m_cache.mark_stale (name);
+}
+
 // This is called to update ranger's concept of a global value for NAME
 // with range R by an outside entity.
 
@@ -565,7 +573,10 @@ 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);
+    {
+      m_cache.set_global_range (name, current, true);
+      m_cache.mark_stale (name);
+    }
 }
 
 // This routine will export whatever global ranges are known to GCC
index 77e1bb9efd8b0ebfd4f2e8a1bdcaff81a7a70437..b7df438e3691bf9176ccbd2f6c4b2d2e31dee416 100644 (file)
@@ -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) override;
   virtual void update_range_info (tree, const vrange &) override;
   void export_global_ranges ();
   virtual void dump (FILE *f) override;
index 2484a33f47651a440b5b87cba9027b5443ec9a3e..8372210084935de787050eb4e0eaf497df5544c2 100644 (file)
@@ -24,6 +24,9 @@ along with GCC; see the file COPYING3.  If not see
 
 #include "tree-ssa-alias.h"
 #include "gimple-expr.h"
+#include "bitmap.h"
+#include "value-range.h"
+#include "value-query.h"
 
 typedef gimple *gimple_seq_node;
 
@@ -2309,7 +2312,16 @@ inline void
 gimple_set_modified (gimple *s, bool modifiedp)
 {
   if (gimple_has_ops (s))
-    s->modified = (unsigned) modifiedp;
+    {
+      s->modified = (unsigned) modifiedp;
+      // Mark the LHS as out of date with the current range query.
+      if (modifiedp)
+       {
+         tree def = gimple_get_lhs (s);
+         if (def && TREE_CODE (def) == SSA_NAME)
+           get_range_query (cfun)->update_range_info (def);
+       }
+    }
 }
 
 
index 5fbe8f932a67952a0cc954212982e3c614b99509..3f50e31a9f44c1e9366ee90e16885d2c3f732df0 100644 (file)
@@ -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)
+{
+}
+
 // Default for updating range info is to do nothing.
 void
 range_query::update_range_info (tree, const vrange &)
index 3cbe0314cef4ad836b87882c91f636e9caf3d38c..7756e431155a85b44fbf42564da891cf267d4523 100644 (file)
@@ -75,6 +75,9 @@ 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);
 
+  // Indicate that NAME should be considered for a range update.
+  virtual void update_range_info (tree name);
+  // Provide a specific range update to NAME.
   virtual void update_range_info (tree name, const vrange &r);
 
   inline class relation_oracle &relation () const  { return *m_relation; }