aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-08-05 13:05:06 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-08-05 13:05:06 +0000
commit96b3c03f4e952c913811f2ba7bf2b703ab0d54e4 (patch)
tree6dfae1a4a0cc077331f6a132085edd0b377def68 /gcc
parentb8a5fbd280e516d914b41b80132210c6549814cd (diff)
downloadgcc-96b3c03f4e952c913811f2ba7bf2b703ab0d54e4.zip
gcc-96b3c03f4e952c913811f2ba7bf2b703ab0d54e4.tar.gz
gcc-96b3c03f4e952c913811f2ba7bf2b703ab0d54e4.tar.bz2
re PR rtl-optimization/61672 (Less redundant instructions deleted by pre_delete after r208113.)
2014-08-05 Richard Biener <rguenther@suse.de> PR rtl-optimization/61672 * emit-rtl.h (mem_attrs_eq_p): Declare. * emit-rtl.c (mem_attrs_eq_p): Export. Handle NULL mem-attrs. * cse.c (exp_equiv_p): Use mem_attrs_eq_p. * cfgcleanup.c (merge_memattrs): Likewise. Include emit-rtl.h. From-SVN: r213638
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cfgcleanup.c3
-rw-r--r--gcc/cse.c2
-rw-r--r--gcc/emit-rtl.c6
-rw-r--r--gcc/emit-rtl.h3
5 files changed, 20 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 560f6e4..f199fed 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2014-08-05 Richard Biener <rguenther@suse.de>
+
+ PR rtl-optimization/61672
+ * emit-rtl.h (mem_attrs_eq_p): Declare.
+ * emit-rtl.c (mem_attrs_eq_p): Export. Handle NULL mem-attrs.
+ * cse.c (exp_equiv_p): Use mem_attrs_eq_p.
+ * cfgcleanup.c (merge_memattrs): Likewise.
+ Include emit-rtl.h.
+
2014-08-05 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/arm_neon.h (vqdmlals_lane_s32): Use scalar types
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 01fd9ff..0fbfd55 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see
#include "df.h"
#include "dce.h"
#include "dbgcnt.h"
+#include "emit-rtl.h"
#define FORWARDER_BLOCK_P(BB) ((BB)->flags & BB_FORWARDER_BLOCK)
@@ -883,7 +884,7 @@ merge_memattrs (rtx x, rtx y)
if (GET_MODE (x) != GET_MODE (y))
return;
- if (code == MEM && MEM_ATTRS (x) != MEM_ATTRS (y))
+ if (code == MEM && !mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y)))
{
if (! MEM_ATTRS (x))
MEM_ATTRS (y) = 0;
diff --git a/gcc/cse.c b/gcc/cse.c
index dd9a076..16d2fc1 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -2685,7 +2685,7 @@ exp_equiv_p (const_rtx x, const_rtx y, int validate, bool for_gcse)
But because really all MEM attributes should be the same for
equivalent MEMs, we just use the invariant that MEMs that have
the same attributes share the same mem_attrs data structure. */
- if (MEM_ATTRS (x) != MEM_ATTRS (y))
+ if (!mem_attrs_eq_p (MEM_ATTRS (x), MEM_ATTRS (y)))
return 0;
/* If we are handling exceptions, we cannot consider two expressions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 80e5b2c..94f3275 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -290,9 +290,13 @@ const_fixed_htab_eq (const void *x, const void *y)
/* Return true if the given memory attributes are equal. */
-static bool
+bool
mem_attrs_eq_p (const struct mem_attrs *p, const struct mem_attrs *q)
{
+ if (p == q)
+ return true;
+ if (!p || !q)
+ return false;
return (p->alias == q->alias
&& p->offset_known_p == q->offset_known_p
&& (!p->offset_known_p || p->offset == q->offset)
diff --git a/gcc/emit-rtl.h b/gcc/emit-rtl.h
index c72c24f..8439750 100644
--- a/gcc/emit-rtl.h
+++ b/gcc/emit-rtl.h
@@ -20,6 +20,9 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_EMIT_RTL_H
#define GCC_EMIT_RTL_H
+/* Return whether two MEM_ATTRs are equal. */
+bool mem_attrs_eq_p (const struct mem_attrs *, const struct mem_attrs *);
+
/* Set the alias set of MEM to SET. */
extern void set_mem_alias_set (rtx, alias_set_type);