This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 37/50] rtlanal.c:rtx_referenced_p
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 03 Aug 2014 15:22:45 +0100
- Subject: [PATCH 37/50] rtlanal.c:rtx_referenced_p
- Authentication-results: sourceware.org; auth=none
- References: <87y4v5d77q dot fsf at googlemail dot com>
The old function handled constant pool SYMBOL_REFs by going straight to the
underlying constant, which meant you couldn't test for the SYMBOL_REF itself.
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.
Index: gcc/rtl.h
===================================================================
--- gcc/rtl.h 2014-08-03 11:25:09.679951878 +0100
+++ gcc/rtl.h 2014-08-03 11:25:30.447157195 +0100
@@ -2045,7 +2045,7 @@ extern rtx force_const_mem (enum machine
/* 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);
@@ -2288,7 +2288,7 @@ extern void copy_reg_eh_region_note_back
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 *);
extern int computed_jump_p (const_rtx);
extern bool tls_referenced_p (rtx);
Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c 2014-08-03 11:25:09.679951878 +0100
+++ gcc/varasm.c 2014-08-03 11:25:30.450157225 +0100
@@ -3720,7 +3720,7 @@ force_const_mem (enum machine_mode mode,
/* 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;
}
Index: gcc/rtlanal.c
===================================================================
--- gcc/rtlanal.c 2014-08-03 11:25:20.309056964 +0100
+++ gcc/rtlanal.c 2014-08-03 11:25:30.448157205 +0100
@@ -43,7 +43,6 @@ Software Foundation; either version 3, o
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. */
-
-static int
-rtx_referenced_p_1 (rtx *body, void *x)
-{
- 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);
-}
-
/* Return true if X is referenced in BODY. */
-int
-rtx_referenced_p (rtx x, rtx body)
+bool
+rtx_referenced_p (const_rtx x, const_rtx body)
{
- return for_each_rtx (&body, rtx_referenced_p_1, x);
+ 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;
+
+ if (rtx_equal_p (x, y))
+ return true;
+
+ /* 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