From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 52474 invoked by alias); 28 Aug 2017 11:41:34 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 52458 invoked by uid 89); 28 Aug 2017 11:41:32 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-11.1 required=5.0 tests=BAYES_00,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 28 Aug 2017 11:41:30 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id BBEA4AB1E for ; Mon, 28 Aug 2017 11:41:28 +0000 (UTC) Date: Mon, 28 Aug 2017 12:11:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix PR81977 Message-ID: User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-SW-Source: 2017-08/txt/msg01570.txt.bz2 The following fixes a failure to account for lhs_offset (or rather to consistently use the same offset in op0 and off). Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2017-08-28 Richard Biener PR tree-optimization/81977 * tree-ssa-sccvn.c (vn_reference_lookup_3): Fix look through memcpy. * g++.dg/torture/pr81977.C: New testcase. Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 251377) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -2334,7 +2334,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree 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); Index: gcc/testsuite/g++.dg/torture/pr81977.C =================================================================== --- gcc/testsuite/g++.dg/torture/pr81977.C (nonexistent) +++ gcc/testsuite/g++.dg/torture/pr81977.C (working copy) @@ -0,0 +1,55 @@ +/* { dg-do run } */ +/* { dg-require-effective-target int32plus } */ + +#include + +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; +}