[gcc/devel/ranger] New vr_gori_interface class.

Aldy Hernandez aldyh@gcc.gnu.org
Thu Mar 5 10:21:00 GMT 2020


https://gcc.gnu.org/g:80966187936e51f32adc45864ce758c9c588d0e2

commit 80966187936e51f32adc45864ce758c9c588d0e2
Author: Aldy Hernandez <aldyh@redhat.com>
Date:   Mon Mar 2 12:45:11 2020 +0100

    New vr_gori_interface class.

Diff:
---
 gcc/gimple-ssa-evrp-analyze.c |  7 ++++---
 gcc/vr-values.c               | 45 ++++++++++++++++++++++---------------------
 gcc/vr-values.h               | 35 ++++++++++++++++++++-------------
 3 files changed, 49 insertions(+), 38 deletions(-)

diff --git a/gcc/gimple-ssa-evrp-analyze.c b/gcc/gimple-ssa-evrp-analyze.c
index e4fb31f..48780fc 100644
--- a/gcc/gimple-ssa-evrp-analyze.c
+++ b/gcc/gimple-ssa-evrp-analyze.c
@@ -220,7 +220,7 @@ evrp_range_analyzer::try_find_new_range_with_gori
 				(irange &res, tree name, edge e,
 				 const vec<assert_info> &asserts)
 {
-  if (!vr_values->in_export_list (name, e->src))
+  if (!vr_values->gori_computable_p (name, e->src))
     return;
 
   const value_range_equiv *known_range = get_value_range (name);
@@ -381,8 +381,9 @@ evrp_range_analyzer::record_ranges_from_incoming_edge (basic_block bb)
 	    {
 	      widest_irange vr_gori;
 	      bool gori_can_calculate
-		= (vr_values->in_export_list (asserts[i].name, pred_e->src)
-		   && asserts[i].gori_computable_p);
+		= (asserts[i].gori_computable_p
+		   && vr_values->gori_computable_p (asserts[i].name,
+						    pred_e->src));
 	      if (gori_can_calculate)
 		try_find_new_range_with_gori (vr_gori, asserts[i].name,
 					      pred_e, asserts);
diff --git a/gcc/vr-values.c b/gcc/vr-values.c
index 1e632f9..91626fb 100644
--- a/gcc/vr-values.c
+++ b/gcc/vr-values.c
@@ -173,14 +173,6 @@ vr_values::get_value_range (const_tree var)
   return vr;
 }
 
-void
-vr_values::range_of_ssa_name (irange &r, tree op,
-			      gimple *stmt ATTRIBUTE_UNUSED)
-{
-  r = *(get_value_range (op));
-  r.normalize_symbolics ();
-}
-
 /* Set the lattice entry for DEF to VARYING.  */
 
 void
@@ -1997,15 +1989,23 @@ equivalence_iterator::next (void)
 }
 
 void
-vr_values::save_equivalences (equivalence_iterator *iter)
+vr_values::range_of_ssa_name (irange &r, tree op,
+			      gimple *stmt ATTRIBUTE_UNUSED)
+{
+  r = *(get_value_range (op));
+  r.normalize_symbolics ();
+}
+
+void
+vr_gori_interface::save_equivalences (equivalence_iterator *iter)
 {
   m_equivalences = iter;
 }
 
-// FIXME: Come up with a better name.
+// Return TRUE if NAME is computable by GORI in BB.
 
 bool
-vr_values::in_export_list (tree name, basic_block bb)
+vr_gori_interface::gori_computable_p (tree name, basic_block bb)
 {
   return m_gori_map.is_export_p (name, bb);
 }
@@ -2014,8 +2014,8 @@ vr_values::in_export_list (tree name, basic_block bb)
 // Return FALSE if unable to compute a range.
 
 bool
-vr_values::outgoing_edge_range_p (irange &r, edge e, tree name,
-				  const irange *known_range ATTRIBUTE_UNUSED)
+vr_gori_interface::outgoing_edge_range_p (irange &r, edge e, tree name,
+				const irange *known_range ATTRIBUTE_UNUSED)
 {
   if (!gori_compute::outgoing_edge_range_p (r, e, name))
     r.set_varying (TREE_TYPE (name));
@@ -2030,7 +2030,8 @@ vr_values::outgoing_edge_range_p (irange &r, edge e, tree name,
 // equivalences NAME may have.
 
 bool
-vr_values::refine_range_with_equivalences_p (irange &r, edge e, tree name)
+vr_gori_interface::refine_range_with_equivalences_p (irange &r,
+						     edge e, tree name)
 {
   widest_irange branch_range, tmp;
   gimple *branch = gimple_outgoing_edge_range_p (branch_range, e);
@@ -2066,9 +2067,9 @@ vr_values::refine_range_with_equivalences_p (irange &r, edge e, tree name)
 // in R.  LHS is the known range for STMT.
 
 bool
-vr_values::solve_name_at_statement (irange &r,
-				    tree name, gimple *stmt,
-				    const irange &lhs)
+vr_gori_interface::solve_name_at_statement (irange &r,
+					    tree name, gimple *stmt,
+					    const irange &lhs)
 {
   widest_irange name_range;
   range_of_ssa_name (name_range, name, stmt);
@@ -2076,10 +2077,10 @@ vr_values::solve_name_at_statement (irange &r,
 }
 
 bool
-vr_values::solve_name_given_equivalence (irange &r,
-					 tree name,
-					 tree equiv,
-					 const irange &equiv_range)
+vr_gori_interface::solve_name_given_equivalence (irange &r,
+						 tree name,
+						 tree equiv,
+						 const irange &equiv_range)
 {
   // Solve NAME in EQUIV = USE(NAME).
   gimple *def = SSA_NAME_DEF_STMT (equiv);
@@ -2103,7 +2104,7 @@ vr_values::solve_name_given_equivalence (irange &r,
 }
 
 void
-vr_values::range_for_op2 (irange &res, gimple *stmt, tree type)
+vr_gori_interface::range_for_op2 (irange &res, gimple *stmt, tree type)
 {
   tree op2 = gimple_assign_rhs2 (stmt);
   if (op2)
diff --git a/gcc/vr-values.h b/gcc/vr-values.h
index 307d344..3178ce0 100644
--- a/gcc/vr-values.h
+++ b/gcc/vr-values.h
@@ -34,6 +34,26 @@ private:
   unsigned int m_index;
 };
 
+class vr_gori_interface : public gori_compute
+{
+public:
+  virtual bool outgoing_edge_range_p (irange &, edge, tree name,
+				      const irange *name_range = NULL);
+  bool gori_computable_p (tree name, basic_block);
+  void save_equivalences (equivalence_iterator *);
+private:
+  virtual void range_of_ssa_name (irange &r ATTRIBUTE_UNUSED,
+				  tree op ATTRIBUTE_UNUSED,
+				  gimple *stmt ATTRIBUTE_UNUSED = NULL)
+    { gcc_unreachable (); }
+  bool refine_range_with_equivalences_p (irange &, edge, tree name);
+  bool solve_name_at_statement (irange &, tree, gimple *stmt, const irange &);
+  bool solve_name_given_equivalence (irange &r, tree name, tree equiv,
+				     const irange &equiv_range);
+  void range_for_op2 (irange &, gimple *, tree type);
+  equivalence_iterator *m_equivalences;
+};
+
 /* The VR_VALUES class holds the current view of range information
    for all the SSA_NAMEs in the IL.
 
@@ -48,7 +68,7 @@ private:
    gets attached to an SSA_NAME.  It's unclear how useful that global
    information will be in a world where we can compute context sensitive
    range information fast or perform on-demand queries.  */
-class vr_values : public gori_compute
+class vr_values : public vr_gori_interface
 {
  public:
   vr_values (void);
@@ -91,19 +111,8 @@ class vr_values : public gori_compute
   /* */
   void cleanup_edges_and_switches (void);
 
-  bool outgoing_edge_range_p (irange &, edge, tree name,
-			      const irange *name_range = NULL);
-  bool in_export_list (tree name, basic_block);
-  void save_equivalences (equivalence_iterator *);
  private:
-  void range_of_ssa_name (irange &r, tree op, gimple * = NULL);
-  equivalence_iterator *m_equivalences;
-  bool refine_range_with_equivalences_p (irange &, edge, tree name);
-  bool solve_name_at_statement (irange &,
-				tree, gimple *stmt, const irange &);
-  bool solve_name_given_equivalence (irange &r, tree name, tree equiv,
-				     const irange &equiv_range);
-  void range_for_op2 (irange &, gimple *, tree type);
+  virtual void range_of_ssa_name (irange &r, tree op, gimple * = NULL);
 
   value_range_equiv *get_lattice_entry (const_tree);
   bool vrp_stmt_computes_nonzero (gimple *);



More information about the Gcc-cvs mailing list