[37/50] rtlanal.c:rtx_referenced_p
diff mbox

Message ID 87iom97ive.fsf@googlemail.com
State New
Headers show

Commit Message

Richard Sandiford Aug. 3, 2014, 2:22 p.m. UTC
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.

Comments

Jeff Law Aug. 5, 2014, 10:10 p.m. UTC | #1
On 08/03/14 08:22, Richard Sandiford wrote:
> 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.
OK.
Jeff

Patch
diff mbox

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