]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Add a merge_range to ssa_cache and use it. add empty_p and param tweaks.
authorAndrew MacLeod <amacleod@redhat.com>
Fri, 28 Jul 2023 15:00:57 +0000 (11:00 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Fri, 28 Jul 2023 20:32:12 +0000 (16:32 -0400)
* gimple-range-cache.cc (ssa_cache::merge_range): New.
(ssa_lazy_cache::merge_range): New.
* gimple-range-cache.h (class ssa_cache): Adjust protoypes.
(class ssa_lazy_cache): Ditto.
* gimple-range.cc (assume_query::calculate_op): Use merge_range.

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

index 52165d2405bcb8e50db40bc6c5adc1b96f7eb033..5b74681b61a6324ea88fa8259dbbab2ed891e705 100644 (file)
@@ -605,6 +605,32 @@ ssa_cache::set_range (tree name, const vrange &r)
   return m != NULL;
 }
 
+// If NAME has a range, intersect it with R, otherwise set it to R.
+// Return TRUE if there was already a range set, otherwise false.
+
+bool
+ssa_cache::merge_range (tree name, const vrange &r)
+{
+  unsigned v = SSA_NAME_VERSION (name);
+  if (v >= m_tab.length ())
+    m_tab.safe_grow_cleared (num_ssa_names + 1);
+
+  vrange_storage *m = m_tab[v];
+  if (m)
+    {
+      Value_Range curr (TREE_TYPE (name));
+      m->get_vrange (curr, TREE_TYPE (name));
+      curr.intersect (r);
+      if (m->fits_p (curr))
+       m->set_vrange (curr);
+      else
+       m_tab[v] = m_range_allocator->clone (curr);
+    }
+  else
+    m_tab[v] = m_range_allocator->clone (r);
+  return m != NULL;
+}
+
 // Set the range for NAME to R in the ssa cache.
 
 void
@@ -689,6 +715,25 @@ ssa_lazy_cache::set_range (tree name, const vrange &r)
   return false;
 }
 
+// If NAME has a range, intersect it with R, otherwise set it to R.
+// Return TRUE if there was already a range set, otherwise false.
+
+bool
+ssa_lazy_cache::merge_range (tree name, const vrange &r)
+{
+  unsigned v = SSA_NAME_VERSION (name);
+  if (!bitmap_set_bit (active_p, v))
+    {
+      // There is already an entry, simply merge it.
+      gcc_checking_assert (v < m_tab.length ());
+      return ssa_cache::merge_range (name, r);
+    }
+  if (v >= m_tab.length ())
+    m_tab.safe_grow (num_ssa_names + 1);
+  m_tab[v] = m_range_allocator->clone (r);
+  return false;
+}
+
 // Return TRUE if NAME has a range, and return it in R.
 
 bool
index a0f436b572393b4ef0c19e2c064543af1baf54f6..bbb9b18a10c50d3d6288c97615c86a87e3fdf8d2 100644 (file)
@@ -61,11 +61,11 @@ public:
   virtual bool has_range (tree name) const;
   virtual bool get_range (vrange &r, tree name) const;
   virtual bool set_range (tree name, const vrange &r);
+  virtual bool merge_range (tree name, const vrange &r);
   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);
-
+  virtual bool range_of_expr (vrange &r, tree expr, gimple *stmt = NULL);
 protected:
   vec<vrange_storage *> m_tab;
   vrange_allocator *m_range_allocator;
@@ -80,8 +80,10 @@ class ssa_lazy_cache : public ssa_cache
 public:
   inline ssa_lazy_cache () { active_p = BITMAP_ALLOC (NULL); }
   inline ~ssa_lazy_cache () { BITMAP_FREE (active_p); }
+  inline bool empty_p () const { return bitmap_empty_p (active_p); }
   virtual bool has_range (tree name) const;
   virtual bool set_range (tree name, const vrange &r);
+  virtual bool merge_range (tree name, const vrange &r);
   virtual bool get_range (vrange &r, tree name) const;
   virtual void clear_range (tree name);
   virtual void clear ();
index 01e62d3ff3901143bde33dc73c0debf41d0c0fdd..01173c58f02b424f8a131e1fc9fda17dcf1d70f9 100644 (file)
@@ -809,10 +809,8 @@ assume_query::calculate_op (tree op, gimple *s, vrange &lhs, fur_source &src)
   if (m_gori.compute_operand_range (op_range, s, lhs, op, src)
       && !op_range.varying_p ())
     {
-      Value_Range range (TREE_TYPE (op));
-      if (global.get_range (range, op))
-       op_range.intersect (range);
-      global.set_range (op, op_range);
+      // Set the global range, merging if there is already a range.
+      global.merge_range (op, op_range);
       gimple *def_stmt = SSA_NAME_DEF_STMT (op);
       if (def_stmt && gimple_get_lhs (def_stmt) == op)
        calculate_stmt (def_stmt, op_range, src);