https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80980
Roger Sayle <roger at nextmovesoftware dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Known to work| |14.1.0
CC| |roger at nextmovesoftware dot
com
Resolution|--- |FIXED
Known to fail| |13.4.0
Status|NEW |RESOLVED
--- Comment #2 from Roger Sayle <roger at nextmovesoftware dot com> ---
It looks like the loop is now is being eliminated (completely unrolled) with
mainline gfortran. According to godbolt.org this was fixed/resolved between
GCC 13.4 and GCC 14.1.
The -fdump-tree-optimized with -Os now shows a single basic block:
void MAIN__ ()
{
struct __st_parameter_dt dt_parm.0;
integer(kind=4) i;
<bb 2> [local count: 118111600]:
i = 1;
dt_parm.0.common.filename = &"pr80980.f90"[1]{lb: 1 sz: 1};
dt_parm.0.common.line = 4;
MEM <unsigned long> [(integer(kind=4) *)&dt_parm.0] = 25769803904;
_gfortran_st_write (&dt_parm.0);
_gfortran_transfer_integer_write (&dt_parm.0, &i, 4);
_gfortran_st_write_done (&dt_parm.0);
dt_parm.0 ={v} {CLOBBER(eos)};
i ={v} {CLOBBER(eos)};
return;
}
With current mainline I see (on x86_64):
size o1.o = 264 bytes
size os.o = 244 bytes
size oz.o = 240 bytes
So -Os is smaller (no larger) than -O1, as expected.
Likewise, -Oz is smaller (no larger) than -Os, as expected.