From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9660 invoked by alias); 17 Jul 2009 07:49:36 -0000 Received: (qmail 9561 invoked by uid 48); 17 Jul 2009 07:49:22 -0000 Date: Fri, 17 Jul 2009 07:49:00 -0000 Message-ID: <20090717074922.9560.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug c/40757] gcc 4.4.0 miscompiles mpfr-2.4.1 In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "jakub at gcc dot gnu dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2009-07/txt/msg01410.txt.bz2 ------- Comment #17 from jakub at gcc dot gnu dot org 2009-07-17 07:49 ------- Try: typedef __SIZE_TYPE__ size_t; extern void *memset (void *, const void *, size_t); extern void abort (void); volatile size_t i = 0x80000000U, j = 0x80000000U; char buf[16]; int main (void) { if (sizeof (size_t) != 4) return 0; buf[0] = 6; memset (buf, 0, i + j); if (buf[0] != 6) abort (); return 0; } In 32-bit code, size_t is 32-bit, memset is called with buf, 0, 0 arguments, but the %o2 register passed to it doesn't contain 0, but 0x100000000. That is fine, this is 32-bit code, so the uppermost bits are always undefined. But when 32-bit memset uses brnz %o2, ... instruction, it needs to first zero-extend it to 64-bits, as brnz operates on all 64 bits only. Or not use brnz, but compare and be %icc, ... -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40757