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

Reply via email to