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
This commit is contained in:
Richard Biener 2017-08-28 11:42:23 +00:00 committed by Richard Biener
parent 5e5ccf0d20
commit 2aa8aa18a6
4 changed files with 67 additions and 1 deletions

View 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

View 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

View file

@ -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;
}

View 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);