re PR tree-optimization/81977 (Issue with inline memcpy with optimizations enabled)
authorRichard Biener <rguenther@suse.de>
Mon, 28 Aug 2017 11:42:23 +0000 (11:42 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 28 Aug 2017 11:42:23 +0000 (11:42 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr81977.C [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index c79a0e856d5e12cb8846fe689b06b2c1c924f9bc..90063a608a0b9dcb86daa064d079811447083af9 100644 (file)
@@ -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
index a3687c49e3dc5b5146255c683ba999a91e34b9ab..2b5204ee26a01387d30362a407b9c811acb1a495 100644 (file)
@@ -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 (file)
index 0000000..a8c8ba0
--- /dev/null
@@ -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;
+}
index 19db44a3d4c52fcb011505ac8b70f49a12b9ef5c..472ab0b79580e2d2f0b516e10c779192f8d469b0 100644 (file)
@@ -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);