I'm attaching a test file, plus the .ii file, which demonstrates a case where at -O3, the compiler generates code that doesn't properly initialize floating point values in a user-defined copy constructor.
Created attachment 4445 [details] Small test case using the BOOST library. This is the C++ test case that I used to find the problem.
Created attachment 4446 [details] The .ii file, which might be more useful. This is the .ii file from compiling the above file at -O3.
From bug 323 (of which this is a dup of): See any faq on numerical analysis that mentions the x86. You are seeing the results of excess precision in the FPU. Either change the rounding precision in the FPCR, or work around the problem with -ffloat-store. *** This bug has been marked as a duplicate of 323 ***
This is not a rounding issue. The floating point values are not getting copied. There are no math operations that occur here.
I just tested this with -ffloat-store and the program still fails to produce the correct result.
Also, if you edit bug.cc to print out q before z is initialized, then z will be initialized correctly.
One you are using a prerelease of 3.2 from redhat (report it to them). Second I cannot reproduce it on 3.2.3, 3.2.2 or 3.3.1 (20030707) (so update your compiler): (3_2 = 3.2.3, 3_3 = 3.3.1) tin:~/src/gnu/gcctest/pr11618>~/ia32_linux_gcc3_3/bin/g++ -O3 pr11618.ii tin:~/src/gnu/gcctest/pr11618>./a.out R1=-0.317785 R2=0.347851 R3=-0.0181945 R4=0.881862 tin:~/src/gnu/gcctest/pr11618>~/ia32_linux_gcc3_3/bin/g++ pr11618.ii tin:~/src/gnu/gcctest/pr11618>./a.out R1=-0.317785 R2=0.347851 R3=-0.0181945 R4=0.881862 tin:~/src/gnu/gcctest/pr11618>~/ia32_linux_gcc3_2/bin/g++ pr11618.ii tin:~/src/gnu/gcctest/pr11618>./a.out R1=-0.317785 R2=0.347851 R3=-0.0181945 R4=0.881862 tin:~/src/gnu/gcctest/pr11618>~/ia32_linux_gcc3_2/bin/g++ pr11618.ii -O3 tin:~/src/gnu/gcctest/pr11618>./a.out R1=-0.317785 R2=0.347851 R3=-0.0181945 R4=0.881862 tin:~/src/gnu/gcctest/pr11618>~/ia32_linux_gcc3_2_2/bin/g++ pr11618.ii -O3 tin:~/src/gnu/gcctest/pr11618>./a.out R1=-0.317785 R2=0.347851 R3=-0.0181945 R4=0.881862
Subject: Bug 11618 CVSROOT: /cvs/gcc Module name: gcc Changes by: bryce@gcc.gnu.org 2005-02-22 03:13:35 Modified files: libjava : ChangeLog libjava/gcj : method.h libjava/java/io: ObjectInputStream.java ObjectStreamField.java VMObjectStreamClass.java natObjectInputStream.cc natVMObjectStreamClass.cc ObjectOutputStream.java libjava/java/lang/reflect: Field.java natField.cc Log message: 2005-02-21 Bryce McKinlay <mckinlay@redhat.com> Merge serialization from GNU Classpath. * gcj/method.h: Add missing #includes. * java/io/ObjectInputStream.java (readClassDescriptor): Check for primitive class IDs on the stream here... (resolveClass): ...not here. * java/io/ObjectStreamField.java: Use VMObjectStream class calls to set fields. * java/io/VMObjectStreamClass.java (setDoubleNative, setFloatNative, setLongNative, setIntNative, setShortNative, setCharNative, setByteNative, setBooleanNative, setObjectNative): New native methods. * java/io/natVMObjectStreamClass.java (setDoubleNative, setFloatNative, setLongNative, setIntNative, setShortNative, setCharNative, setByteNative, setBooleanNative, setObjectNative): Implement them. * java/io/natObjectInputStream.cc (allocateObject): Add new parameters from Classpath's version. Use _Jv_FromReflectedConstructor(). Call the constructor here. (callConstructor): Removed. (getCallersClassLoader): Removed. * java/lang/reflect/Field.java (setByte, setShort, setInt, setLong, setFloat, setDouble, setChar, setBoolean): Add 'checkFinal' parameter to control whether setting final field values is permitted. Call getAddr() with checkFinal parameter instead of setAddr(). * java/lang/reflect/natField.cc (getType): Lookup and resolve field only if not done already. (getAddr): Add checkFinal parameter. Do the final field check only if checkFinal is set. (setAddr): Removed. 2005-02-21 Mark Wielaard <mark@klomp.org> # Fixes bug #11957 * java/io/ObjectInputStream.java (resolveClass): Don't check "void" twice. 2005-02-21 Mark Wielaard <mark@klomp.org> Fixes bug #11618. * java/io/ObjectInputStream.java (readClassDescriptor): Handle classes without a super class and us ObjectStreamClass.lookupForClassObject(). (resolveClass): Check for primitive types. (lookupClass): Return null when argument is null. 2005-02-21 Jeroen Frijters <jeroen@frijters.net> * java/io/ObjectInputStream.java (readObject): Fix to consume TC_ENDBLOCKDATA after readExternal. 2005-02-21 Jeroen Frijters <jeroen@frijters.net> * java/io/ObjectOutputStream.java (writeObject, callWriteMethod): Replaced reflection with accessing cached info in ObjectStreamClass. (getMethod): Removed. * java/io/ObjectStreamClass.java (findMethod): Added check to make sure the method found has the right modifiers. (cacheMethods): Added writeReplace and writeObject methods. (setFlags): Look at new writeObjectMethod field instead of doing reflection again. (writeReplaceMethod): New field. (writeObjectMethod): New field. 2005-02-21 Guilhem Lavaux <guilhem@kaffe.org> Jeroen Frijters <jeroen@frijters.net> * java/io/ObjectInputStream.java (newObject): Changed prototype. Get a constructor reflect object directly. (callConstructor): Removed. (allocateObject): Changed prototype. (readClassDescriptor): Build the constructor reflection directly. (readObject): Invoke newObject using the new prototype. * java/io/ObjectStreamClass.java (firstNonSerializableParent): Removed. (firstNonSerializableParentConstructor): Added. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/ChangeLog.diff?cvsroot=gcc&r1=1.3371&r2=1.3372 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/gcj/method.h.diff?cvsroot=gcc&r1=1.6&r2=1.7 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/io/ObjectInputStream.java.diff?cvsroot=gcc&r1=1.40&r2=1.41 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/io/ObjectStreamField.java.diff?cvsroot=gcc&r1=1.12&r2=1.13 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/io/VMObjectStreamClass.java.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/io/natObjectInputStream.cc.diff?cvsroot=gcc&r1=1.8&r2=1.9 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/io/natVMObjectStreamClass.cc.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/io/ObjectOutputStream.java.diff?cvsroot=gcc&r1=1.31&r2=1.32 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/lang/reflect/Field.java.diff?cvsroot=gcc&r1=1.9&r2=1.10 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/libjava/java/lang/reflect/natField.cc.diff?cvsroot=gcc&r1=1.16&r2=1.17