From 07441e41f5eb4d385e8ee7cfb50b5d71520bff74 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Fri, 17 May 2024 10:50:24 -0400 Subject: Move infer_manager to a range_query oracle. Turn the infer_manager class into an always available oracle accessible via a range_query object. Also assocaite each inferrred range with it's originating stmt. * gimple-range-cache.cc (ranger_cache::ranger_cache): Create an infer oracle instead of a local member. (ranger_cache::~ranger_cache): Destroy the oracle. (ranger_cache::edge_range): Use oracle. (ranger_cache::fill_block_cache): Likewise. (ranger_cache::range_from_dom): Likewise. (ranger_cache::apply_inferred_ranges): Likewise. * gimple-range-cache.h (ranger_cache::m_exit): Delete. * gimple-range-infer.cc (infer_oracle): New static object; (class infer_oracle): New. (non_null_wrapper::non_null_wrapper): New. (non_null_wrapper::add_nonzero): New. (non_null_wrapper::add_range): New. (non_null_loadstore): Use nonnull_wrapper. (gimple_infer_range::gimple_infer_range): New alternate constructor. (exit_range::stmt): New. (infer_range_manager::has_range_p): Combine seperate methods. (infer_range_manager::maybe_adjust_range): Adjust has_range_p call. (infer_range_manager::add_ranges): New. (infer_range_manager::add_range): Take stmt rather than BB. (infer_range_manager::add_nonzero): Adjust from BB to stmt. * gimple-range-infer.h (class gimple_infer_range): Adjust methods. (infer_range_oracle): New. (class infer_range_manager): Inherit from infer_range_oracle. Adjust methods. * gimple-range-path.cc (path_range_query::range_defined_in_block): Use oracle. (path_range_query::adjust_for_non_null_uses): Likewise. * gimple-range.cc (gimple_ranger::range_on_edge): Likewise (gimple_ranger::register_transitive_inferred_ranges): Likewise. * value-query.cc (default_infer_oracle): New. (range_query::create_infer_oracle): New. (range_query::destroy_infer_oracle): New. (range_query::share_query): Copy infer pointer. (range_query::range_query): Initialize infer pointer. (range_query::~range_query): destroy infer object. * value-query.h (range_query::infer_oracle): New. (range_query::create_infer_oracle): New prototype. (range_query::destroy_infer_oracle): New prototype. (range_query::m_infer): New. --- gcc/value-query.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'gcc/value-query.cc') diff --git a/gcc/value-query.cc b/gcc/value-query.cc index adcc59c..41b581b 100644 --- a/gcc/value-query.cc +++ b/gcc/value-query.cc @@ -181,6 +181,23 @@ range_query::dump (FILE *) // Default oracle for all range queries. This contains no storage and thus // can be used anywhere. relation_oracle default_relation_oracle; +infer_range_oracle default_infer_oracle; + +void +range_query::create_infer_oracle (bool do_search) +{ + gcc_checking_assert (m_infer == &default_infer_oracle); + m_infer = new infer_range_manager (do_search); + gcc_checking_assert (m_infer); +} + +void +range_query::destroy_infer_oracle () +{ + if (m_infer && m_infer != &default_infer_oracle) + delete m_infer; + m_infer = &default_infer_oracle; +} // Create dominance based range oracle for the current query if dom info is // available. @@ -215,12 +232,14 @@ void range_query::share_query (range_query &q) { m_relation = q.m_relation; + m_infer = q.m_infer; m_shared_copy_p = true; } range_query::range_query () { m_relation = &default_relation_oracle; + m_infer = &default_infer_oracle; m_shared_copy_p = false; } @@ -229,6 +248,7 @@ range_query::~range_query () // Do not destroy anything if this is a shared copy. if (m_shared_copy_p) return; + destroy_infer_oracle (); destroy_relation_oracle (); } -- cgit v1.1