diff mbox series

[COMMITTED,11/12] - Make gori_map a shared component.

Message ID 22156eab-ed26-4f81-870d-336b4d2b970b@redhat.com
State New
Headers show
Series [COMMITTED,01/12] - Move all relation queries into relation_oracle. | expand

Commit Message

Andrew MacLeod May 23, 2024, 8:53 p.m. UTC
This patch moves the gori_map object out of the gori object, and into 
the range query.   it is required by gori, and will be created 
simultaneously with gori.

The dependency data it manages has uses outside of GORI, and this makes 
it easier to access by the fold_using_range routines, and others.

Documentation is coming :-P,

Bootstrapped on x86_64-pc-linux-gnu with no regressions.  Pushed.
diff mbox series

Patch

From e81eafd81d76cf4e8b03089a94857b4b52a66bc7 Mon Sep 17 00:00:00 2001
From: Andrew MacLeod <amacleod@redhat.com>
Date: Tue, 21 May 2024 14:20:52 -0400
Subject: [PATCH 11/12] 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.
---
 gcc/gimple-range-cache.cc  | 16 ++++++++--------
 gcc/gimple-range-edge.h    |  1 -
 gcc/gimple-range-fold.cc   | 22 +++++++++++-----------
 gcc/gimple-range-fold.h    |  4 +++-
 gcc/gimple-range-gori.cc   |  9 +++++----
 gcc/gimple-range-gori.h    | 14 +++++++-------
 gcc/gimple-range-path.cc   |  6 +++---
 gcc/gimple-range.cc        |  6 +++---
 gcc/tree-ssa-dom.cc        |  2 +-
 gcc/tree-ssa-threadedge.cc |  2 +-
 gcc/tree-vrp.cc            |  8 ++++----
 gcc/value-query.cc         |  6 +++++-
 gcc/value-query.h          |  2 ++
 13 files changed, 53 insertions(+), 45 deletions(-)

diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc
index e75cac66902..a511a2c3a4c 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 be1f0c2cc15..0096c02faf4 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 e9e387c7d59..a0ff7f2b98b 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 9ae6cf56d2a..b240a6e4c61 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 a7543064258..a3fe67ede4e 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 c7a707ee724..aa8369a6823 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 707bd0ebd94..ef125a90882 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 20294612185..0749c9fa215 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 67c87bbd19e..800bc5a4117 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 766b68a007b..70f269e29fb 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 be9df39f680..7d7f9fe2932 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 db813ad3094..0d0c0e8058e 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 1481f532d60..2572a03095d 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);
-- 
2.41.0