aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2017-08-28 11:42:23 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2017-08-28 11:42:23 +0000
commit2aa8aa18a66f7677a7f7c7e987e2435750bdc982 (patch)
tree5a5d946903692b9274a0e8c499d41b91891916eb /gcc
parent5e5ccf0d20b1104a1ec084f1de4dbbc312e9540e (diff)
downloadgcc-2aa8aa18a66f7677a7f7c7e987e2435750bdc982.zip
gcc-2aa8aa18a66f7677a7f7c7e987e2435750bdc982.tar.gz
gcc-2aa8aa18a66f7677a7f7c7e987e2435750bdc982.tar.bz2
re PR tree-optimization/81977 (Issue with inline memcpy with optimizations enabled)
2017-08-28 Richard Biener <rguenther@suse.de> PR tree-optimization/81977 * tree-ssa-sccvn.c (vn_reference_lookup_3): Fix look through memcpy. * g++.dg/torture/pr81977.C: New testcase. From-SVN: r251378
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr81977.C55
-rw-r--r--gcc/tree-ssa-sccvn.c2
4 files changed, 67 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c79a0e8..90063a6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-08-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/81977
+ * tree-ssa-sccvn.c (vn_reference_lookup_3): Fix look through
+ memcpy.
+
2017-08-28 Alexander Monakov <amonakov@ispras.ru>
PR target/80640
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a3687c4..2b5204e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-08-28 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/81977
+ * g++.dg/torture/pr81977.C: New testcase.
+
2017-08-28 Alexander Monakov <amonakov@ispras.ru>
PR target/80640
diff --git a/gcc/testsuite/g++.dg/torture/pr81977.C b/gcc/testsuite/g++.dg/torture/pr81977.C
new file mode 100644
index 0000000..a8c8ba0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr81977.C
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-require-effective-target int32plus } */
+
+#include <cstdint>
+
+typedef struct
+{
+ uint16_t x ;
+ uint16_t y ;
+ uint64_t z ;
+} __attribute__((packed, aligned(1))) TestMsgType;
+
+struct Payload
+{
+ uint16_t header_info[2];
+ TestMsgType _pref;
+ void Pack(uint8_t *buffer)
+ {
+ __builtin_memcpy(buffer, &_pref, sizeof(_pref));
+ }
+ void UnPack(uint8_t *buffer)
+ {
+ __builtin_memcpy(&_pref, buffer, sizeof(_pref));
+ }
+};
+
+
+struct Msg
+{
+ Payload _payload;
+ void Pack(uint8_t *buffer)
+ {
+ _payload.Pack(buffer);
+ }
+
+ void UnPack(uint8_t *buffer)
+ {
+ _payload.UnPack(buffer);
+ }
+};
+
+int main()
+{
+ uint8_t * buffer = new uint8_t [30];
+ Msg msg;
+ Msg msg1;
+ msg._payload._pref.x = 0xabcd;
+ msg._payload._pref.y = 0xa;
+ msg._payload._pref.z = 0x0001020304051617;
+ msg.Pack(&buffer[0]);
+ msg1.UnPack(&buffer[0]);
+ if (msg1._payload._pref.x != 0xabcd)
+ __builtin_abort ();
+ delete [] buffer;
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 19db44a..472ab0b 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -2334,7 +2334,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
memset (&op, 0, sizeof (op));
op.type = vr->type;
op.opcode = MEM_REF;
- op.op0 = build_int_cst (ptr_type_node, at - rhs_offset);
+ op.op0 = build_int_cst (ptr_type_node, at - lhs_offset + rhs_offset);
op.off = at - lhs_offset + rhs_offset;
vr->operands[0] = op;
op.type = TREE_TYPE (rhs);