aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range-infer.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/gimple-range-infer.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/gimple-range-infer.cc')
-rw-r--r--gcc/gimple-range-infer.cc90
1 files changed, 63 insertions, 27 deletions
diff --git a/gcc/gimple-range-infer.cc b/gcc/gimple-range-infer.cc
index d5e1aa1..757a201 100644
--- a/gcc/gimple-range-infer.cc
+++ b/gcc/gimple-range-infer.cc
@@ -37,6 +37,25 @@ along with GCC; see the file COPYING3. If not see
#include "cfganal.h"
#include "tree-dfa.h"
+// Create the global oracle.
+
+infer_range_oracle infer_oracle;
+
+// This class is merely an accessor which is granted internals to
+// gimple_infer_range such that non_null_loadstore as a static callback can
+// call the protected add_nonzero ().
+// Static functions ccannot be friends, so we do it through a class wrapper.
+
+class non_null_wrapper
+{
+public:
+ inline non_null_wrapper (gimple_infer_range *infer) : m_infer (infer) { }
+ inline void add_nonzero (tree name) { m_infer->add_nonzero (name); }
+ inline void add_range (tree t, vrange &r) { m_infer->add_range (t, r); }
+private:
+ gimple_infer_range *m_infer;
+};
+
// Adapted from infer_nonnull_range_by_dereference and check_loadstore
// to process nonnull ssa_name OP in S. DATA contains a pointer to a
// stmt range inference instance.
@@ -50,8 +69,8 @@ non_null_loadstore (gimple *, tree op, tree, void *data)
addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op));
if (!targetm.addr_space.zero_address_valid (as))
{
- tree ssa = TREE_OPERAND (op, 0);
- ((gimple_infer_range *)data)->add_nonzero (ssa);
+ non_null_wrapper wrapper ((gimple_infer_range *)data);
+ wrapper.add_nonzero (TREE_OPERAND (op, 0));
}
}
return false;
@@ -173,6 +192,14 @@ gimple_infer_range::gimple_infer_range (gimple *s)
}
+// Create an single inferred range for NAMe using range R.
+
+gimple_infer_range::gimple_infer_range (tree name, vrange &r)
+{
+ num_args = 0;
+ add_range (name, r);
+}
+
// -------------------------------------------------------------------------
// This class is an element in the list of inferred ranges.
@@ -181,10 +208,12 @@ class exit_range
{
public:
tree name;
+ gimple *stmt;
vrange_storage *range;
exit_range *next;
};
+
// If there is an element which matches SSA, return a pointer to the element.
// Otherwise return NULL.
@@ -253,33 +282,26 @@ infer_range_manager::get_nonzero (tree name)
return *(m_nonzero[v]);
}
-// Return TRUE if there are any range inferences in block BB.
-
-bool
-infer_range_manager::has_range_p (basic_block bb)
-{
- if (bb->index >= (int)m_on_exit.length ())
- return false;
- bitmap b = m_on_exit[bb->index].m_names;
- return b && !bitmap_empty_p (b);
-}
-
-// Return TRUE if NAME has a range inference in block BB.
+// Return TRUE if NAME has a range inference in block BB. If NAME is NULL,
+// return TRUE if there are any name sin BB.
bool
-infer_range_manager::has_range_p (tree name, basic_block bb)
+infer_range_manager::has_range_p (basic_block bb, tree name)
{
// Check if this is an immediate use search model.
- if (m_seen && !bitmap_bit_p (m_seen, SSA_NAME_VERSION (name)))
+ if (name && m_seen && !bitmap_bit_p (m_seen, SSA_NAME_VERSION (name)))
register_all_uses (name);
if (bb->index >= (int)m_on_exit.length ())
return false;
- if (!m_on_exit[bb->index].m_names)
- return false;
- if (!bitmap_bit_p (m_on_exit[bb->index].m_names, SSA_NAME_VERSION (name)))
+
+ bitmap b = m_on_exit[bb->index].m_names;
+ if (!b)
return false;
- return true;
+
+ if (name)
+ return bitmap_bit_p (m_on_exit[bb->index].m_names, SSA_NAME_VERSION (name));
+ return !bitmap_empty_p (b);
}
// Return TRUE if NAME has a range inference in block BB, and adjust range R
@@ -288,7 +310,7 @@ infer_range_manager::has_range_p (tree name, basic_block bb)
bool
infer_range_manager::maybe_adjust_range (vrange &r, tree name, basic_block bb)
{
- if (!has_range_p (name, bb))
+ if (!has_range_p (bb, name))
return false;
exit_range *ptr = m_on_exit[bb->index].find_ptr (name);
gcc_checking_assert (ptr);
@@ -299,11 +321,23 @@ infer_range_manager::maybe_adjust_range (vrange &r, tree name, basic_block bb)
return r.intersect (tmp);
}
-// Add range R as an inferred range for NAME in block BB.
+// Add all inferred ranges in INFER at stmt S.
+
+void
+infer_range_manager::add_ranges (gimple *s, gimple_infer_range &infer)
+{
+ for (unsigned x = 0; x < infer.num (); x++)
+ add_range (infer.name (x), s, infer.range (x));
+}
+
+// Add range R as an inferred range for NAME on stmt S.
void
-infer_range_manager::add_range (tree name, basic_block bb, const vrange &r)
+infer_range_manager::add_range (tree name, gimple *s, const vrange &r)
{
+ basic_block bb = gimple_bb (s);
+ if (!bb)
+ return;
if (bb->index >= (int)m_on_exit.length ())
m_on_exit.safe_grow_cleared (last_basic_block_for_fn (cfun) + 1);
@@ -334,6 +368,7 @@ infer_range_manager::add_range (tree name, basic_block bb, const vrange &r)
ptr->range->set_vrange (cur);
else
ptr->range = m_range_allocator->clone (cur);
+ ptr->stmt = s;
return;
}
@@ -342,16 +377,17 @@ infer_range_manager::add_range (tree name, basic_block bb, const vrange &r)
ptr = (exit_range *)obstack_alloc (&m_list_obstack, sizeof (exit_range));
ptr->range = m_range_allocator->clone (r);
ptr->name = name;
+ ptr->stmt = s;
ptr->next = m_on_exit[bb->index].head;
m_on_exit[bb->index].head = ptr;
}
-// Add a non-zero inferred range for NAME in block BB.
+// Add a non-zero inferred range for NAME at stmt S.
void
-infer_range_manager::add_nonzero (tree name, basic_block bb)
+infer_range_manager::add_nonzero (tree name, gimple *s)
{
- add_range (name, bb, get_nonzero (name));
+ add_range (name, s, get_nonzero (name));
}
// Follow immediate use chains and find all inferred ranges for NAME.
@@ -378,7 +414,7 @@ infer_range_manager::register_all_uses (tree name)
for (unsigned x = 0; x < infer.num (); x++)
{
if (name == infer.name (x))
- add_range (name, gimple_bb (s), infer.range (x));
+ add_range (name, s, infer.range (x));
}
}
}