[MIPS] RFA: Use new rtl iterators in mips_small_data_pattern_p
diff mbox

Message ID 878uk4zefg.fsf@googlemail.com
State New
Headers show

Commit Message

Richard Sandiford Oct. 25, 2014, 9:28 a.m. UTC
This is part of a series to remove uses of for_each_rtx from the ports.

Tested by making sure there were no code changes for gcc.dg, gcc.c-torture
and g++.dg for mips64-elf.  OK to install?

Thanks,
Richard


gcc/
	* config/mips/mips.c: Include rtl-iter.h.
	(mips_small_data_pattern_1): Take an rtx rather than an rtx pointer.
	Take the context as a parameter instead of the containing MEM.
	Iterate over all subrtxes.
	(mips_small_data_pattern_p): Update call accordingly.

Comments

Matthew Fortune Oct. 25, 2014, 8:53 p.m. UTC | #1
> gcc/
> 	* config/mips/mips.c: Include rtl-iter.h.
> 	(mips_small_data_pattern_1): Take an rtx rather than an rtx pointer.
> 	Take the context as a parameter instead of the containing MEM.
> 	Iterate over all subrtxes.
> 	(mips_small_data_pattern_p): Update call accordingly.

OK

Patch
diff mbox

Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c	2014-10-25 09:48:52.737534781 +0100
+++ gcc/config/mips/mips.c	2014-10-25 09:51:19.145827388 +0100
@@ -76,6 +76,7 @@  the Free Software Foundation; either ver
 #include "context.h"
 #include "cgraph.h"
 #include "builtins.h"
+#include "rtl-iter.h"
 
 /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF.  */
 #define UNSPEC_ADDRESS_P(X)					\
@@ -3449,29 +3450,32 @@  mips_rewrite_small_data_p (rtx x, enum m
 	  && symbol_type == SYMBOL_GP_RELATIVE);
 }
 
-/* A for_each_rtx callback for mips_small_data_pattern_p.  DATA is the
-   containing MEM, or null if none.  */
+/* Return true if OP refers to small data symbols directly, not through
+   a LO_SUM.  CONTEXT is the context in which X appears.  */
 
 static int
-mips_small_data_pattern_1 (rtx *loc, void *data)
+mips_small_data_pattern_1 (rtx x, enum mips_symbol_context context)
 {
-  enum mips_symbol_context context;
-
-  /* Ignore things like "g" constraints in asms.  We make no particular
-     guarantee about which symbolic constants are acceptable as asm operands
-     versus which must be forced into a GPR.  */
-  if (GET_CODE (*loc) == LO_SUM || GET_CODE (*loc) == ASM_OPERANDS)
-    return -1;
-
-  if (MEM_P (*loc))
+  subrtx_var_iterator::array_type array;
+  FOR_EACH_SUBRTX_VAR (iter, array, x, ALL)
     {
-      if (for_each_rtx (&XEXP (*loc, 0), mips_small_data_pattern_1, *loc))
-	return 1;
-      return -1;
-    }
+      rtx x = *iter;
 
-  context = data ? SYMBOL_CONTEXT_MEM : SYMBOL_CONTEXT_LEA;
-  return mips_rewrite_small_data_p (*loc, context);
+      /* Ignore things like "g" constraints in asms.  We make no particular
+	 guarantee about which symbolic constants are acceptable as asm operands
+	 versus which must be forced into a GPR.  */
+      if (GET_CODE (x) == LO_SUM || GET_CODE (x) == ASM_OPERANDS)
+	iter.skip_subrtxes ();
+      else if (MEM_P (x))
+	{
+	  if (mips_small_data_pattern_1 (XEXP (x, 0), SYMBOL_CONTEXT_MEM))
+	    return true;
+	  iter.skip_subrtxes ();
+	}
+      else if (mips_rewrite_small_data_p (x, context))
+	return true;
+    }
+  return false;
 }
 
 /* Return true if OP refers to small data symbols directly, not through
@@ -3480,7 +3484,7 @@  mips_small_data_pattern_1 (rtx *loc, voi
 bool
 mips_small_data_pattern_p (rtx op)
 {
-  return for_each_rtx (&op, mips_small_data_pattern_1, NULL);
+  return mips_small_data_pattern_1 (op, SYMBOL_CONTEXT_LEA);
 }
 
 /* A for_each_rtx callback, used by mips_rewrite_small_data.