From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 23512 invoked by alias); 21 Feb 2003 21:36:01 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 23418 invoked by uid 71); 21 Feb 2003 21:36:01 -0000 Resent-Date: 21 Feb 2003 21:36:01 -0000 Resent-Message-ID: <20030221213601.23417.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, wlp@ll.mit.edu Received: (qmail 22724 invoked by uid 48); 21 Feb 2003 21:34:38 -0000 Message-Id: <20030221213438.22723.qmail@sources.redhat.com> Date: Fri, 21 Feb 2003 21:36:00 -0000 From: wlp@ll.mit.edu Reply-To: wlp@ll.mit.edu To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: optimization/9794: Problem with -O2 on solaris causing variables to be overwritten X-SW-Source: 2003-02/txt/msg01085.txt.bz2 List-Id: >Number: 9794 >Category: optimization >Synopsis: Problem with -O2 on solaris causing variables to be overwritten >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Fri Feb 21 21:36:01 UTC 2003 >Closed-Date: >Last-Modified: >Originator: Will Pughe >Release: Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2/specs >Organization: >Environment: SunOS 5.8 Generic_108528-12 sun4u sparc SUNW,Sun-Fire-280R >Description: We have a library that packs a float into a character array, then unpacks it later. The values of the float were coming out wrong when compiled with -O2. If a value of 999.9 is packed in, a value of 0 comes out. This code worked on all previous versions of g++, and works on g++3.2 for linux, redhat 8.0. The command line used is: g++ -O2 prog.C -o prog -Wall No warnings are reported. The output is fval 999.9 fval 0 The output should be fval 999.9 fval 999.9 >How-To-Repeat: #include using namespace std; static char *buf; static char *bufPtr; void pack( float fval ) { // Following are volatile to prevent optimizers from reusing the // allocated stack space for other purposes following the last // direct reference to the address of the float value. (The g++ 3.2 // optimizer apparently gets faked out by the cast of the float address // to an int address, and thinks the float address is free for reuse // prior to the underlying bits actually being packed into the buffer) // volatile float fvalTmp = fval; // volatile int *ival = (volatile int *)&fvalTmp; int *ival = (int *)&fval; *bufPtr++ = (*ival >> 24) & 0xff; *bufPtr++ = (*ival >> 16) & 0xff; *bufPtr++ = (*ival >> 8) & 0xff; *bufPtr++ = *ival & 0xff; } void unpack( float& val ) { int ival ; ival = *bufPtr++ << 24 ; ival |= (*bufPtr++ << 16) & 0x00ff0000; ival |= (*bufPtr++ << 8) & 0x0000ff00; ival |= (*bufPtr++ & 0xff); val = *((float *)&ival); } int main(int argc, char **argv ) { buf = new char[4]; bufPtr = buf; float fval( 999.9 ); cerr << "fval " << fval << endl; pack( fval ); bufPtr = buf; unpack( fval ); cerr << "fval " << fval << endl; } >Fix: To fix the problem, uncomment the two volatile declarations in the pack function, and comment out the next int declaration. >Release-Note: >Audit-Trail: >Unformatted: Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls Thread model: posix gcc version 3.2