aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2024-05-21 14:20:52 -0400
committerAndrew MacLeod <amacleod@redhat.com>2024-05-23 16:50:00 -0400
commitfae5e6a4dfcf9270cd09c2240480860b09c2c627 (patch)
tree145e6647c4efbc8baaa3a0cdd8f6fbe6c88cb806 /gcc
parentac0bc89aea79b940a17697fb4a758254631c2400 (diff)
downloadgcc-fae5e6a4dfcf9270cd09c2240480860b09c2c627.zip
gcc-fae5e6a4dfcf9270cd09c2240480860b09c2c627.tar.gz
gcc-fae5e6a4dfcf9270cd09c2240480860b09c2c627.tar.bz2
Make gori_map a shared component.
Move gori_map dependency and import/export object into a range query and construct it simultaneously with a gori object. * gimple-range-cache.cc (ranger_cache::ranger_cache): Use gori_ssa. (ranger_cache::dump): Likewise. (ranger_cache::get_global_range): Likewise. (ranger_cache::set_global_range): Likewise. (ranger_cache::register_inferred_value): Likewise. * gimple-range-edge.h (gimple_outgoing_range::map): Remove. * gimple-range-fold.cc (fold_using_range::range_of_range_op): Use gori_ssa. (fold_using_range::range_of_address): Likewise. (fold_using_range::range_of_phi): Likewise. (fur_source::register_outgoing_edges): Likewise. * gimple-range-fold.h (fur_source::query): Make const. (gori_ssa): New. * gimple-range-gori.cc (gori_map::dump): Use 'this' pointer. (gori_compute::gori_compute): Construct with a gori_map. * gimple-range-gori.h (gori_compute:gori_compute): Change prototype. (gori_compute::map): Delete. (gori_compute::m_map): Change to a reference. (FOR_EACH_GORI_IMPORT_NAME): Change parameter gori to gorimap. (FOR_EACH_GORI_EXPORT_NAME): Likewise. * gimple-range-path.cc (path_range_query::compute_ranges_in_block): Use gori_ssa method. (path_range_query::compute_exit_dependencies): Likewise. * gimple-range.cc (gimple_ranger::range_of_stmt): Likewise. (gimple_ranger::register_transitive_inferred_ranges): Likewise. * tree-ssa-dom.cc (set_global_ranges_from_unreachable_edges): Likewise. * tree-ssa-threadedge.cc (compute_exit_dependencies): Likewise. * tree-vrp.cc (remove_unreachable::handle_early): Likewise. (remove_unreachable::remove_and_update_globals): Likewise. * value-query.cc (range_query::create_gori): Create gori map. (range_query::share_query): Copy gori map member. (range_query::range_query): Initiialize gori_map member. * value-query.h (range_query::gori_ssa): New. (range_query::m_map): New.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gimple-range-cache.cc16
-rw-r--r--gcc/gimple-range-edge.h1
-rw-r--r--gcc/gimple-range-fold.cc22
-rw-r--r--gcc/gimple-range-fold.h4
-rw-r--r--gcc/gimple-range-gori.cc9
-rw-r--r--gcc/gimple-range-gori.h14
-rw-r--r--gcc/gimple-range-path.cc6
-rw-r--r--gcc/gimple-range.cc6
-rw-r--r--gcc/tree-ssa-dom.cc2
-rw-r--r--gcc/tree-ssa-threadedge.cc2
-rw-r--r--gcc/tree-vrp.cc8
-rw-r--r--gcc/value-query.cc6
-rw-r--r--gcc/value-query.h2
13 files changed, 53 insertions, 45 deletions
diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index e75cac6..a511a2c 100644
--- a/gcc/gimple-range-cache.cc
+++ b/gcc/gimple-range-cache.cc
@@ -969,7 +969,7 @@ ranger_cache::ranger_cache (int not_executable_flag, bool use_imm_uses)
{
basic_block bb = BASIC_BLOCK_FOR_FN (cfun, x);
if (bb)
- gori ().map ()->exports (bb);
+ gori_ssa ()->exports (bb);
}
m_update = new update_list ();
}
@@ -1000,7 +1000,7 @@ ranger_cache::dump (FILE *f)
void
ranger_cache::dump_bb (FILE *f, basic_block bb)
{
- gori ().map ()->dump (f, bb, false);
+ gori_ssa ()->dump (f, bb, false);
m_on_entry.dump (f, bb);
m_relation->dump (f, bb);
}
@@ -1033,8 +1033,8 @@ ranger_cache::get_global_range (vrange &r, tree name, bool &current_p)
current_p = false;
if (had_global)
current_p = r.singleton_p ()
- || m_temporal->current_p (name, gori ().map ()->depend1 (name),
- gori ().map ()->depend2 (name));
+ || m_temporal->current_p (name, gori_ssa ()->depend1 (name),
+ gori_ssa ()->depend2 (name));
else
{
// If no global value has been set and value is VARYING, fold the stmt
@@ -1071,8 +1071,8 @@ ranger_cache::set_global_range (tree name, const vrange &r, bool changed)
if (!changed)
{
// If there are dependencies, make sure this is not out of date.
- if (!m_temporal->current_p (name, gori ().map ()->depend1 (name),
- gori ().map ()->depend2 (name)))
+ if (!m_temporal->current_p (name, gori_ssa ()->depend1 (name),
+ gori_ssa ()->depend2 (name)))
m_temporal->set_timestamp (name);
return;
}
@@ -1097,7 +1097,7 @@ ranger_cache::set_global_range (tree name, const vrange &r, bool changed)
if (r.singleton_p ()
|| (POINTER_TYPE_P (TREE_TYPE (name)) && r.nonzero_p ()))
- gori ().map ()->set_range_invariant (name);
+ gori_ssa ()->set_range_invariant (name);
m_temporal->set_timestamp (name);
}
@@ -1783,7 +1783,7 @@ ranger_cache::register_inferred_value (const vrange &ir, tree name,
m_on_entry.set_bb_range (name, bb, r);
// If this range was invariant before, remove invariant.
if (!gori ().has_edge_range_p (name))
- gori ().map ()->set_range_invariant (name, false);
+ gori_ssa ()->set_range_invariant (name, false);
}
}
diff --git a/gcc/gimple-range-edge.h b/gcc/gimple-range-edge.h
index be1f0c2..0096c02 100644
--- a/gcc/gimple-range-edge.h
+++ b/gcc/gimple-range-edge.h
@@ -63,7 +63,6 @@ public:
fur_source &,
class value_relation * = NULL)
{ return false; }
- virtual class gori_map *map () { return NULL; }
private:
void calc_switch_ranges (gswitch *sw);
bool switch_edge_range (irange &r, gswitch *sw, edge e);
diff --git a/gcc/gimple-range-fold.cc b/gcc/gimple-range-fold.cc
index e9e387c..a0ff7f2 100644
--- a/gcc/gimple-range-fold.cc
+++ b/gcc/gimple-range-fold.cc
@@ -745,8 +745,8 @@ fold_using_range::range_of_range_op (vrange &r,
r.set_varying (type);
if (lhs && gimple_range_ssa_p (op1))
{
- if (src.gori ())
- src.gori ()->map ()->register_dependency (lhs, op1);
+ if (src.gori_bb ())
+ src.gori_bb ()->register_dependency (lhs, op1);
relation_kind rel;
rel = handler.lhs_op1_relation (r, range1, range1);
if (rel != VREL_VARYING)
@@ -772,10 +772,10 @@ fold_using_range::range_of_range_op (vrange &r,
relation_fold_and_or (as_a <irange> (r), s, src, range1, range2);
if (lhs)
{
- if (src.gori ())
+ if (src.gori_bb ())
{
- src.gori ()->map ()->register_dependency (lhs, op1);
- src.gori ()->map ()->register_dependency (lhs, op2);
+ src.gori_bb ()->register_dependency (lhs, op1);
+ src.gori_bb ()->register_dependency (lhs, op2);
}
if (gimple_range_ssa_p (op1))
{
@@ -843,8 +843,8 @@ fold_using_range::range_of_address (prange &r, gimple *stmt, fur_source &src)
{
tree ssa = TREE_OPERAND (base, 0);
tree lhs = gimple_get_lhs (stmt);
- if (lhs && gimple_range_ssa_p (ssa) && src.gori ())
- src.gori ()->map ()->register_dependency (lhs, ssa);
+ if (lhs && gimple_range_ssa_p (ssa) && src.gori_bb ())
+ src.gori_bb ()->register_dependency (lhs, ssa);
src.get_operand (r, ssa);
range_cast (r, TREE_TYPE (gimple_assign_rhs1 (stmt)));
@@ -950,8 +950,8 @@ fold_using_range::range_of_phi (vrange &r, gphi *phi, fur_source &src)
else
r.union_ (arg_range);
- if (gimple_range_ssa_p (arg) && src.gori ())
- src.gori ()->map ()->register_dependency (phi_def, arg);
+ if (gimple_range_ssa_p (arg) && src.gori_bb ())
+ src.gori_bb ()->register_dependency (phi_def, arg);
}
// Track if all arguments are the same.
@@ -1345,14 +1345,14 @@ fur_source::register_outgoing_edges (gcond *s, irange &lhs_range,
}
// Outgoing relations of GORI exports require a gori engine.
- if (!gori ())
+ if (!gori_bb ())
return;
// Now look for other relations in the exports. This will find stmts
// leading to the condition such as:
// c_2 = a_4 < b_7
// if (c_2)
- FOR_EACH_GORI_EXPORT_NAME (*(gori ()->map ()), bb, name)
+ FOR_EACH_GORI_EXPORT_NAME (gori_bb (), bb, name)
{
if (TREE_CODE (TREE_TYPE (name)) != BOOLEAN_TYPE)
continue;
diff --git a/gcc/gimple-range-fold.h b/gcc/gimple-range-fold.h
index 9ae6cf5..b240a6e 100644
--- a/gcc/gimple-range-fold.h
+++ b/gcc/gimple-range-fold.h
@@ -105,7 +105,9 @@ class fur_source
{
public:
fur_source (range_query *q = NULL);
- inline range_query *query () { return m_query; }
+ inline range_query *query () const { return m_query; }
+ inline gori_map *gori_bb () const
+ { return (m_depend_p && m_query) ? m_query->gori_ssa () : NULL; }
inline class gimple_outgoing_range *gori ()
{ return m_depend_p ? &(m_query->gori ()) : NULL; }
virtual bool get_operand (vrange &r, tree expr);
diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
index a754306..a3fe67e 100644
--- a/gcc/gimple-range-gori.cc
+++ b/gcc/gimple-range-gori.cc
@@ -514,7 +514,7 @@ gori_map::dump (FILE *f, basic_block bb, bool verbose)
fprintf (f, "bb<%u> Imports: ",bb->index);
else
fprintf (f, "Imports: ");
- FOR_EACH_GORI_IMPORT_NAME (*this, bb, name)
+ FOR_EACH_GORI_IMPORT_NAME (this, bb, name)
{
print_generic_expr (f, name, TDF_SLIM);
fprintf (f, " ");
@@ -527,7 +527,7 @@ gori_map::dump (FILE *f, basic_block bb, bool verbose)
else
fprintf (f, "Exports: ");
// Dump the export vector.
- FOR_EACH_GORI_EXPORT_NAME (*this, bb, name)
+ FOR_EACH_GORI_EXPORT_NAME (this, bb, name)
{
print_generic_expr (f, name, TDF_SLIM);
fprintf (f, " ");
@@ -557,8 +557,9 @@ debug (gori_map &g)
// Construct a gori_compute object.
-gori_compute::gori_compute (int not_executable_flag, int sw_max_edges)
- : gimple_outgoing_range (sw_max_edges), tracer ("GORI ")
+gori_compute::gori_compute (gori_map &map, int not_executable_flag,
+ int sw_max_edges)
+ : gimple_outgoing_range (sw_max_edges), m_map (map), tracer ("GORI ")
{
m_not_executable_flag = not_executable_flag;
// Create a boolean_type true and false range.
diff --git a/gcc/gimple-range-gori.h b/gcc/gimple-range-gori.h
index c7a707e..aa8369a 100644
--- a/gcc/gimple-range-gori.h
+++ b/gcc/gimple-range-gori.h
@@ -164,7 +164,8 @@ class value_relation;
class gori_compute : public gimple_outgoing_range
{
public:
- gori_compute (int not_executable_flag = 0, int max_sw_edges = 0);
+ gori_compute (gori_map &map, int not_executable_flag = 0,
+ int max_sw_edges = 0);
virtual ~gori_compute ();
bool edge_range_p (vrange &r, edge e, tree name, range_query &q);
bool condexpr_adjust (vrange &r1, vrange &r2, gimple *s, tree cond, tree op1,
@@ -175,9 +176,8 @@ public:
bool compute_operand_range (vrange &r, gimple *stmt, const vrange &lhs,
tree name, class fur_source &src,
value_relation *rel = NULL);
- gori_map *map () { return &m_map; }
private:
- gori_map m_map;
+ gori_map &m_map;
bool refine_using_relation (tree op1, vrange &op1_range,
tree op2, vrange &op2_range,
fur_source &src, relation_kind k);
@@ -226,14 +226,14 @@ bool gori_on_edge (class ssa_cache &r, edge e,
bool gori_name_on_edge (vrange &r, tree name, edge e, range_query *q = NULL);
// For each name that is an import into BB's exports..
-#define FOR_EACH_GORI_IMPORT_NAME(gori, bb, name) \
- for (gori_export_iterator iter ((gori).imports ((bb))); \
+#define FOR_EACH_GORI_IMPORT_NAME(gorimap, bb, name) \
+ for (gori_export_iterator iter ((gorimap)->imports ((bb))); \
((name) = iter.get_name ()); \
iter.next ())
// For each name possibly exported from block BB.
-#define FOR_EACH_GORI_EXPORT_NAME(gori, bb, name) \
- for (gori_export_iterator iter ((gori).exports ((bb))); \
+#define FOR_EACH_GORI_EXPORT_NAME(gorimap, bb, name) \
+ for (gori_export_iterator iter ((gorimap)->exports ((bb))); \
((name) = iter.get_name ()); \
iter.next ())
diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc
index 707bd0e..ef125a9 100644
--- a/gcc/gimple-range-path.cc
+++ b/gcc/gimple-range-path.cc
@@ -413,7 +413,7 @@ path_range_query::compute_ranges_in_block (basic_block bb)
p->reset_path ();
}
- bitmap exports = gori ().map ()->exports (bb);
+ bitmap exports = gori_ssa ()->exports (bb);
EXECUTE_IF_AND_IN_BITMAP (m_exit_dependencies, exports, 0, i, bi)
{
tree name = ssa_name (i);
@@ -490,7 +490,7 @@ path_range_query::compute_exit_dependencies (bitmap dependencies)
{
// Start with the imports from the exit block...
basic_block exit = m_path[0];
- bitmap_copy (dependencies, gori ().map()->imports (exit));
+ bitmap_copy (dependencies, gori_ssa ()->imports (exit));
auto_vec<tree> worklist (bitmap_count_bits (dependencies));
bitmap_iterator bi;
@@ -538,7 +538,7 @@ path_range_query::compute_exit_dependencies (bitmap dependencies)
{
basic_block bb = m_path[i];
tree name;
- FOR_EACH_GORI_EXPORT_NAME (*(gori ().map ()), bb, name)
+ FOR_EACH_GORI_EXPORT_NAME (gori_ssa (), bb, name)
if (TREE_CODE (TREE_TYPE (name)) == BOOLEAN_TYPE)
bitmap_set_bit (dependencies, SSA_NAME_VERSION (name));
}
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc
index 2029461..0749c9fa 100644
--- a/gcc/gimple-range.cc
+++ b/gcc/gimple-range.cc
@@ -310,7 +310,7 @@ gimple_ranger::range_of_stmt (vrange &r, gimple *s, tree name)
// Update any exports in the cache if this is a gimple cond statement.
tree exp;
basic_block bb = gimple_bb (s);
- FOR_EACH_GORI_EXPORT_NAME (*(gori ().map ()), bb, exp)
+ FOR_EACH_GORI_EXPORT_NAME (gori_ssa (), bb, exp)
m_cache.propagate_updated_value (exp, bb);
}
}
@@ -540,8 +540,8 @@ gimple_ranger::register_transitive_inferred_ranges (basic_block bb)
// an inferred range as well.
Value_Range r (TREE_TYPE (lhs));
r.set_undefined ();
- tree name1 = gori ().map () ->depend1 (lhs);
- tree name2 = gori ().map ()->depend2 (lhs);
+ tree name1 = gori_ssa ()->depend1 (lhs);
+ tree name2 = gori_ssa ()->depend2 (lhs);
if ((name1 && infer_oracle ().has_range_p (bb, name1))
|| (name2 && infer_oracle ().has_range_p (bb, name2)))
{
diff --git a/gcc/tree-ssa-dom.cc b/gcc/tree-ssa-dom.cc
index 67c87bb..800bc5a 100644
--- a/gcc/tree-ssa-dom.cc
+++ b/gcc/tree-ssa-dom.cc
@@ -1430,7 +1430,7 @@ dom_opt_dom_walker::set_global_ranges_from_unreachable_edges (basic_block bb)
return;
tree name;
- FOR_EACH_GORI_EXPORT_NAME (*(m_ranger->gori ().map()), pred_e->src, name)
+ FOR_EACH_GORI_EXPORT_NAME (m_ranger->gori_ssa (), pred_e->src, name)
if (all_uses_feed_or_dominated_by_stmt (name, stmt)
// The condition must post-dominate the definition point.
&& (SSA_NAME_IS_DEFAULT_DEF (name)
diff --git a/gcc/tree-ssa-threadedge.cc b/gcc/tree-ssa-threadedge.cc
index 766b68a..70f269e 100644
--- a/gcc/tree-ssa-threadedge.cc
+++ b/gcc/tree-ssa-threadedge.cc
@@ -1447,7 +1447,7 @@ hybrid_jt_simplifier::compute_exit_dependencies (bitmap dependencies,
gimple *stmt)
{
// Start with the imports to the final conditional.
- bitmap_copy (dependencies, m_ranger->gori ().map ()->imports (path[0]));
+ bitmap_copy (dependencies, m_ranger->gori_ssa ()->imports (path[0]));
// Add any other interesting operands we may have missed.
if (gimple_bb (stmt) != path[0])
diff --git a/gcc/tree-vrp.cc b/gcc/tree-vrp.cc
index be9df39..7d7f9fe 100644
--- a/gcc/tree-vrp.cc
+++ b/gcc/tree-vrp.cc
@@ -210,14 +210,14 @@ remove_unreachable::handle_early (gimple *s, edge e)
// Check if every export use is dominated by this branch.
tree name;
- FOR_EACH_GORI_EXPORT_NAME (*(m_ranger.gori ().map ()), e->src, name)
+ FOR_EACH_GORI_EXPORT_NAME (m_ranger.gori_ssa (), e->src, name)
{
if (!fully_replaceable (name, e->src))
return;
}
// Set the global value for each.
- FOR_EACH_GORI_EXPORT_NAME (*(m_ranger.gori ().map ()), e->src, name)
+ FOR_EACH_GORI_EXPORT_NAME (m_ranger.gori_ssa (), e->src, name)
{
Value_Range r (TREE_TYPE (name));
m_ranger.range_on_entry (r, e->dest, name);
@@ -287,7 +287,7 @@ remove_unreachable::remove_and_update_globals ()
gcc_checking_assert (gimple_code (s) == GIMPLE_COND);
bool dominate_exit_p = true;
- FOR_EACH_GORI_EXPORT_NAME (*(m_ranger.gori ().map ()), e->src, name)
+ FOR_EACH_GORI_EXPORT_NAME (m_ranger.gori_ssa (), e->src, name)
{
// Ensure the cache is set for NAME in the succ block.
Value_Range r(TREE_TYPE (name));
@@ -305,7 +305,7 @@ remove_unreachable::remove_and_update_globals ()
// isn't the final VRP pass, leave the call in the IL.
if (dominate_exit_p)
bitmap_ior_into (all_exports,
- m_ranger.gori ().map ()->exports (e->src));
+ m_ranger.gori_ssa ()->exports (e->src));
else if (!final_p)
continue;
diff --git a/gcc/value-query.cc b/gcc/value-query.cc
index db813ad..0d0c0e8 100644
--- a/gcc/value-query.cc
+++ b/gcc/value-query.cc
@@ -188,7 +188,9 @@ void
range_query::create_gori (int not_executable_flag, int sw_max_edges)
{
gcc_checking_assert (m_gori == &default_gori);
- m_gori = new gori_compute (not_executable_flag, sw_max_edges);
+ m_map = new gori_map ();
+ gcc_checking_assert (m_map);
+ m_gori = new gori_compute (*m_map, not_executable_flag, sw_max_edges);
gcc_checking_assert (m_gori);
}
@@ -251,6 +253,7 @@ range_query::share_query (range_query &q)
m_relation = q.m_relation;
m_infer = q.m_infer;
m_gori = q.m_gori;
+ m_map = q.m_map;
m_shared_copy_p = true;
}
@@ -259,6 +262,7 @@ range_query::range_query ()
m_relation = &default_relation_oracle;
m_infer = &default_infer_oracle;
m_gori = &default_gori;
+ m_map = NULL;
m_shared_copy_p = false;
}
diff --git a/gcc/value-query.h b/gcc/value-query.h
index 1481f53..2572a03 100644
--- a/gcc/value-query.h
+++ b/gcc/value-query.h
@@ -84,6 +84,7 @@ public:
void destroy_infer_oracle ();
inline class gimple_outgoing_range &gori () const { return *m_gori; }
+ inline class gori_map *gori_ssa () const { return m_map; }
void create_gori (int not_executable_flag = 0, int sw_max_edges = INT_MAX);
void destroy_gori ();
@@ -98,6 +99,7 @@ protected:
relation_oracle *m_relation;
infer_range_oracle *m_infer;
gimple_outgoing_range *m_gori;
+ gori_map *m_map;
// When multiple related range queries wish to share oracles.
// This is an internal interface
void share_query (range_query &q);