summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-26 10:41:29 +0000
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>2014-10-26 10:41:29 +0000
commit3e0e21c7dd5478428a960dd715dba4af3330b957 (patch)
treee2169259b6a6d03d65a06947a21d9c25d840aacd /gcc
parent1795cff245d07e8358bbfd5aaeaa2866117fe735 (diff)
downloadgcc-3e0e21c7dd5478428a960dd715dba4af3330b957.tar.gz
gcc/
* config/mips/mips.c (r10k_needs_protection_p_1): Take an rtx rather than an rtx pointer. Change type of insn from "void *" to its real type. Return bool rather than int. Iterate over all subrtxes here. (r10k_needs_protection_p_store): Update accordingly. (r10k_needs_protection_p): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@216711 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/mips/mips.c44
2 files changed, 31 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a903abf060c..9bb932d9077 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2014-10-26 Richard Sandiford <richard.sandiford@arm.com>
+ * config/mips/mips.c (r10k_needs_protection_p_1): Take an rtx
+ rather than an rtx pointer. Change type of insn from "void *"
+ to its real type. Return bool rather than int. Iterate over
+ all subrtxes here.
+ (r10k_needs_protection_p_store): Update accordingly.
+ (r10k_needs_protection_p): Likewise.
+
+2014-10-26 Richard Sandiford <richard.sandiford@arm.com>
+
* config/mips/mips.c (mips16_rewrite_pool_refs_info): Delete.
(mips16_rewrite_pool_refs): Take the insn and constant pool as
parameters. Iterate over the instruction's pattern and return void.
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index c3a981fb5c1..5490e975f6d 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -15063,28 +15063,28 @@ r10k_safe_mem_expr_p (tree expr, unsigned HOST_WIDE_INT offset)
return offset < tree_to_uhwi (DECL_SIZE_UNIT (inner));
}
-/* A for_each_rtx callback for which DATA points to the instruction
- containing *X. Stop the search if we find a MEM that is not safe
- from R10K speculation. */
+/* Return true if X contains a MEM that is not safe from R10K speculation.
+ INSN is the instruction that contains X. */
-static int
-r10k_needs_protection_p_1 (rtx *loc, void *data)
+static bool
+r10k_needs_protection_p_1 (rtx x, rtx_insn *insn)
{
- rtx mem;
-
- mem = *loc;
- if (!MEM_P (mem))
- return 0;
-
- if (MEM_EXPR (mem)
- && MEM_OFFSET_KNOWN_P (mem)
- && r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
- return -1;
-
- if (r10k_safe_address_p (XEXP (mem, 0), (rtx_insn *) data))
- return -1;
-
- return 1;
+ subrtx_var_iterator::array_type array;
+ FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
+ {
+ rtx mem = *iter;
+ if (MEM_P (mem))
+ {
+ if ((MEM_EXPR (mem)
+ && MEM_OFFSET_KNOWN_P (mem)
+ && r10k_safe_mem_expr_p (MEM_EXPR (mem), MEM_OFFSET (mem)))
+ || r10k_safe_address_p (XEXP (mem, 0), insn))
+ iter.skip_subrtxes ();
+ else
+ return true;
+ }
+ }
+ return false;
}
/* A note_stores callback for which DATA points to an instruction pointer.
@@ -15098,7 +15098,7 @@ r10k_needs_protection_p_store (rtx x, const_rtx pat ATTRIBUTE_UNUSED,
rtx_insn **insn_ptr;
insn_ptr = (rtx_insn **) data;
- if (*insn_ptr && for_each_rtx (&x, r10k_needs_protection_p_1, *insn_ptr))
+ if (*insn_ptr && r10k_needs_protection_p_1 (x, *insn_ptr))
*insn_ptr = NULL;
}
@@ -15136,7 +15136,7 @@ r10k_needs_protection_p (rtx_insn *insn)
return insn == NULL_RTX;
}
- return for_each_rtx (&PATTERN (insn), r10k_needs_protection_p_1, insn);
+ return r10k_needs_protection_p_1 (PATTERN (insn), insn);
}
/* Return true if BB is only reached by blocks in PROTECTED_BBS and if every