]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Move global range code to value-query.cc.
authorAldy Hernandez <aldyh@redhat.com>
Wed, 26 May 2021 06:25:36 +0000 (08:25 +0200)
committerAldy Hernandez <aldyh@redhat.com>
Thu, 27 May 2021 08:37:49 +0000 (10:37 +0200)
This patch moves all the global range code from gimple-range.cc into
value-query.cc.  It also moves get_range_info and get_ptr_nonnull from
tree-ssanames.c into their only uses, and removes external access to them.

gcc/ChangeLog:

* gimple-range.cc (get_range_global): Move to value-query.cc.
(gimple_range_global): Same.
(get_global_range_query): Same.
(global_range_query::range_of_expr): Same.
* gimple-range.h (class global_range_query): Move to
value-query.h.
(gimple_range_global): Same.
* tree-ssanames.c (get_range_info): Move to value-query.cc.
(get_ptr_nonnull): Same.
* tree-ssanames.h (get_range_info): Remove.
(get_ptr_nonnull): Remove.
* value-query.cc (get_ssa_name_range_info): Move from
tree-ssanames.c.
(get_ssa_name_ptr_info_nonnull): Same.
(get_range_global): Move from gimple-range.cc.
(gimple_range_global): Same.
(get_global_range_query): Same.
(global_range_query::range_of_expr): Same.
* value-query.h (class global_range_query): Move from
gimple-range.h.
(gimple_range_global): Same.

gcc/gimple-range.cc
gcc/gimple-range.h
gcc/tree-ssanames.c
gcc/tree-ssanames.h
gcc/value-query.cc
gcc/value-query.h

index e351a841583953c302cba9ba5fd0f5960ae8abdb..b4dfaa921687f9e09f945b99b85afb97bb492761 100644 (file)
@@ -1441,109 +1441,6 @@ trace_ranger::range_of_expr (irange &r, tree name, gimple *s)
   return trailer (idx, "range_of_expr", res, name, r);
 }
 
-// Return the legacy global range for NAME if it has one, otherwise
-// return VARYING.
-
-static void
-get_range_global (irange &r, tree name)
-{
-  tree type = TREE_TYPE (name);
-
-  if (SSA_NAME_IS_DEFAULT_DEF (name))
-    {
-      tree sym = SSA_NAME_VAR (name);
-      // Adapted from vr_values::get_lattice_entry().
-      // Use a range from an SSA_NAME's available range.
-      if (TREE_CODE (sym) == PARM_DECL)
-       {
-         // Try to use the "nonnull" attribute to create ~[0, 0]
-         // anti-ranges for pointers.  Note that this is only valid with
-         // default definitions of PARM_DECLs.
-         if (POINTER_TYPE_P (type)
-             && ((cfun && nonnull_arg_p (sym)) || get_ptr_nonnull (name)))
-           r.set_nonzero (type);
-         else if (INTEGRAL_TYPE_P (type))
-           {
-             get_range_info (name, r);
-             if (r.undefined_p ())
-               r.set_varying (type);
-           }
-         else
-           r.set_varying (type);
-       }
-      // If this is a local automatic with no definition, use undefined.
-      else if (TREE_CODE (sym) != RESULT_DECL)
-       r.set_undefined ();
-      else
-       r.set_varying (type);
-   }
-  else if (!POINTER_TYPE_P (type) && SSA_NAME_RANGE_INFO (name))
-    {
-      get_range_info (name, r);
-      if (r.undefined_p ())
-       r.set_varying (type);
-    }
-  else if (POINTER_TYPE_P (type) && SSA_NAME_PTR_INFO (name))
-    {
-      if (get_ptr_nonnull (name))
-       r.set_nonzero (type);
-      else
-       r.set_varying (type);
-    }
-  else
-    r.set_varying (type);
-}
-
-// ?? Like above, but only for default definitions of NAME.  This is
-// so VRP passes using ranger do not start with known ranges,
-// otherwise we'd eliminate builtin_unreachables too early because of
-// inlining.
-//
-// Without this restriction, the test in g++.dg/tree-ssa/pr61034.C has
-// all of its unreachable calls removed too early.  We should
-// investigate whether we should just adjust the test above.
-
-value_range
-gimple_range_global (tree name)
-{
-  gcc_checking_assert (gimple_range_ssa_p (name));
-  tree type = TREE_TYPE (name);
-
-  if (SSA_NAME_IS_DEFAULT_DEF (name))
-    {
-      value_range vr;
-      get_range_global (vr, name);
-      return vr;
-    }
-  return value_range (type);
-}
-
-// ----------------------------------------------
-// global_range_query implementation.
-
-global_range_query global_ranges;
-
-// Like get_range_query, but for accessing global ranges.
-
-range_query *
-get_global_range_query ()
-{
-  return &global_ranges;
-}
-
-bool
-global_range_query::range_of_expr (irange &r, tree expr, gimple *)
-{
-  tree type = TREE_TYPE (expr);
-
-  if (!irange::supports_type_p (type) || !gimple_range_ssa_p (expr))
-    return get_tree_range (r, expr);
-
-  get_range_global (r, expr);
-
-  return true;
-}
-
 gimple_ranger *
 enable_ranger (struct function *fun)
 {
index 23734c6e226114a5f754095c46431ea5cd64daf2..ecd332a3c541c4d7407543194403924e85670c8d 100644 (file)
@@ -252,17 +252,6 @@ private:
 // Flag to enable debugging the various internal Caches.
 #define DEBUG_RANGE_CACHE (dump_file && (param_evrp_mode & EVRP_MODE_DEBUG))
 
-// Global ranges for SSA names using SSA_NAME_RANGE_INFO.
-
-class global_range_query : public range_query
-{
-public:
-  bool range_of_expr (irange &r, tree expr, gimple * = NULL) OVERRIDE;
-};
-
-extern global_range_query global_ranges;
-extern value_range gimple_range_global (tree name);
-
 extern gimple_ranger *enable_ranger (struct function *);
 extern void disable_ranger (struct function *);
 
index 5329c0a418768e0ecdedb42da06bceaf0014ef70..2165ad71cf3040b11608e0a48fd2105023bb2522 100644 (file)
@@ -423,31 +423,6 @@ set_range_info (tree name, const value_range &vr)
   set_range_info (name, vr.kind (), min, max);
 }
 
-/* Gets range information corresponding to ssa_name NAME and stores it
-   in a value_range VR.  Returns the value_range_kind.  */
-
-enum value_range_kind
-get_range_info (const_tree name, irange &vr)
-{
-  tree type = TREE_TYPE (name);
-  gcc_checking_assert (!POINTER_TYPE_P (type));
-  gcc_checking_assert (TREE_CODE (name) == SSA_NAME);
-
-  range_info_def *ri = SSA_NAME_RANGE_INFO (name);
-
-  /* Return VR_VARYING for SSA_NAMEs with NULL RANGE_INFO or SSA_NAMEs
-     with integral types width > 2 * HOST_BITS_PER_WIDE_INT precision.  */
-  if (!ri || (GET_MODE_PRECISION (SCALAR_INT_TYPE_MODE (TREE_TYPE (name)))
-             > 2 * HOST_BITS_PER_WIDE_INT))
-    vr.set_varying (type);
-  else
-    vr.set (wide_int_to_tree (type, ri->get_min ()),
-           wide_int_to_tree (type, ri->get_max ()),
-           SSA_NAME_RANGE_TYPE (name));
-
-  return vr.kind ();
-}
-
 /* Set nonnull attribute to pointer NAME.  */
 
 void
@@ -458,25 +433,6 @@ set_ptr_nonnull (tree name)
   pi->pt.null = 0;
 }
 
-/* Return nonnull attribute of pointer NAME.  */
-bool
-get_ptr_nonnull (const_tree name)
-{
-  gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
-  struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
-  if (pi == NULL)
-    return false;
-  /* TODO Now pt->null is conservatively set to true in PTA
-     analysis. vrp is the only pass (including ipa-vrp)
-     that clears pt.null via set_ptr_nonull when it knows
-     for sure. PTA will preserves the pt.null value set by VRP.
-
-     When PTA analysis is improved, pt.anything, pt.nonlocal
-     and pt.escaped may also has to be considered before
-     deciding that pointer cannot point to NULL.  */
-  return !pi->pt.null;
-}
-
 /* Change non-zero bits bitmask of NAME.  */
 
 void
index 166f921f04cbbd3c4ae43b71797077361cc3d754..ac880f3a67a979e8c6171aef95e6ad21ff35ee60 100644 (file)
@@ -70,8 +70,6 @@ struct GTY ((variable_size)) range_info_def {
 extern void set_range_info (tree, enum value_range_kind, const wide_int_ref &,
                            const wide_int_ref &);
 extern void set_range_info (tree, const value_range &);
-/* Gets the value range from SSA.  */
-extern enum value_range_kind get_range_info (const_tree, irange &);
 extern void set_nonzero_bits (tree, const wide_int_ref &);
 extern wide_int get_nonzero_bits (const_tree);
 extern bool ssa_name_has_boolean_range (tree);
@@ -90,7 +88,6 @@ extern void set_ptr_info_alignment (struct ptr_info_def *, unsigned int,
 extern void adjust_ptr_info_misalignment (struct ptr_info_def *, poly_uint64);
 extern struct ptr_info_def *get_ptr_info (tree);
 extern void set_ptr_nonnull (tree);
-extern bool get_ptr_nonnull (const_tree);
 
 extern tree copy_ssa_name_fn (struct function *, tree, gimple *);
 extern void duplicate_ssa_name_ptr_info (tree, struct ptr_info_def *);
index 509d2d33cc528fdc4e54c6cef0ac90b8d012b36b..f8b457d362c79f07128cfee588874c44059e3e5c 100644 (file)
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "value-range-equiv.h"
 #include "value-query.h"
 #include "alloc-pool.h"
+#include "gimple-range.h"
 
 // value_query default methods.
 
@@ -180,3 +181,149 @@ range_query::~range_query ()
   equiv_alloc->release ();
   delete equiv_alloc;
 }
+
+// Return the range for NAME from SSA_NAME_RANGE_INFO.
+
+static inline void
+get_ssa_name_range_info (irange &r, const_tree name)
+{
+  tree type = TREE_TYPE (name);
+  gcc_checking_assert (!POINTER_TYPE_P (type));
+  gcc_checking_assert (TREE_CODE (name) == SSA_NAME);
+
+  range_info_def *ri = SSA_NAME_RANGE_INFO (name);
+
+  // Return VR_VARYING for SSA_NAMEs with NULL RANGE_INFO or SSA_NAMEs
+  // with integral types width > 2 * HOST_BITS_PER_WIDE_INT precision.
+  if (!ri || (GET_MODE_PRECISION (SCALAR_INT_TYPE_MODE (TREE_TYPE (name)))
+             > 2 * HOST_BITS_PER_WIDE_INT))
+    r.set_varying (type);
+  else
+    r.set (wide_int_to_tree (type, ri->get_min ()),
+          wide_int_to_tree (type, ri->get_max ()),
+          SSA_NAME_RANGE_TYPE (name));
+}
+
+// Return nonnull attribute of pointer NAME from SSA_NAME_PTR_INFO.
+
+static inline bool
+get_ssa_name_ptr_info_nonnull (const_tree name)
+{
+  gcc_assert (POINTER_TYPE_P (TREE_TYPE (name)));
+  struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
+  if (pi == NULL)
+    return false;
+  /* TODO Now pt->null is conservatively set to true in PTA
+     analysis. vrp is the only pass (including ipa-vrp)
+     that clears pt.null via set_ptr_nonull when it knows
+     for sure. PTA will preserves the pt.null value set by VRP.
+
+     When PTA analysis is improved, pt.anything, pt.nonlocal
+     and pt.escaped may also has to be considered before
+     deciding that pointer cannot point to NULL.  */
+  return !pi->pt.null;
+}
+
+// Return the legacy global range for NAME if it has one, otherwise
+// return VARYING.
+
+static void
+get_range_global (irange &r, tree name)
+{
+  tree type = TREE_TYPE (name);
+
+  if (SSA_NAME_IS_DEFAULT_DEF (name))
+    {
+      tree sym = SSA_NAME_VAR (name);
+      // Adapted from vr_values::get_lattice_entry().
+      // Use a range from an SSA_NAME's available range.
+      if (TREE_CODE (sym) == PARM_DECL)
+       {
+         // Try to use the "nonnull" attribute to create ~[0, 0]
+         // anti-ranges for pointers.  Note that this is only valid with
+         // default definitions of PARM_DECLs.
+         if (POINTER_TYPE_P (type)
+             && ((cfun && nonnull_arg_p (sym))
+                 || get_ssa_name_ptr_info_nonnull (name)))
+           r.set_nonzero (type);
+         else if (INTEGRAL_TYPE_P (type))
+           {
+             get_ssa_name_range_info (r, name);
+             if (r.undefined_p ())
+               r.set_varying (type);
+           }
+         else
+           r.set_varying (type);
+       }
+      // If this is a local automatic with no definition, use undefined.
+      else if (TREE_CODE (sym) != RESULT_DECL)
+       r.set_undefined ();
+      else
+       r.set_varying (type);
+   }
+  else if (!POINTER_TYPE_P (type) && SSA_NAME_RANGE_INFO (name))
+    {
+      get_ssa_name_range_info (r, name);
+      if (r.undefined_p ())
+       r.set_varying (type);
+    }
+  else if (POINTER_TYPE_P (type) && SSA_NAME_PTR_INFO (name))
+    {
+      if (get_ssa_name_ptr_info_nonnull (name))
+       r.set_nonzero (type);
+      else
+       r.set_varying (type);
+    }
+  else
+    r.set_varying (type);
+}
+
+// ?? Like above, but only for default definitions of NAME.  This is
+// so VRP passes using ranger do not start with known ranges,
+// otherwise we'd eliminate builtin_unreachables too early because of
+// inlining.
+//
+// Without this restriction, the test in g++.dg/tree-ssa/pr61034.C has
+// all of its unreachable calls removed too early.  We should
+// investigate whether we should just adjust the test above.
+
+value_range
+gimple_range_global (tree name)
+{
+  gcc_checking_assert (gimple_range_ssa_p (name));
+  tree type = TREE_TYPE (name);
+
+  if (SSA_NAME_IS_DEFAULT_DEF (name))
+    {
+      value_range vr;
+      get_range_global (vr, name);
+      return vr;
+    }
+  return value_range (type);
+}
+
+// ----------------------------------------------
+// global_range_query implementation.
+
+global_range_query global_ranges;
+
+// Like get_range_query, but for accessing global ranges.
+
+range_query *
+get_global_range_query ()
+{
+  return &global_ranges;
+}
+
+bool
+global_range_query::range_of_expr (irange &r, tree expr, gimple *)
+{
+  tree type = TREE_TYPE (expr);
+
+  if (!irange::supports_type_p (type) || !gimple_range_ssa_p (expr))
+    return get_tree_range (r, expr);
+
+  get_range_global (r, expr);
+
+  return true;
+}
index 5eff9317ed539548d8025b83531afd1f22e08bc1..97da663774746b8cb5523d41b45961fc89ed6cf8 100644 (file)
@@ -105,4 +105,15 @@ private:
   class equiv_allocator *equiv_alloc;
 };
 
+// Global ranges for SSA names using SSA_NAME_RANGE_INFO.
+
+class global_range_query : public range_query
+{
+public:
+  bool range_of_expr (irange &r, tree expr, gimple * = NULL) OVERRIDE;
+};
+
+extern global_range_query global_ranges;
+extern value_range gimple_range_global (tree name);
+
 #endif // GCC_QUERY_H