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

--- Comment #6 from Rimvydas (RJ) <rimvydas.jas at gmail dot com> ---
Additional reduced testcase.

$ cat bar.F90
subroutine bar()
  implicit none
  character(len=80) :: base
#ifdef V1
  character(len=80),parameter :: f='longname_patterns.xml'
  integer,parameter :: k = len_trim(f)
#else
# ifdef V2
  character(len=80),parameter :: f='longname_patterns.xml'
# else
  character(len=80) :: f='longname_patterns.xml'
# endif
  integer :: k
  k = len_trim(f)
#endif
  base = f(10:k-4)
  print *, base, '@'
end subroutine bar

$ gfortran -DV1 -flto -O0 -Wall -Wextra -c bar.F90
$ gcc -shared bar.o -o libbar.so -fdump-tree-optimized
$ gfortran -DV2 -flto -O1 -Wall -Wextra -c bar.F90
$ gcc -shared bar.o -o libbar.so -fdump-tree-optimized
$ gfortran -DV2 -flto -O0 -Wall -Wextra -c bar.F90
$ gcc -shared bar.o -o libbar.so -fdump-tree-optimized
bar.F90: In function ‘bar’:
bar.F90:16:18: warning: ‘__builtin_memmove’ reading 80 bytes from a region of
size 71 [-Wstringop-overread]
   16 |   base = f(10:k-4)
      |                  ^
$ gfortran -flto -O3 -Wall -Wextra -c bar.F90
$ gcc -shared bar.o -o libbar.so -fdump-tree-optimized
bar.F90: In function ‘bar’:
bar.F90:16:18: warning: ‘__builtin_memcpy’ reading 80 bytes from a region of
size 71 [-Wstringop-overread]
   16 |   base = f(10:k-4)
      |                  ^
bar.F90:11:24: note: at offset 9 into source object ‘f’ of size 80
   11 |   character(len=80) :: f='longname_patterns.xml'
      |

V1 -O0 has:
  __builtin_memcpy (&base, &"longname_patterns.xml                             
                             "[10]{lb: 1 sz: 1}, 8);
  _1 = &base + 8;
  __builtin_memset (_1, 32, 72);

V2 -O0 has:
  unsigned char base[1:80];
  k_10 = 21;
  _1 = k_10 + -4;
  _11 = (long int) _1;
  _2 = _11 + -9;
  _12 = MAX_EXPR <_2, 0>;                < --- discarded ?
  _3 = _11 + -9;
  _13 = MAX_EXPR <_3, 0>;
  _14 = &base;
  _15 = &"longname_patterns.xml                                                
          "[10]{lb: 1 sz: 1};
  if (_13 <= 79)                         < --- will always be false
    goto <bb 3>; [INV]
  else
    goto <bb 4>; [INV]
  <bb 3> :
  _4 = (long unsigned int) _13;
  __builtin_memmove (_14, _15, _4);
  _5 = 80 - _13;
  _6 = (long unsigned int) _5;
  _7 = (sizetype) _13;
  _8 = _14 + _7;
  __builtin_memset (_8, 32, _6);
  goto <bb 5>; [INV]
  <bb 4> :
  __builtin_memmove (_14, _15, 80);


V3 -O3 has:
  static unsigned char f[1:80] = <<< error >>>;
  _1 = _gfortran_string_len_trim (80, &f);
  k_10 = (int) _1;
  _2 = k_10 + -4;
  if (_2 <= 88)                         < --- no lower bound and redundant
    goto <bb 3>; [50.00%]
  else
    goto <bb 4>; [50.00%]
  <bb 3> [local count: 536870913]:
  _11 = (long int) _2;
  _3 = _11 + -9;
  _12 = MAX_EXPR <_3, 0>;
  _4 = (long unsigned int) _12;
  __builtin_memcpy (&base, &f[10]{lb: 1 sz: 1}, _4);
  _5 = 80 - _12;
  _6 = (long unsigned int) _5;
  _7 = &base + _4;
  __builtin_memset (_7, 32, _6);
  goto <bb 5>; [100.00%]
  <bb 4> [local count: 536870913]:
  __builtin_memcpy (&base, &f[10]{lb: 1 sz: 1}, 80)

Reply via email to