mips.c (r10k_needs_protection_p_call): Take a const_rtx and return a bool.
authorRichard Sandiford <richard.sandiford@arm.com>
Sun, 26 Oct 2014 10:41:36 +0000 (10:41 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sun, 26 Oct 2014 10:41:36 +0000 (10:41 +0000)
gcc/
* config/mips/mips.c (r10k_needs_protection_p_call): Take a const_rtx
and return a bool.  Iterate over all subrtxes here.
(r10k_needs_protection_p): Update accordingly.

From-SVN: r216712

gcc/ChangeLog
gcc/config/mips/mips.c

index 9bb932d9077f521011c5e80e625172236848a6a7..f753d6545e2d33caa8030562d4c42c0ca9ee694e 100644 (file)
@@ -1,3 +1,9 @@
+2014-10-26  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * config/mips/mips.c (r10k_needs_protection_p_call): Take a const_rtx
+       and return a bool.  Iterate over all subrtxes here.
+       (r10k_needs_protection_p): Update accordingly.
+
 2014-10-26  Richard Sandiford  <richard.sandiford@arm.com>
 
        * config/mips/mips.c (r10k_needs_protection_p_1): Take an rtx
index 5490e975f6daa9b923a06a80c2425cb29c61d9c1..8a0185c0c988e7e3b92cf76d49243aaeab46741c 100644 (file)
@@ -15102,23 +15102,26 @@ r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
     *insn_ptr = NULL;
 }
 
-/* A for_each_rtx callback that iterates over the pattern of a CALL_INSN.
-   Return nonzero if the call is not to a declared function.  */
+/* X is the pattern of a call instruction.  Return true if the call is
+   not to a declared function.  */
 
-static int
-r10k_needs_protection_p_call (rtx *loc, void *data ATTRIBUTE_UNUSED)
+static bool
+r10k_needs_protection_p_call (const_rtx x)
 {
-  rtx x;
-
-  x = *loc;
-  if (!MEM_P (x))
-    return 0;
-
-  x = XEXP (x, 0);
-  if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_DECL (x))
-    return -1;
-
-  return 1;
+  subrtx_iterator::array_type array;
+  FOR_EACH_SUBRTX (iter, array, x, NONCONST)
+    {
+      const_rtx mem = *iter;
+      if (MEM_P (mem))
+       {
+         const_rtx addr = XEXP (mem, 0);
+         if (GET_CODE (addr) == SYMBOL_REF && SYMBOL_REF_DECL (addr))
+           iter.skip_subrtxes ();
+         else
+           return true;
+       }
+    }
+  return false;
 }
 
 /* Return true if instruction INSN needs to be protected by an R10K
@@ -15128,7 +15131,7 @@ static bool
 r10k_needs_protection_p (rtx_insn *insn)
 {
   if (CALL_P (insn))
-    return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_call, NULL);
+    return r10k_needs_protection_p_call (PATTERN (insn));
 
   if (mips_r10k_cache_barrier == R10K_CACHE_BARRIER_STORE)
     {