https://gcc.gnu.org/g:6c64a85ebec448503c3247fc30923e14cc7074fd

commit r15-800-g6c64a85ebec448503c3247fc30923e14cc7074fd
Author: Andrew MacLeod <amacl...@redhat.com>
Date:   Fri May 17 10:44:27 2024 -0400

    Allow components to be shared among range-queries.
    
    Ranger and the ranger cache need to share components, this provides a
    blessed way to do so.
    
            * gimple-range.cc (gimple_ranger::gimple_ranger): Share the
            components from ranger_cache.
            (gimple_ranger::~gimple_ranger): Don't clear pointer.
            * value-query.cc (range_query::share_query): New.
            (range_query::range_query): Clear shared component flag.
            (range_query::~range_query): Don't free shared component copies.
            * value-query.h (share_query): New prototype.
            (m_shared_copy_p): New member.

Diff:
---
 gcc/gimple-range.cc |  4 +---
 gcc/value-query.cc  | 11 +++++++++++
 gcc/value-query.h   |  5 +++++
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc
index 9664300a80b..4326976fc2a 100644
--- a/gcc/gimple-range.cc
+++ b/gcc/gimple-range.cc
@@ -44,7 +44,7 @@ gimple_ranger::gimple_ranger (bool use_imm_uses) :
        current_bb (NULL)
 {
   // Share the oracle from the cache.
-  m_relation = &m_cache.relation ();
+  share_query (m_cache);
   if (dump_file && (param_ranger_debug & RANGER_DEBUG_TRACE))
     tracer.enable_trace ();
   m_stmt_list.create (0);
@@ -67,8 +67,6 @@ gimple_ranger::gimple_ranger (bool use_imm_uses) :
 
 gimple_ranger::~gimple_ranger ()
 {
-  // Restore the original oracle.
-  m_relation = NULL;
   m_stmt_list.release ();
 }
 
diff --git a/gcc/value-query.cc b/gcc/value-query.cc
index db64a95a284..adcc59cadbf 100644
--- a/gcc/value-query.cc
+++ b/gcc/value-query.cc
@@ -211,13 +211,24 @@ range_query::destroy_relation_oracle ()
     }
 }
 
+void
+range_query::share_query (range_query &q)
+{
+  m_relation = q.m_relation;
+  m_shared_copy_p = true;
+}
+
 range_query::range_query ()
 {
   m_relation = &default_relation_oracle;
+  m_shared_copy_p = false;
 }
 
 range_query::~range_query ()
 {
+  // Do not destroy anything if this is a shared copy.
+  if (m_shared_copy_p)
+    return;
   destroy_relation_oracle ();
 }
 
diff --git a/gcc/value-query.h b/gcc/value-query.h
index a8688a099fa..a5735902af0 100644
--- a/gcc/value-query.h
+++ b/gcc/value-query.h
@@ -88,6 +88,11 @@ protected:
                             basic_block bbentry, basic_block bbexit);
   bool get_arith_expr_range (vrange &r, tree expr, gimple *stmt);
   relation_oracle *m_relation;
+  // When multiple related range queries wish to share oracles.
+  // This is an internal interface
+  void share_query (range_query &q);
+  bool m_shared_copy_p;
+
 };
 
 // Global ranges for SSA names using SSA_NAME_RANGE_INFO.

Reply via email to