On Sat, Oct 16, 2021 at 8:24 PM Jan Hubicka via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Hi, > > > > FAIL: gfortran.dg/deferred_type_param_6.f90 -O1 execution test > > FAIL: gfortran.dg/deferred_type_param_6.f90 -Os execution test > Sorry for the breakage. This time it seems like bug in Fortran FE > which was previously latent: > > __attribute__((fn spec (". . R "))) > void subfunc (character(kind=1)[1:..__result] * & __result, integer(kind=8) * > .__result) > { > # PT = nonlocal > character(kind=1)[1:..__result] * & __result_3(D) = __result; > # PT = nonlocal null > integer(kind=8) * .__result_5(D) = .__result; > integer(kind=4) _1; > > <bb 2> [local count: 1073741824]: > *__result_3(D) = &fifec; > # USE = nonlocal escaped { D.4230 } (nonlocal, escaped) > _1 = _gfortran_compare_string (5, &fifec, 5, &"FIVEC"[1]{lb: 1 sz: 1}); > if (_1 != 0) > goto <bb 3>; [0.04%] > else > goto <bb 4>; [99.96%] > > <bb 3> [local count: 429496]: > # USE = nonlocal escaped null > # CLB = nonlocal escaped null > _gfortran_stop_numeric (10, 0); > > <bb 4> [local count: 1073312329]: > *.__result_5(D) = 5; > return; > } > > The fnspec ". . R " specifies that .__result is readonly however we > have: > *.__result_5(D) = 5; > > I am not sure I understand fortran FE well enough to figure out why > it is set so. The function is declared as: > > function subfunc() result(res) > character(len=:), pointer :: res > res => fifec > if (len(res) /= 5) STOP 9 > if (res /= "FIVEC") STOP 10 > end function subfunc > > and we indeed optimize load of the result: > - # USE = nonlocal escaped { D.4252 D.4254 } (nonlocal, escaped) > - # CLB = nonlocal escaped { D.4254 } (escaped) > + # USE = nonlocal escaped > + # CLB = { D.4254 } > subfunc (&pstr.5, &slen.4); > - .s2_34 = slen.4; > - # PT = nonlocal escaped null { D.4254 } (escaped) > - s2_35 = pstr.5; > pstr.5 ={v} {CLOBBER}; > > and I think tat is what breaks the testcase (I also verified that > ignoring the fnspec 'R' fixes it).
The FE code adding the fnspec probably fails to consider the separately passed length of the string result? Can you open a bugreport please? Richard. > Honza > > > > with GCC configured with > > > > ../../gcc/configure > > --prefix=/local/skpandey/gccwork/toolwork/gcc-bisect-master/master/r12-4457/usr > > --enable-clocale=gnu --with-system-zlib --with-demangler-in-ld > > --with-fpmath=sse --enable-languages=c,c++,fortran --enable-cet > > --without-isl --enable-libmpx x86_64-linux --disable-bootstrap > > > > To reproduce: > > > > $ cd {build_dir}/gcc && make check > > RUNTESTFLAGS="dg.exp=gfortran.dg/deferred_type_param_6.f90 > > --target_board='unix{-m32}'" > > $ cd {build_dir}/gcc && make check > > RUNTESTFLAGS="dg.exp=gfortran.dg/deferred_type_param_6.f90 > > --target_board='unix{-m32\ -march=cascadelake}'" > > $ cd {build_dir}/gcc && make check > > RUNTESTFLAGS="dg.exp=gfortran.dg/deferred_type_param_6.f90 > > --target_board='unix{-m64}'" > > $ cd {build_dir}/gcc && make check > > RUNTESTFLAGS="dg.exp=gfortran.dg/deferred_type_param_6.f90 > > --target_board='unix{-m64\ -march=cascadelake}'" > > > > (Please do not reply to this email, for question about this report, contact > > me at skpgkp2 at gmail dot com)