optimization/10258: byteswapping code fails in -O2
warren_baird@cimmetry.com
warren_baird@cimmetry.com
Fri Mar 28 22:56:00 GMT 2003
>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 <stdio.h>
#include <string.h>
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=
More information about the Gcc-bugs
mailing list