This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[alpha] RFA: Use new rtl iterators in alpha_set_memflags
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: rth at redhat dot com
- Date: Sat, 25 Oct 2014 11:14:16 +0100
- Subject: [alpha] RFA: Use new rtl iterators in alpha_set_memflags
- Authentication-results: sourceware.org; auth=none
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 alpha-linux-gnu. OK to install?
Thanks,
Richard
gcc/
* config/alpha/alpha.c (alpha_set_memflags_1): Delete.
(alpha_set_memflags): Use FOR_EACH_SUBRTX_VAR.
Index: gcc/config/alpha/alpha.c
===================================================================
--- gcc/config/alpha/alpha.c 2014-10-25 09:51:29.006915284 +0100
+++ gcc/config/alpha/alpha.c 2014-10-25 09:51:29.394918743 +0100
@@ -1668,30 +1668,6 @@ alpha_secondary_reload (bool in_p, rtx x
return NO_REGS;
}
-/* Subfunction of the following function. Update the flags of any MEM
- found in part of X. */
-
-static int
-alpha_set_memflags_1 (rtx *xp, void *data)
-{
- rtx x = *xp, orig = (rtx) data;
-
- if (!MEM_P (x))
- return 0;
-
- MEM_VOLATILE_P (x) = MEM_VOLATILE_P (orig);
- MEM_NOTRAP_P (x) = MEM_NOTRAP_P (orig);
- MEM_READONLY_P (x) = MEM_READONLY_P (orig);
-
- /* Sadly, we cannot use alias sets because the extra aliasing
- produced by the AND interferes. Given that two-byte quantities
- are the only thing we would be able to differentiate anyway,
- there does not seem to be any point in convoluting the early
- out of the alias check. */
-
- return -1;
-}
-
/* Given SEQ, which is an INSN list, look for any MEMs in either
a SET_DEST or a SET_SRC and copy the in-struct, unchanging, and
volatile flags from REF into each of the MEMs found. If REF is not
@@ -1713,9 +1689,26 @@ alpha_set_memflags (rtx seq, rtx ref)
&& !MEM_READONLY_P (ref))
return;
+ subrtx_var_iterator::array_type array;
for (insn = as_a <rtx_insn *> (seq); insn; insn = NEXT_INSN (insn))
if (INSN_P (insn))
- for_each_rtx (&PATTERN (insn), alpha_set_memflags_1, (void *) ref);
+ FOR_EACH_SUBRTX_VAR (iter, array, PATTERN (insn), NONCONST)
+ {
+ rtx x = *iter;
+ if (MEM_P (x))
+ {
+ MEM_VOLATILE_P (x) = MEM_VOLATILE_P (ref);
+ MEM_NOTRAP_P (x) = MEM_NOTRAP_P (ref);
+ MEM_READONLY_P (x) = MEM_READONLY_P (ref);
+ /* Sadly, we cannot use alias sets because the extra
+ aliasing produced by the AND interferes. Given that
+ two-byte quantities are the only thing we would be
+ able to differentiate anyway, there does not seem to
+ be any point in convoluting the early out of the
+ alias check. */
+ iter.skip_subrtxes ();
+ }
+ }
else
gcc_unreachable ();
}