https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103585
Jan Hubicka <hubicka at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Last reconfirmed| |2021-12-07 Status|UNCONFIRMED |NEW --- Comment #3 from Jan Hubicka <hubicka at gcc dot gnu.org> --- perdida modref summary is: loads: Every base stores: Every base Side effects Nondeterministic Global memory read Global memory written parm 0 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 1 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 2 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 3 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 4 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 5 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 6 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 7 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 8 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 9 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape no_indirect_read parm 10 flags: no_direct_clobber no_direct_escape no_indirect_escape parm 11 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 12 flags: no_direct_clobber no_direct_escape no_indirect_escape parm 13 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape parm 14 flags: no_direct_escape no_indirect_escape parm 15 flags: no_direct_clobber no_direct_escape no_indirect_escape parm 16 flags: no_direct_escape no_indirect_escape parm 17 flags: no_direct_escape no_indirect_escape parm 18 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape no_indirect_read parm 19 flags: no_direct_clobber no_indirect_clobber no_direct_escape no_indirect_escape __attribute__((fn spec (". r r r r r r r r r r w r w r w w w w r r "))) So we do can not use it to optimize out the dead parameters. The reason is that it calls to dt_parm.237.common.filename = &"fatigue2.f90"[1]{lb: 1 sz: 1}; dt_parm.237.common.line = 1010; MEM <vector(2) integer(kind=4)> [(integer(kind=4) *)&dt_parm.237] = { 128, 6 }; _gfortran_st_write (&dt_parm.237); _gfortran_transfer_character_write (&dt_parm.237, &"discriminant is negative in perdida, abort."[1]{lb: 1 sz: 1}, 43); _gfortran_st_write_done (&dt_parm.237); dt_parm.237 ={v} {CLOBBER}; _gfortran_stop_string (0B, 0, 0); and fortran i/o has no useful fnspec on it so we think it access everything. To optimize out the initializer we could (I guess) 1) teach ipa-cp to turn the one remaining field to scalar and then we will detect the descriptor as non-escaping from MAIN and optimize it out 2) teach PTA summary of ipa-modref to be expressive enough to make PTA to work this out. -fipa-pta does not help (but I think it could if it worked well). We get: <bb 69> [local count: 109362591]: _1895 = (unsigned long) _44; _1894 = _1895 + ivtmp.1050_1911; _246 = (real(kind=8) *) _1894; parm.326.data = _246; parm.326.offset = -4; parm.326.dtype.elem_len = 8; MEM <unsigned long> [(void *)&parm.326 + 24B] = 3307124817920; parm.326.span = 8; parm.326.dim[0].stride = 1; parm.326.dim[0].lbound = 1; parm.326.dim[0].ubound = 3; parm.326.dim[1].stride = 3; parm.326.dim[1].lbound = 1; parm.326.dim[1].ubound = 3; _1883 = (unsigned long) _33; _1882 = _1883 + ivtmp.1050_1911; _247 = (real(kind=8) *) _1882; parm.327.data = _247; parm.327.offset = -4; parm.327.dtype.elem_len = 8; MEM <unsigned long> [(void *)&parm.327 + 24B] = 3307124817920; parm.327.span = 8; parm.327.dim[0].stride = 1; parm.327.dim[0].lbound = 1; parm.327.dim[0].ubound = 3; parm.327.dim[1].stride = 3; parm.327.dim[1].lbound = 1; parm.327.dim[1].ubound = 3; _1881 = (unsigned long) _56; _1880 = _1881 + ivtmp.1050_1911; _248 = (real(kind=8) *) _1880; parm.328.data = _248; parm.328.offset = -4; parm.328.dtype.elem_len = 8; MEM <unsigned long> [(void *)&parm.328 + 24B] = 3307124817920; parm.328.span = 8; parm.328.dim[0].stride = 1; parm.328.dim[0].lbound = 1; parm.328.dim[0].ubound = 3; parm.328.dim[1].stride = 3; parm.328.dim[1].lbound = 1; parm.328.dim[1].ubound = 3; _1879 = (unsigned long) _20; _1878 = _1879 + ivtmp.1050_1911; _249 = (real(kind=8) *) _1878; parm.329.data = _249; parm.329.offset = -4; parm.329.dtype.elem_len = 8; MEM <unsigned long> [(void *)&parm.329 + 24B] = 3307124817920; parm.329.span = 8; parm.329.dim[0].stride = 1; parm.329.dim[0].lbound = 1; parm.329.dim[0].ubound = 3; parm.329.dim[1].stride = 3; parm.329.dim[1].lbound = 1; parm.329.dim[1].ubound = 3; _1867 = (unsigned long) _67; _1866 = _1867 + ivtmp.1050_1911; _250 = (real(kind=8) *) _1866; parm.330.data = _250; parm.330.offset = -4; parm.330.dtype.elem_len = 8; MEM <unsigned long> [(void *)&parm.330 + 24B] = 3307124817920; parm.330.span = 8; parm.330.dim[0].stride = 1; parm.330.dim[0].lbound = 1; parm.330.dim[0].ubound = 3; parm.330.dim[1].stride = 3; parm.330.dim[1].lbound = 1; parm.330.dim[1].ubound = 3; _251 = (real(kind=8) *) ivtmp.1049_1915; _252 = (real(kind=8) *) ivtmp.1048_1925; _253 = (real(kind=8) *) ivtmp.1047_1936; perdida.constprop (&dt, &lambda, &mu, &yield_stress, &r_infinity, &b, &x_infinity, &gamma, &eta, &plastic_strain_threshold, &parm.326, &parm.327, &parm.328, &parm.329, _253, &parm.330, _252, _251, &failure_threshold, &crack_closure_parameter); parm.326 ={v} {CLOBBER}; parm.327 ={v} {CLOBBER}; parm.328 ={v} {CLOBBER}; parm.329 ={v} {CLOBBER}; parm.330 ={v} {CLOBBER};