[email protected] asks for the compilation options that I used
in my report of floating-point test failures of the new opencc version
4.2.4 in the features-1.2.1 tests. Here is what I used:
opencc -g -O2
I just reran the tests with multiple optimization levels on IA-32:
% foreach f ( "" -g -O1 -O2 -O3 -Ofast )
foreach? echo ===== $f ; opencc $f inf.c && ./a.out | grep WRONG
foreach? end
=====
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
===== -g
===== -O1
===== -O2
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
===== -O3
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
===== -Ofast
!IsNaN(Inf - Inf): WRONG
!IsNaN(Inf - Inf): WRONG
!IsNaN(Inf - Inf): WRONG
Thus, behavior is correct only with -g or -O1. All others produce
errors, and -Ofast produces different errors than the others.
For the NaN tests, I get
=====
===== -g
===== -O1
===== -O2
===== -O3
===== -Ofast
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
A check of the generated code from -O1 and -Ofast shows the problem:
the correctly working code uses a run-time comparison, but the the
code from -Ofast has no comparisons, and that is ALWAYS WRONG behavior
for floating-point arithmetic if operands can be NaNs (which should
always be assumed, unless both are finite compile-time constants).
The signed zero tests pass with all six optimization choices on IA-32.
The same experiment on AMD64 produced this output:
=====
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
===== -g
===== -O1
===== -O2
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
===== -O3
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
===== -Ofast
!IsNaN(Inf - Inf): WRONG
!IsNaN(Inf - Inf): WRONG
!IsNaN(Inf - Inf): WRONG
For the NaN tests, I get:
=====
===== -g
===== -O1
===== -O2
===== -O3
===== -Ofast
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
For the signed zero test that failed on AMD64, all optimization levels
produce errors:
% foreach f ( "" -g -O1 -O2 -O3 -Ofast )
foreach? echo ===== $f ; opencc $f zero.c && ./a.out | grep WRONG
foreach? end
=====
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
===== -g
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
===== -O1
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
===== -O2
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
===== -O3
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
===== -Ofast
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
I do not yet have the 4.2.4 compiler working on IA-64, but for the
older 4.2.3 version, here is what I get on that architecture:
% foreach f ( "" -g -O1 -O2 -O3 -Ofast )
foreach? echo ===== $f ; opencc $f inf.c && ./a.out | grep WRONG
foreach? end
=====
be(4897): unaligned access to 0x600000000003e564, ip=0x200000000010e170
be(4897): unaligned access to 0x600000000003e58c, ip=0x200000000010e170
be(4897): unaligned access to 0x600000000003e5dc, ip=0x200000000010e130
be(4897): unaligned access to 0x600000000003e5ec, ip=0x200000000010e130
be(4897): unaligned access to 0x600000000003e614, ip=0x200000000010e170
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
===== -g
be(4927): unaligned access to 0x600000000003d874, ip=0x200000000010e170
be(4927): unaligned access to 0x600000000003d89c, ip=0x200000000010e170
be(4927): unaligned access to 0x600000000003d8ec, ip=0x200000000010e130
be(4927): unaligned access to 0x600000000003d8fc, ip=0x200000000010e130
be(4927): unaligned access to 0x600000000003d924, ip=0x200000000010e170
===== -O1
===== -O2
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
===== -O3
be(5030): unaligned access to 0x600000000003f984, ip=0x200000000010e170
be(5030): unaligned access to 0x600000000003f9ac, ip=0x200000000010e170
be(5030): unaligned access to 0x600000000003f9fc, ip=0x200000000010e130
be(5030): unaligned access to 0x600000000003fa0c, ip=0x200000000010e130
be(5030): unaligned access to 0x600000000003fa34, ip=0x200000000010e170
!IsNaN(Inf - Inf): WRONG
!IsNaN(Inf - Inf): WRONG
(-Inf > 0.0): WRONG
(-Inf >= 0.0): WRONG
(0.0 <= -Inf): WRONG
(0.0 < -Inf): WRONG
!IsNaN(Inf - Inf): WRONG
===== -Ofast
be(5080): unaligned access to 0x600000000003e694, ip=0x200000000010e170
be(5080): unaligned access to 0x600000000003e6bc, ip=0x200000000010e170
be(5080): unaligned access to 0x600000000003e70c, ip=0x200000000010e130
be(5080): unaligned access to 0x600000000003e71c, ip=0x200000000010e130
be(5080): unaligned access to 0x600000000003e744, ip=0x200000000010e170
!IsNaN(Inf - Inf): WRONG
!IsNaN(Inf - Inf): WRONG
!IsNaN(Inf - Inf): WRONG
% foreach f ( "" -g -O1 -O2 -O3 -Ofast )
foreach? echo ===== $f ; opencc $f zero.c && ./a.out | grep WRONG
foreach? end
=====
be(5144): unaligned access to 0x600000000003e564, ip=0x200000000010e170
be(5144): unaligned access to 0x600000000003e58c, ip=0x200000000010e170
be(5144): unaligned access to 0x600000000003e5dc, ip=0x200000000010e130
be(5144): unaligned access to 0x600000000003e5ec, ip=0x200000000010e130
be(5144): unaligned access to 0x600000000003e614, ip=0x200000000010e170
+zero is signed WRONG
-zero is unsigned WRONG
0 - 0 is signed WRONG
(-0) - (+0) is unsigned WRONG
(+1)*(0) is signed WRONG
(-1)*(0) is unsigned WRONG
===== -g
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
===== -O1
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
===== -O2
+zero is signed WRONG
-zero is unsigned WRONG
0 - 0 is signed WRONG
(-0) - (+0) is unsigned WRONG
(+1)*(0) is signed WRONG
(-1)*(0) is unsigned WRONG
===== -O3
be(5276): unaligned access to 0x600000000003f984, ip=0x200000000010e170
be(5276): unaligned access to 0x600000000003f9ac, ip=0x200000000010e170
be(5276): unaligned access to 0x600000000003f9fc, ip=0x200000000010e130
be(5276): unaligned access to 0x600000000003fa0c, ip=0x200000000010e130
be(5276): unaligned access to 0x600000000003fa34, ip=0x200000000010e170
+zero is signed WRONG
-zero is unsigned WRONG
0 - 0 is signed WRONG
(-0) - (+0) is unsigned WRONG
(+1)*(0) is signed WRONG
(-1)*(0) is unsigned WRONG
===== -Ofast
-zero is unsigned WRONG
(-0) - (+0) is unsigned WRONG
(-1)*(0) is unsigned WRONG
% foreach f ( "" -g -O1 -O2 -O3 -Ofast )
foreach? echo ===== $f ; opencc $f nan.c && ./a.out | grep WRONG
foreach? end
=====
be(5389): unaligned access to 0x600000000003e564, ip=0x200000000010e170
be(5389): unaligned access to 0x600000000003e58c, ip=0x200000000010e170
be(5389): unaligned access to 0x600000000003e5dc, ip=0x200000000010e130
be(5389): unaligned access to 0x600000000003e5ec, ip=0x200000000010e130
be(5389): unaligned access to 0x600000000003e614, ip=0x200000000010e170
===== -g
===== -O1
===== -O2
===== -O3
be(5522): unaligned access to 0x600000000003f984, ip=0x200000000010e170
be(5522): unaligned access to 0x600000000003f9ac, ip=0x200000000010e170
be(5522): unaligned access to 0x600000000003f9fc, ip=0x200000000010e130
be(5522): unaligned access to 0x600000000003fa0c, ip=0x200000000010e130
be(5522): unaligned access to 0x600000000003fa34, ip=0x200000000010e170
===== -Ofast
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
(NaN == NaN): WRONG
(NaN <= NaN): WRONG
(NaN >= NaN): WRONG
(NaN == 0.0): WRONG
(NaN <= 0.0): WRONG
(NaN >= 0.0): WRONG
(0.0 == NaN): WRONG
(0.0 <= NaN): WRONG
(0.0 >= NaN): WRONG
The many unaligned access errors are bothersome, and they also produce
reports in /var/log/messages.
-------------------------------------------------------------------------------
- Nelson H. F. Beebe Tel: +1 801 581 5254 -
- University of Utah FAX: +1 801 581 4148 -
- Department of Mathematics, 110 LCB Internet e-mail: [email protected] -
- 155 S 1400 E RM 233 [email protected] [email protected] -
- Salt Lake City, UT 84112-0090, USA URL: http://www.math.utah.edu/~beebe/ -
-------------------------------------------------------------------------------
------------------------------------------------------------------------------
Forrester Wave Report - Recovery time is now measured in hours and minutes
not days. Key insights are discussed in the 2010 Forrester Wave Report as
part of an in-depth evaluation of disaster recovery service providers.
Forrester found the best-in-class provider in terms of services and vision.
Read this report now! http://p.sf.net/sfu/ibm-webcastpromo
_______________________________________________
Open64-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/open64-devel