aboutsummaryrefslogtreecommitdiff
path: root/gcc/alias.c
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2012-10-17 20:59:40 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2012-10-17 20:59:40 +0000
commita7b159a4dcca7e45fdf2b57a865dd2a91148eefb (patch)
tree6246e46226dfe3ca8100baf6e693f108a7fa2483 /gcc/alias.c
parent4d9675496a28ef6184f2a9c3ac5e6e3ea63606c1 (diff)
downloadgcc-a7b159a4dcca7e45fdf2b57a865dd2a91148eefb.zip
gcc-a7b159a4dcca7e45fdf2b57a865dd2a91148eefb.tar.gz
gcc-a7b159a4dcca7e45fdf2b57a865dd2a91148eefb.tar.bz2
re PR rtl-optimization/54900 (write introduction incorrect wrt the C11 memory model (2))
PR rtl-optimization/54900 * ifcvt.c (noce_can_store_speculate_p): Call memory_must_be_modified_in_insn_p. * alias.c (memory_must_be_modified_in_insn_p): New. (set_dest_equal_p): New. * rtl.h (memory_must_be_modified_in_p): Protoize. From-SVN: r192548
Diffstat (limited to 'gcc/alias.c')
-rw-r--r--gcc/alias.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/gcc/alias.c b/gcc/alias.c
index 244ca52..c5e6417 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -2762,6 +2762,39 @@ memory_modified_in_insn_p (const_rtx mem, const_rtx insn)
return memory_modified;
}
+/* Return TRUE if the destination of a set is rtx identical to
+ ITEM. */
+static inline bool
+set_dest_equal_p (const_rtx set, const_rtx item)
+{
+ rtx dest = SET_DEST (set);
+ return rtx_equal_p (dest, item);
+}
+
+/* Like memory_modified_in_insn_p, but return TRUE if INSN will
+ *DEFINITELY* modify the memory contents of MEM. */
+bool
+memory_must_be_modified_in_insn_p (const_rtx mem, const_rtx insn)
+{
+ if (!INSN_P (insn))
+ return false;
+ insn = PATTERN (insn);
+ if (GET_CODE (insn) == SET)
+ return set_dest_equal_p (insn, mem);
+ else if (GET_CODE (insn) == PARALLEL)
+ {
+ int i;
+ for (i = 0; i < XVECLEN (insn, 0); i++)
+ {
+ rtx sub = XVECEXP (insn, 0, i);
+ if (GET_CODE (sub) == SET
+ && set_dest_equal_p (sub, mem))
+ return true;
+ }
+ }
+ return false;
+}
+
/* Initialize the aliasing machinery. Initialize the REG_KNOWN_VALUE
array. */