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.