[Bug libgomp/49965] libgomp.c++/reduction-4.C and libgomp.c++/task-8.C FAIL on Solaris 11/SPARC

ro at CeBiTec dot Uni-Bielefeld.DE gcc-bugzilla@gcc.gnu.org
Tue Aug 9 15:10:00 GMT 2011


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

--- Comment #6 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot Uni-Bielefeld.DE> 2011-08-09 15:10:25 UTC ---
> --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-08-03 16:37:36 UTC ---
> So what values it printed?  Did it print -2.0 and 9.0 in some iterations?
> The final merging is done in a critical section between GOMP_atomic_start and
> GOMP_atomic_end, perhaps you can put a breakpoint in there and watch how the
> values are merged using the MIN_EXPR.
> Can you reproduce the failure with OMP_NUM_THREADS=1 BTW?

I think there's a code generation bug here: I could reduce the example
to a considerably smaller testcase (red-4.C, attached), which still
fails with OMP_NUM_THREADS=1.

Between GOMP_atomic_start and GOMP_atomic_end, there's a single call to
_Q_fle (-2, 1024), which correctly returns 1 (i.e. first arg <= second).

With g++ -mcpu=v9 -fopenmp -O3 red-4.c -lm, I get this code sequence:

    ldd    [%i0], %f8    %i1
    ldd    [%i0+8], %f10
    ldd    [%fp-48], %f12    %i0
    ldd    [%fp-40], %f14
    std    %f12, [%fp-16]    %i0
    std    %f14, [%fp-8]
    std    %f8, [%fp-32]    %i1
    std    %f10, [%fp-24]
    std    %f8, [%fp-56]    %i1
    std    %f10, [%fp-64]
    add    %fp, -16, %o0    %i0 <= %i1
    call    _Q_fle, 0
     add    %fp, -32, %o1
    cmp    %o0, 0        1 on true, 0 on false
    ldd    [%fp-56], %f8    %i1
    ldd    [%fp-64], %f10
    ldd    [%fp-48], %f12    %i0
    ldd    [%fp-40], %f14
    fmovdle    %icc, %f12, %f8        on <= 0 (false): %i0 -> %i1
    fmovdle    %icc, %f14, %f10
    std    %f8, [%i0]    return %i1
    std    %f10, [%i0+8]

I think the fmovdle is wrong: if _Q_fle returns 1 (<=), the first arg
should be returned, but it's the other way round.

    Rainer



More information about the Gcc-bugs mailing list