Currently, string assignments are done via calls to _gfortran_copy_string,
which is a simple wrapper around memmove/memset:

void
copy_string (GFC_INTEGER_4 destlen, char * dest,
             GFC_INTEGER_4 srclen, const char * src)
{
  if (srclen >= destlen)
    {
      /* This will truncate if too long.  */
      memmove (dest, src, destlen);
    }
  else
    {
      memmove (dest, src, srclen);
      /* Pad with spaces.  */
      memset (&dest[srclen], ' ', destlen - srclen);
    }
}


With this implementation, AERMOD (from polyhedron benchmark) spends most of its
time in calls to memmove/memset. If the above code is directly emitted by the
front-end, I measure on i686-linux a 27% improvement in execution time with the
following options:
  gfortran -march=pentium4 -ffast-math -funroll-loops -O3 aermod.f90


-- 
           Summary: Calling libgfortran's copy_string is inefficient
           Product: gcc
           Version: 4.2.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: fxcoudert at gcc dot gnu dot org


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

Reply via email to