From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21223 invoked by alias); 28 Mar 2003 22:06:00 -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 21202 invoked by uid 71); 28 Mar 2003 22:06:00 -0000 Resent-Date: 28 Mar 2003 22:06:00 -0000 Resent-Message-ID: <20030328220600.21201.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, warren_baird@cimmetry.com Received: (qmail 18384 invoked by uid 48); 28 Mar 2003 21:58:32 -0000 Message-Id: <20030328215832.18383.qmail@sources.redhat.com> Date: Fri, 28 Mar 2003 22:14:00 -0000 From: warren_baird@cimmetry.com Reply-To: warren_baird@cimmetry.com To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: optimization/10258: byteswapping code fails in -O2 X-SW-Source: 2003-03/txt/msg02017.txt.bz2 List-Id: >Number: 10258 >Category: optimization >Synopsis: byteswapping code fails in -O2 >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: wrong-code >Submitter-Id: net >Arrival-Date: Fri Mar 28 22:06:00 UTC 2003 >Closed-Date: >Last-Modified: >Originator: Warren Baird >Release: gcc-3.2.2 >Organization: >Environment: Solaris 8 - Sparc >Description: We have macros to do byteswapping of integers, and we wrote a short function to use integer macros to swap a float. It works fine in -O0 or -O, but in -O2 it returns incorrect values. The byte swapping macros are a bit complex, so I've attached the preprocessor output as required, but I'll include the non-preprocessed output here - it may be easier to follow... #include #include typedef unsigned short WORD, *PWORD, *LPWORD; typedef unsigned long DWORD, *PDWORD, *LPDWORD; typedef float FLOAT, *PFLOAT; #define BYTESWAP_LO8(s) ((WORD)(s) & 0xff) #define BYTESWAP_HI8(s) (((WORD)(s) >> 8) & 0xff) #define BYTESWAP_WORD(s) ((WORD)((BYTESWAP_LO8(s) << 8) + (BYTESWAP_HI8(s)))) #define BYTESWAP_LO16(l) ((DWORD)(l) & 0xffff) #define BYTESWAP_HI16(l) (((DWORD)(l) >> 16) & 0xffff) #define BYTESWAP_DWORD(l) ((DWORD)(((BYTESWAP_WORD(BYTESWAP_LO16(l)) << 16) & 0xffff0000) + \ (((BYTESWAP_WORD(BYTESWAP_HI16(l))) & 0x0000ffff)))) FLOAT swapFLOAT(FLOAT f) { FLOAT ret; DWORD* pDW = (DWORD*)&ret; *pDW = BYTESWAP_DWORD(*(DWORD*)&f); return ret; } int main() { long foo = 0xfed80000; FLOAT f1 = 1.0; FLOAT sf1 = swapFLOAT(f1); printf("0x%08X 0x%08X\n", *(long *)&f1, *(long *)&sf1); return 0; } >How-To-Repeat: "g++ -O testfloat.cpp" gives the expected output: 0x3F800000 0x0000803F however, "g++ -O2 testfloat.cpp" gives the output: 0x3F800000 0x00000000 In our code, it seems to actually produce either 0, or occasionally a very large negative number. I wasn't able to repro this on an x86-linux box... >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/gzip; name="testfloat.ii.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="testfloat.ii.gz" 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 GDN4t2yQVv2JygT5AKBb0P8/XFHThr8mAAA=