https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96535
--- Comment #1 from Hongtao.liu <crazylht at gmail dot com> ---
for cmdline option, it's handled in process_options which will enable
flag_cunroll_grow_size which is the real effective flag to unroll the loop in
testcase.
cut from toplev.c
---
/* Unrolling all loops implies that standard loop unrolling must also
be done. */
if (flag_unroll_all_loops)
flag_unroll_loops = 1;
/* Allow cunroll to grow size accordingly. */
if (flag_cunroll_grow_size == AUTODETECT_VALUE)
flag_cunroll_grow_size
= flag_unroll_loops || flag_peel_loops || optimize >= 3;
/* web and rename-registers help when run after loop unrolling. */
if (flag_web == AUTODETECT_VALUE)
flag_web = flag_unroll_loops;
if (flag_rename_registers == AUTODETECT_VALUE)
flag_rename_registers = flag_unroll_loops;
---
But for attribute ((optimize ("unroll-loops")))
it's handled in handle_optimize_attribute which doesn't enable
flag_cunroll_grow_size.