Add contains_symbol_ref_p
authorAnatoly Sokolov <aesok@post.ru>
Fri, 30 Oct 2015 20:56:32 +0000 (23:56 +0300)
committerAnatoly Sokolov <aesok@gcc.gnu.org>
Fri, 30 Oct 2015 20:56:32 +0000 (23:56 +0300)
From-SVN: r229607

gcc/ChangeLog
gcc/lra-constraints.c
gcc/rtl.h
gcc/rtlanal.c
gcc/var-tracking.c

index ee6a34ff94d288b0316087e0bc91ef2d57a682b5..1b4725ee701313998eb0d9f5972e6673fdc165d1 100644 (file)
@@ -1,3 +1,13 @@
+2015-10-30  Anatoly Sokolov  <aesok@post.ru>
+
+       * rtl.h (contains_symbol_ref_p): Declare.
+       (SYMBOL_REF_P): Define.
+       * rtlanal.c (contains_symbol_ref_p: New function.
+       * lra-constraints.c (contains_symbol_ref_p): Remove.
+       * var-tracking.c (contains_symbol_ref): Remove.
+       (track_expr_p): Use contains_symbol_ref_p instead of
+       contains_symbol_ref.
+
 2015-10-30  Alan Lawrence  <alan.lawrence@arm.com>
 
        * gimple-fold.c (fold_array_ctor_reference): Move searching code to:
index 0379db99cd627affd17ddf9148942b8df8ea8167..4670e811b3a9bb0288bf40f91157e3152dbaa9d0 100644 (file)
@@ -4001,35 +4001,6 @@ contains_reg_p (rtx x, bool hard_reg_p, bool spilled_p)
   return false;
 }
 
-/* Return true if X contains a symbol reg.  */
-static bool
-contains_symbol_ref_p (rtx x)
-{
-  int i, j;
-  const char *fmt;
-  enum rtx_code code;
-
-  code = GET_CODE (x);
-  if (code == SYMBOL_REF)
-    return true;
-  fmt = GET_RTX_FORMAT (code);
-  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
-    {
-      if (fmt[i] == 'e')
-       {
-         if (contains_symbol_ref_p (XEXP (x, i)))
-           return true;
-       }
-      else if (fmt[i] == 'E')
-       {
-         for (j = XVECLEN (x, i) - 1; j >= 0; j--)
-           if (contains_symbol_ref_p (XVECEXP (x, i, j)))
-             return true;
-       }
-    }
-  return false;
-}
-
 /* Process all regs in location *LOC and change them on equivalent
    substitution.  Return true if any change was done.  */
 static bool
index ad0cf6abf564fd4a7a4d02d22829f8b7a878c182..fe081ed308538957fdfbb5739eef01e1578630c3 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -829,6 +829,9 @@ struct GTY(()) rtvec_def {
 /* Predicate yielding nonzero iff RTX is a subreg.  */
 #define SUBREG_P(RTX) (GET_CODE (RTX) == SUBREG)
 
+/* Predicate yielding true iff RTX is a symbol ref.  */
+#define SYMBOL_REF_P(RTX) (GET_CODE (RTX) == SYMBOL_REF)
+
 template <>
 template <>
 inline bool
@@ -2926,6 +2929,7 @@ extern void set_insn_deleted (rtx);
 /* Functions in rtlanal.c */
 
 extern rtx single_set_2 (const rtx_insn *, const_rtx);
+extern bool contains_symbol_ref_p (const_rtx);
 
 /* Handle the cheap and common cases inline for performance.  */
 
index 7bc3fdbc0caf702093a861c2b33e8b17b97c726d..67098e52ab7fbe9578af8a0a0432a8ec279b21c5 100644 (file)
@@ -6230,6 +6230,19 @@ get_index_code (const struct address_info *info)
   return SCRATCH;
 }
 
+/* Return true if RTL X contains a SYMBOL_REF.  */
+
+bool
+contains_symbol_ref_p (const_rtx x)
+{
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, x, ALL)
+    if (SYMBOL_REF_P (*iter))
+      return true;
+
+  return false;
+}
+
 /* Return true if X contains a thread-local symbol.  */
 
 bool
index 2f7c761c08e0b3f3919c5554cb587d0b9c4e42ee..72f2e81f05934101672a730ab568812cdbbc9c45 100644 (file)
@@ -664,7 +664,6 @@ static bool variable_different_p (variable *, variable *);
 static bool dataflow_set_different (dataflow_set *, dataflow_set *);
 static void dataflow_set_destroy (dataflow_set *);
 
-static bool contains_symbol_ref (rtx);
 static bool track_expr_p (tree, bool);
 static bool same_variable_part_p (rtx, tree, HOST_WIDE_INT);
 static void add_uses_1 (rtx *, void *);
@@ -5021,42 +5020,6 @@ dataflow_set_destroy (dataflow_set *set)
   set->vars = NULL;
 }
 
-/* Return true if RTL X contains a SYMBOL_REF.  */
-
-static bool
-contains_symbol_ref (rtx x)
-{
-  const char *fmt;
-  RTX_CODE code;
-  int i;
-
-  if (!x)
-    return false;
-
-  code = GET_CODE (x);
-  if (code == SYMBOL_REF)
-    return true;
-
-  fmt = GET_RTX_FORMAT (code);
-  for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
-    {
-      if (fmt[i] == 'e')
-       {
-         if (contains_symbol_ref (XEXP (x, i)))
-           return true;
-       }
-      else if (fmt[i] == 'E')
-       {
-         int j;
-         for (j = 0; j < XVECLEN (x, i); j++)
-           if (contains_symbol_ref (XVECEXP (x, i, j)))
-             return true;
-       }
-    }
-
-  return false;
-}
-
 /* Shall EXPR be tracked?  */
 
 static bool
@@ -5137,7 +5100,7 @@ track_expr_p (tree expr, bool need_rtl)
      char **_dl_argv;
   */
   if (decl_rtl && MEM_P (decl_rtl)
-      && contains_symbol_ref (XEXP (decl_rtl, 0)))
+      && contains_symbol_ref_p (XEXP (decl_rtl, 0)))
     return 0;
 
   /* If RTX is a memory it should not be very large (because it would be