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.