http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01043.html

(This is with the SVN version of GCC and the -mrecip / rsqrt patch by Uros on
x86_64-unknown-linux-gnu.)

I don't know whether this a bug in the patch [for rsqrt] or only revealed by
the
patch, but the "aermod.f90" benchmark from Polyhedron
[http://www.polyhedron.co.uk/pb05/polyhedron_benchmark_suite.html] crashes here
at run time (segmentation fault) when compiled with

  gfortran -ffast-math -mrecip aermod.f90

Valgrind claims:
==16734== Conditional jump or move depends on uninitialised value(s)
==16734==    at 0x4BA046: numrise_ (aermod.f90:35497)
==16734==    by 0x4CBC05: prmdelh_ (aermod.f90:39786)
==16734==    by 0x41D06F: prmcalc_ (aermod.f90:6787)
[...]

The program does not crash without -mrecip.

 - - -

Uros answered:
http://gcc.gnu.org/ml/gcc-patches/2007-06/msg01044.html

gdb points to the top of:

Dump of assembler code from 0x808a193 to 0x808a293:
   0x0808a193 <numrise_+8963>:     mov    0xffffaf8c(%ebp,%edx,4),%eax
   0x0808a19a <numrise_+8970>:     mov    %eax,0xfffffffc(%ebx,%ecx,4)
   0x0808a19e <numrise_+8974>:     mov    0xffff616c(%ebp,%edx,4),%eax
   0x0808a1a5 <numrise_+8981>:     mov    0x2c(%ebp),%edx
   0x0808a1a8 <numrise_+8984>:     mov    %eax,0xfffffffc(%edx,%ecx,4)
   0x0808a1ac <numrise_+8988>:     add    $0x1,%ecx


where %ebp points to zt. It looks that %edx (that has value of 12324
at the point of crash) got out of bounds. Index into the array (JN
(int) = RN (float)) is calculated from DELN variable, that is computed
using rcpss. DELN is equal to 4107.55908 in rcpss case and RN is
12325.6777. Perhaps the problem is, that index is constructed from FP
variable?

 [...]

Hm, I was referring to this part of numrise function:

! ---       Use sliding step-size to sample nearfield more frequently
           DELN = 2.*FLOAT(NN-NTR)/FLOAT(NTR*(NTR-1))
           RN = 0.0
           DO IN = 1 , NTR - 1
              RN = RN + 1.0 + (IN-1)*DELN
              JN = RN
              XTR(IN) = XT(JN)
              YTR(IN) = YT(JN)
              ZTR(IN) = ZT(JN)
              RTR(IN) = RT(JN)
           ENDDO 

 - - -

Note: valgrind shows now error for the version without -mrecip

With -mrecip and -bounds-check, one has:

At line 35436 of file aermod.f90
Fortran runtime error: Array reference out of bounds for array 'xt', lower
bound of dimension 1 exceeded

This is SUBROUTINE NUMRISE:
         DO IN = NBEG , NEND
! ---       Define coordinates of plume relative to bldg.-defined origin
            XBB = XT(IN-1) - XBADJ

No such error without bounds check.


-- 
           Summary: Crash (out of bounds) with converting real to integer
                    array index with -mrecip
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: burnus at gcc dot gnu dot org


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

Reply via email to