aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-07-19 16:19:39 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-07-19 16:19:39 +0000
commit6b68f00d4c2b375dad66bd6e72c01c309b4085c5 (patch)
treecd052e0c10954d036a233e8d22903b56484a31f4
parentd826ea32f6c98b59cbcb4140751374c583616239 (diff)
downloadgcc-6b68f00d4c2b375dad66bd6e72c01c309b4085c5.zip
gcc-6b68f00d4c2b375dad66bd6e72c01c309b4085c5.tar.gz
gcc-6b68f00d4c2b375dad66bd6e72c01c309b4085c5.tar.bz2
re PR tree-optimization/91211 (wrong code with __builtin_memset() and __builtin_memcpy() at -O1 and above)
2019-07-19 Richard Biener <rguenther@suse.de> PR tree-optimization/91211 * tree-ssa-sccvn.c (vn_walk_cb_data::push_partial_def): Fix memset encoding size. * gcc.dg/torture/pr91211.c: New testcase. From-SVN: r273605
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr91211.c19
-rw-r--r--gcc/tree-ssa-sccvn.c3
4 files changed, 32 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8824ffd..08f91ed 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-07-19 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/91211
+ * tree-ssa-sccvn.c (vn_walk_cb_data::push_partial_def): Fix
+ memset encoding size.
+
2019-07-19 Uroš Bizjak <ubizjak@gmail.com>
PR target/91204
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dfbf850..98fb40d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2019-07-19 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/91211
+ * gcc.dg/torture/pr91211.c: New testcase.
+
+2019-07-19 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/91200
* gcc.dg/torture/pr91200.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr91211.c b/gcc/testsuite/gcc.dg/torture/pr91211.c
new file mode 100644
index 0000000..84db92d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr91211.c
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+typedef __UINT32_TYPE__ u32;
+
+int
+main (void)
+{
+ u32 b = 0x027C5902;
+ u32 a = 0;
+ __builtin_memset (1 + (char *) &b, 0, 2);
+ __builtin_memcpy (&a, 2 + (char *) &b, 2);
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ if (a != 0x00000200)
+#else
+ if (a != 0x00020000)
+#endif
+ __builtin_abort();
+ return 0;
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index f12c9dd..5b0460d 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1818,7 +1818,8 @@ vn_walk_cb_data::push_partial_def (const pd_data &pd, tree vuse,
if (TREE_CODE (pd.rhs) == CONSTRUCTOR)
/* Empty CONSTRUCTOR. */
memset (buffer + MAX (0, pd.offset),
- 0, MIN ((HOST_WIDE_INT)sizeof (buffer), pd.size));
+ 0, MIN ((HOST_WIDE_INT)sizeof (buffer),
+ pd.size + MIN (0, pd.offset)));
else
{
unsigned pad = 0;