aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraesok <aesok@138bc75d-0d04-0410-961f-82ee72b054a4>2015-10-30 20:56:32 +0000
committeraesok <aesok@138bc75d-0d04-0410-961f-82ee72b054a4>2015-10-30 20:56:32 +0000
commit19ec752ea2cc04edb0a447d027090281c5af9fe0 (patch)
tree2e6dad106e2c0be6d7bcd62276c61e90c5b1dc22
parentf730358ae809a3dcf4c9670922961ad41e55d28f (diff)
Add contains_symbol_ref_p
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@229607 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/lra-constraints.c29
-rw-r--r--gcc/rtl.h4
-rw-r--r--gcc/rtlanal.c13
-rw-r--r--gcc/var-tracking.c39
5 files changed, 28 insertions, 67 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ee6a34ff94d..1b4725ee701 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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:
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 0379db99cd6..4670e811b3a 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -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
diff --git a/gcc/rtl.h b/gcc/rtl.h
index ad0cf6abf56..fe081ed3085 100644
--- 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. */
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index 7bc3fdbc0ca..67098e52ab7 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -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
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 2f7c761c08e..72f2e81f059 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -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