The following fragment when compiled -O -ffinite-math-only on arm-linux-gnueabi
should print 0.000000 but with gcc-4.1.2, 4.2.4, 4.3.3 it prints 99999.000000

#include <stdio.h>

#define test_min(x,y)   ((x) >  (y) ? (y) : (x))

int
main (void)
{
        static float data [1];
        float min = 99999.0 ;

        min = test_min (min, data[0]) ;

        printf("min = %f\n", min);

        return min != 0.0 ;
}

This only happens for floats, not doubles. The main difference in the asm is
that without -ffinite-math-only (working) it goes
        mov     r0, r4
        ldr     r1, .L6+4
        bl      __aeabi_fcmplt
        cmp     r0, #0
        ldr     r3, .L6+4
        moveq   r4, r3
        mov     r0, r4
while with -ffinite-math-only (broken) it goes
        ldr     r5, .L5+4
        mov     r0, r4
        mov     r1, r5
        bl      __aeabi_fcmple
        cmp     r0, #0
        movgt   r4, r5
        mov     r0, r4
I guess that should be moveq.

This makes libvorbis fail on arm-linux-gnueabi when using softfloat.
See https://trac.xiph.org/ticket/1526 for a longer code example failing on
min() and max().


-- 
           Summary: -O -ffinite-math-only gets min(x,y) optimization wrong
                    for SF on arm-*-gnueabi
           Product: gcc
           Version: 4.3.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: martinwguy at yahoo dot it
GCC target triplet: arm-linux-gnueabi


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39501

Reply via email to