https://gcc.gnu.org/bugzilla/show_bug.cgi?id=38592

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #6 from kargl at gcc dot gnu.org ---
Sometime between 4.8.4 and 4.9.4, the _gfortran_compare_string
has been replaced by a memcmp().

% gfc48 -O3 -fdump-tree-optimized -S -fdump-tree-original a.f90
% grep compare a.s
        call    _gfortran_compare_string
% gfc49 -O3 -fdump-tree-optimized -S -fdump-tree-original a.f90
% grep compare a.s


With gcc7, the -fdump-tree-original gives

  __builtin_memmove ((void *) &a, (void *) &"yes"[1]{lb: 1 sz: 1}, 3);
  {
    struct __st_parameter_dt dt_parm.0;

    dt_parm.0.common.filename = &"a.f90"[1]{lb: 1 sz: 1};
    dt_parm.0.common.line = 4;
    dt_parm.0.common.flags = 128;
    dt_parm.0.common.unit = 6;
    _gfortran_st_write (&dt_parm.0);
    {
      logical(kind=4) D.3408;

      D.3408 = __builtin_memcmp ((void *) &"yes"[1]{lb: 1 sz: 1},
                                 (void *) &a, 3) == 0;
      _gfortran_transfer_logical_write (&dt_parm.0, &D.3408, 4);
    }
    _gfortran_st_write_done (&dt_parm.0);

and -fdump-tree-optimized shows

  <bb 2>:
  MEM[(c_char * {ref-all})&a] = "yes";
  dt_parm.0.common.filename = &"a.f90"[1]{lb: 1 sz: 1};
  dt_parm.0.common.line = 4;
  dt_parm.0.common.flags = 128;
  dt_parm.0.common.unit = 6;
  _gfortran_st_write (&dt_parm.0);
  _1 = __builtin_memcmp_eq (&"yes"[1]{lb: 1 sz: 1}, &a, 3);
  _2 = _1 == 0;
  D.3408 = _2;
  _gfortran_transfer_logical_write (&dt_parm.0, &D.3408, 4);
  D.3408 ={v} {CLOBBER};
  _gfortran_st_write_done (&dt_parm.0);
  dt_parm.0 ={v} {CLOBBER};
  a ={v} {CLOBBER};
  return;

I personally think this is non-issue now and the bug can be
closed.

Reply via email to