aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-01-26 14:50:25 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-01-26 14:50:25 +0000
commitd7e1f499ed046bd1d57eaf4510778d2fc2666653 (patch)
treeaf94a9ed7de3029422c43104fa59e8e934539808 /gcc
parentda1f8d7f12c2efeadb3b127f6274fd0424c32410 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/dse.c7
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/g++.dg/torture/pr77745-2.C4
-rw-r--r--gcc/testsuite/g++.dg/torture/pr77745.C6
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
diff --git a/gcc/dse.c b/gcc/dse.c
index a0c66aa..1ef8f64 100644
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -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;