aboutsummaryrefslogtreecommitdiff
path: root/gcc/value-query.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2024-05-17 10:50:24 -0400
committerAndrew MacLeod <amacleod@redhat.com>2024-05-23 16:48:44 -0400
commit07441e41f5eb4d385e8ee7cfb50b5d71520bff74 (patch)
treed3f7ff2d2800565ff36eda6fdc01b9c9401adba9 /gcc/value-query.cc
parent6c64a85ebec448503c3247fc30923e14cc7074fd (diff)
downloadgcc-07441e41f5eb4d385e8ee7cfb50b5d71520bff74.zip
gcc-07441e41f5eb4d385e8ee7cfb50b5d71520bff74.tar.gz
gcc-07441e41f5eb4d385e8ee7cfb50b5d71520bff74.tar.bz2
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.
Diffstat (limited to 'gcc/value-query.cc')
-rw-r--r--gcc/value-query.cc20
1 files changed, 20 insertions, 0 deletions
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 ();
}