rtl.h (get_pool_constant, [...]): Replace rtx parameters with const_rtx parameters.
authorRichard Sandiford <rdsandiford@googlemail.com>
Thu, 28 Aug 2014 06:24:23 +0000 (06:24 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 28 Aug 2014 06:24:23 +0000 (06:24 +0000)
gcc/
* rtl.h (get_pool_constant, rtx_referenced_p): Replace rtx parameters
with const_rtx parameters.
* varasm.c (get_pool_constant): Likewise.
* rtlanal.c (rtx_referenced_p_1): Delete.
(rtx_referenced_p): Use FOR_EACH_SUBRTX instead of for_each_rtx.
Assert that the rtx we're looking for is nonnull.  Allow searches
for constant pool SYMBOL_REFs.

From-SVN: r214654

gcc/ChangeLog
gcc/rtl.h
gcc/rtlanal.c
gcc/varasm.c

index 4c19637eb84749da39c86cafb8b357533364e1ea..9481150135bb8c2887138e86d4b97fc0a8c84586 100644 (file)
@@ -1,3 +1,13 @@
+2014-08-28  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * rtl.h (get_pool_constant, rtx_referenced_p): Replace rtx parameters
+       with const_rtx parameters.
+       * varasm.c (get_pool_constant): Likewise.
+       * rtlanal.c (rtx_referenced_p_1): Delete.
+       (rtx_referenced_p): Use FOR_EACH_SUBRTX instead of for_each_rtx.
+       Assert that the rtx we're looking for is nonnull.  Allow searches
+       for constant pool SYMBOL_REFs.
+
 2014-08-28  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * reload1.c: Include rtl-iter.h.
index 671d064c7f0983aa9ae4973f83c3c9707e0b01de..925c384c63a6142edbbd9bb3f2a35441f2ff873c 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2557,7 +2557,7 @@ extern rtx force_const_mem (enum machine_mode, rtx);
 /* In varasm.c  */
 
 struct function;
-extern rtx get_pool_constant (rtx);
+extern rtx get_pool_constant (const_rtx);
 extern rtx get_pool_constant_mark (rtx, bool *);
 extern enum machine_mode get_pool_mode (const_rtx);
 extern rtx simplify_subtraction (rtx);
@@ -2800,7 +2800,7 @@ extern void copy_reg_eh_region_note_backward (rtx, rtx, rtx);
 extern int inequality_comparisons_p (const_rtx);
 extern rtx replace_rtx (rtx, rtx, rtx);
 extern int replace_label (rtx *, void *);
-extern int rtx_referenced_p (rtx, rtx);
+extern bool rtx_referenced_p (const_rtx, const_rtx);
 extern bool tablejump_p (const_rtx, rtx *, rtx_jump_table_data **);
 extern int computed_jump_p (const_rtx);
 extern bool tls_referenced_p (rtx);
index e6e13a60162726d35b734d0f95eddd2bcd8af8ed..0e80426391fc482ea412878dae3e174ff4d011e8 100644 (file)
@@ -43,7 +43,6 @@ along with GCC; see the file COPYING3.  If not see
 static void set_of_1 (rtx, const_rtx, void *);
 static bool covers_regno_p (const_rtx, unsigned int);
 static bool covers_regno_no_parallel_p (const_rtx, unsigned int);
-static int rtx_referenced_p_1 (rtx *, void *);
 static int computed_jump_p_1 (const_rtx);
 static void parms_set (rtx, const_rtx, void *);
 
@@ -2832,37 +2831,28 @@ replace_label (rtx *x, void *data)
   return 0;
 }
 
-/* When *BODY is equal to X or X is directly referenced by *BODY
-   return nonzero, thus FOR_EACH_RTX stops traversing and returns nonzero
-   too, otherwise FOR_EACH_RTX continues traversing *BODY.  */
+/* Return true if X is referenced in BODY.  */
 
-static int
-rtx_referenced_p_1 (rtx *body, void *x)
+bool
+rtx_referenced_p (const_rtx x, const_rtx body)
 {
-  rtx y = (rtx) x;
-
-  if (*body == NULL_RTX)
-    return y == NULL_RTX;
-
-  /* Return true if a label_ref *BODY refers to label Y.  */
-  if (GET_CODE (*body) == LABEL_REF && LABEL_P (y))
-    return XEXP (*body, 0) == y;
-
-  /* If *BODY is a reference to pool constant traverse the constant.  */
-  if (GET_CODE (*body) == SYMBOL_REF
-      && CONSTANT_POOL_ADDRESS_P (*body))
-    return rtx_referenced_p (y, get_pool_constant (*body));
-
-  /* By default, compare the RTL expressions.  */
-  return rtx_equal_p (*body, y);
-}
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, body, ALL)
+    if (const_rtx y = *iter)
+      {
+       /* Check if a label_ref Y refers to label X.  */
+       if (GET_CODE (y) == LABEL_REF && LABEL_P (y) && XEXP (y, 0) == x)
+         return true;
 
-/* Return true if X is referenced in BODY.  */
+       if (rtx_equal_p (x, y))
+         return true;
 
-int
-rtx_referenced_p (rtx x, rtx body)
-{
-  return for_each_rtx (&body, rtx_referenced_p_1, x);
+       /* If Y is a reference to pool constant traverse the constant.  */
+       if (GET_CODE (y) == SYMBOL_REF
+           && CONSTANT_POOL_ADDRESS_P (y))
+         iter.substitute (get_pool_constant (y));
+      }
+  return false;
 }
 
 /* If INSN is a tablejump return true and store the label (before jump table) to
index f2d5a26e7b97eeca79e5d3433d4f7f8733b4a4c1..c820f75096842893cbf180f9e1dc99883ac6b844 100644 (file)
@@ -3724,7 +3724,7 @@ force_const_mem (enum machine_mode mode, rtx x)
 /* Given a constant pool SYMBOL_REF, return the corresponding constant.  */
 
 rtx
-get_pool_constant (rtx addr)
+get_pool_constant (const_rtx addr)
 {
   return SYMBOL_REF_CONSTANT (addr)->constant;
 }