diff options
author | Richard Biener <rguenther@suse.de> | 2014-08-05 13:05:06 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-08-05 13:05:06 +0000 |
commit | 96b3c03f4e952c913811f2ba7bf2b703ab0d54e4 (patch) | |
tree | 6dfae1a4a0cc077331f6a132085edd0b377def68 /gcc | |
parent | b8a5fbd280e516d914b41b80132210c6549814cd (diff) | |
download | gcc-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/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 3 | ||||
-rw-r--r-- | gcc/cse.c | 2 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 6 | ||||
-rw-r--r-- | gcc/emit-rtl.h | 3 |
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; @@ -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); |