+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.
/* 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);
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);
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 *);
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