[gcc r17-3508] Improve infer::clear performance.

Andrew Macleod via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:aa96619908895ff3b0ddf1d9d9a570f7ec888c41

commit r17-3508-gaa96619908895ff3b0ddf1d9d9a570f7ec888c41
Author: Andrew MacLeod <[email protected]>
Date:   Thu Aug 20 12:00:42 2026 -0400

    Improve infer::clear performance.
    
    Remove the full CFG walk replace it with a linked list walk.
    
            PR tree-optimization/126856
            * gimple-range-infer.cc (exit_range::name_link): New.
            (infer_range_manager::infer_range_manager): Adjust for rename
            from m_nonzero to m_name_info.
            (infer_range_manager::~infer_range_manager): Likewise.
            (infer_range_manager::get_nonzero): Likewise
            (infer_range_manager::add_range): Add to name_link list.
            (infer_range_manager::clear): Walk name_link list.
            * gimple-range-infer.h (class ssa_name_link): New vec.
            (infer_range_manager::m_nonzero): Retype and rename to m_name_info.

Diff:
---
 gcc/gimple-range-infer.cc | 51 +++++++++++++++++++++++------------------------
 gcc/gimple-range-infer.h  |  8 +++++++-
 2 files changed, 32 insertions(+), 27 deletions(-)

diff --git a/gcc/gimple-range-infer.cc b/gcc/gimple-range-infer.cc
index 5f0f7efcc012..7dea875cb86e 100644
--- a/gcc/gimple-range-infer.cc
+++ b/gcc/gimple-range-infer.cc
@@ -311,6 +311,7 @@ public:
   gimple *stmt;
   vrange_storage *range;
   exit_range *next;
+  exit_range *name_link;
 };
 
 
@@ -353,8 +354,8 @@ infer_range_manager::infer_range_manager (bool do_search, range_query *q)
     m_seen = NULL;
   obstack_init (&m_list_obstack);
   // Non-zero elements are very common, so cache them for each ssa-name.
-  m_nonzero.create (0);
-  m_nonzero.safe_grow_cleared (num_ssa_names + 1);
+  m_name_info.create (0);
+  m_name_info.safe_grow_cleared (num_ssa_names + 1);
   m_range_allocator = new vrange_allocator;
 }
 
@@ -362,7 +363,7 @@ infer_range_manager::infer_range_manager (bool do_search, range_query *q)
 
 infer_range_manager::~infer_range_manager ()
 {
-  m_nonzero.release ();
+  m_name_info.release ();
   obstack_free (&m_list_obstack, NULL);
   m_on_exit.release ();
   bitmap_obstack_release (&m_bitmaps);
@@ -376,15 +377,15 @@ const vrange&
 infer_range_manager::get_nonzero (tree name)
 {
   unsigned v = SSA_NAME_VERSION (name);
-  if (v >= m_nonzero.length ())
-    m_nonzero.safe_grow_cleared (num_ssa_names + 20);
-  if (!m_nonzero[v])
+  if (v >= m_name_info.length ())
+    m_name_info.safe_grow_cleared (num_ssa_names + 20);
+  if (!m_name_info[v].nonzero)
     {
-      m_nonzero[v]
+      m_name_info[v].nonzero
 	= (irange *) m_range_allocator->alloc (sizeof (int_range <2>));
-      m_nonzero[v]->set_nonzero (TREE_TYPE (name));
+      m_name_info[v].nonzero->set_nonzero (TREE_TYPE (name));
     }
-  return *(m_nonzero[v]);
+  return *(m_name_info[v].nonzero);
 }
 
 // Return TRUE if NAME has a range inference in block BB.  If NAME is NULL,
@@ -453,6 +454,9 @@ infer_range_manager::add_range (tree name, gimple *s, const vrange &r)
   if (bb->index >= (int)m_on_exit.length ())
     m_on_exit.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
 
+  if (SSA_NAME_VERSION (name) >= m_name_info.length ())
+    m_name_info.safe_grow_cleared (num_ssa_names + 20);
+
   // Create the summary list bitmap if it doesn't exist.
   if (!m_on_exit[bb->index].m_names)
       m_on_exit[bb->index].m_names = BITMAP_ALLOC (&m_bitmaps);
@@ -493,6 +497,8 @@ infer_range_manager::add_range (tree name, gimple *s, const vrange &r)
   ptr->name = name;
   ptr->stmt = s;
   ptr->next = m_on_exit[bb->index].head;
+  ptr->name_link = m_name_info[SSA_NAME_VERSION (name)].name_link;
+  m_name_info[SSA_NAME_VERSION (name)].name_link = ptr;
   m_on_exit[bb->index].head = ptr;
 }
 
@@ -538,28 +544,21 @@ infer_range_manager::register_all_uses (tree name)
 void
 infer_range_manager::clear(tree name)
 {
-  if (!m_seen)
-    return;
-
   // Check if this name has any inferred ranges.
   unsigned v = SSA_NAME_VERSION (name);
-  if (!bitmap_bit_p (m_seen, v))
-     return;
+  if (v >= m_name_info.length ())
+    return;
 
-  // Check each basic block for an inferred range.
-  basic_block bb;
-  FOR_EACH_BB_FN (bb, cfun)
+  exit_range *ptr = m_name_info[v].name_link;
+  for ( ; ptr ; ptr = ptr->name_link)
     {
+      basic_block bb = gimple_bb (ptr->stmt);
       unsigned bbi = bb->index;
-      if (bbi >= m_on_exit.length ())
-	continue;
-      exit_range *ptr = m_on_exit[bbi].find_ptr (name);
-      if (ptr)
-	{
-	  bitmap_clear_bit (m_on_exit[bbi].m_names, v);
-	  ptr->name = NULL;
-	}
+      bitmap_clear_bit (m_on_exit[bbi].m_names, v);
+      ptr->name = NULL;
     }
 
-  bitmap_clear_bit (m_seen, v);
+  m_name_info[v].name_link = NULL;
+  if (m_seen)
+    bitmap_clear_bit (m_seen, v);
 }
diff --git a/gcc/gimple-range-infer.h b/gcc/gimple-range-infer.h
index ca95e121633b..b8eced2558e9 100644
--- a/gcc/gimple-range-infer.h
+++ b/gcc/gimple-range-infer.h
@@ -128,10 +128,16 @@ private:
     int m_num_ranges;
     exit_range *find_ptr (tree name);
   };
+  class ssa_name_link
+  {
+  public:
+    vrange *nonzero;
+    exit_range *name_link;
+  };
   void register_all_uses (tree name);
   vec <exit_range_head> m_on_exit;
+  vec <ssa_name_link> m_name_info;
   const vrange &get_nonzero (tree name);
-  vec <vrange *> m_nonzero;
   bitmap m_seen;
   bitmap_obstack m_bitmaps;
   struct obstack m_list_obstack;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.