Bug 11618

Summary: Floating point values not reproduced at -O3 with a simple C++ copy constructor.
Product: gcc Reporter: George T. Talbot <gtalbot>
Component: c++Assignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: gcc-bugs
Priority: P2    
Version: 3.2   
Target Milestone: 3.4.0   
Host: x86 linux Target: x86 linux
Build: Known to work:
Known to fail: Last reconfirmed:
Attachments: Small test case using the BOOST library.
The .ii file, which might be more useful.

Description George T. Talbot 2003-07-21 17:11:25 UTC
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.
Comment 1 George T. Talbot 2003-07-21 17:12:52 UTC
Created attachment 4445 [details]
Small test case using the BOOST library.

This is the C++ test case that I used to find the problem.
Comment 2 George T. Talbot 2003-07-21 17:14:43 UTC
Created attachment 4446 [details]
The .ii file, which might be more useful.

This is the .ii file from compiling the above file at -O3.
Comment 3 Andrew Pinski 2003-07-21 17:28:49 UTC
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 ***
Comment 4 George T. Talbot 2003-07-21 17:34:20 UTC
This is not a rounding issue.  The floating point values are not getting copied.
 There are no math operations that occur here.
Comment 5 George T. Talbot 2003-07-21 17:37:05 UTC
I just tested this with -ffloat-store and the program still fails to produce the
correct result.
Comment 6 George T. Talbot 2003-07-21 17:39:19 UTC
Also, if you edit bug.cc to print out q before z is initialized, then z will be
initialized correctly.
Comment 7 Andrew Pinski 2003-07-21 17:42:40 UTC
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
Comment 8 GCC Commits 2005-02-22 03:13:49 UTC
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