From d614335f7796ca828cfab1a9e789bbb91165755b Mon Sep 17 00:00:00 2001 From: Anatoly Sokolov Date: Fri, 30 Oct 2015 23:56:32 +0300 Subject: [PATCH] Add contains_symbol_ref_p From-SVN: r229607 --- gcc/ChangeLog | 10 ++++++++++ gcc/lra-constraints.c | 29 ----------------------------- gcc/rtl.h | 4 ++++ gcc/rtlanal.c | 13 +++++++++++++ gcc/var-tracking.c | 39 +-------------------------------------- 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 + + * 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 * 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 -- 2.30.2