diff options
author | Richard Biener <rguenther@suse.de> | 2018-01-26 14:50:25 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-01-26 14:50:25 +0000 |
commit | d7e1f499ed046bd1d57eaf4510778d2fc2666653 (patch) | |
tree | af94a9ed7de3029422c43104fa59e8e934539808 /gcc | |
parent | da1f8d7f12c2efeadb3b127f6274fd0424c32410 (diff) | |
download | gcc-d7e1f499ed046bd1d57eaf4510778d2fc2666653.zip gcc-d7e1f499ed046bd1d57eaf4510778d2fc2666653.tar.gz gcc-d7e1f499ed046bd1d57eaf4510778d2fc2666653.tar.bz2 |
re PR rtl-optimization/84003 (FAIL: g++.dg/torture/pr77745.C with noinline foo)
2018-01-26 Richard Biener <rguenther@suse.de>
PR rtl-optimization/84003
* dse.c (record_store): Only record redundant stores when
the earlier store aliases at least all accesses the later one does.
* g++.dg/torture/pr77745.C: Mark foo noinline to trigger
latent bug in DSE if NOINLINE is appropriately defined.
* g++.dg/torture/pr77745-2.C: New testcase including pr77745.C
and defining NOINLINE.
From-SVN: r257091
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/dse.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr77745-2.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr77745.C | 6 |
5 files changed, 29 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 764368a..2f64269 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-01-26 Richard Biener <rguenther@suse.de> + + PR rtl-optimization/84003 + * dse.c (record_store): Only record redundant stores when + the earlier store aliases at least all accesses the later one does. + 2018-01-26 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/83985 @@ -1532,7 +1532,12 @@ record_store (rtx body, bb_info_t bb_info) && known_subrange_p (offset, width, s_info->offset, s_info->width) && all_positions_needed_p (s_info, offset - s_info->offset, - width)) + width) + /* We can only remove the later store if the earlier aliases + at least all accesses the later one. */ + && (MEM_ALIAS_SET (mem) == MEM_ALIAS_SET (s_info->mem) + || alias_set_subset_of (MEM_ALIAS_SET (mem), + MEM_ALIAS_SET (s_info->mem)))) { if (GET_MODE (mem) == BLKmode) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 65bfe0f..92bbe45 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2018-01-26 Richard Biener <rguenther@suse.de> + + PR rtl-optimization/84003 + * g++.dg/torture/pr77745.C: Mark foo noinline to trigger + latent bug in DSE if NOINLINE is appropriately defined. + * g++.dg/torture/pr77745-2.C: New testcase including pr77745.C + and defining NOINLINE. + 2018-01-26 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * gcc.target/aarch64/advsimd-intrinsics/vld1x2.c: Make float64 diff --git a/gcc/testsuite/g++.dg/torture/pr77745-2.C b/gcc/testsuite/g++.dg/torture/pr77745-2.C new file mode 100644 index 0000000..7861089 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr77745-2.C @@ -0,0 +1,4 @@ +// { dg-do run } + +#define NOINLINE __attribute__((noinline)) +#include "pr77745.C" diff --git a/gcc/testsuite/g++.dg/torture/pr77745.C b/gcc/testsuite/g++.dg/torture/pr77745.C index 59d86b5..6285bc1 100644 --- a/gcc/testsuite/g++.dg/torture/pr77745.C +++ b/gcc/testsuite/g++.dg/torture/pr77745.C @@ -1,8 +1,12 @@ // { dg-do run } +#ifndef NOINLINE +#define NOINLINE /* */ +#endif + inline void* operator new(__SIZE_TYPE__, void* __p) noexcept { return __p; } -long foo(char *c1, char *c2) +long NOINLINE foo(char *c1, char *c2) { long *p1 = new (c1) long; *p1 = 100; |