Hi, Nelson Would you please file a bug in https://bugs.open64.net
On Wed, Apr 13, 2011 at 8:00 AM, Nelson H. F. Beebe <be...@math.utah.edu> wrote: > cbergst...@pathscale.com 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: be...@math.utah.edu > - > - 155 S 1400 E RM 233 be...@acm.org be...@computer.org > - > - 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 > Open64-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/open64-devel > -- yongchong ------------------------------------------------------------------------------ Benefiting from Server Virtualization: Beyond Initial Workload Consolidation -- Increasing the use of server virtualization is a top priority.Virtualization can reduce costs, simplify management, and improve application availability and disaster protection. Learn more about boosting the value of server virtualization. http://p.sf.net/sfu/vmware-sfdev2dev _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel