https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77964
--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> --- (In reply to Jakub Jelinek from comment #7) > You don't need it for both. > struct builtin_fw *b_fw = __start_builtin_fw; > asm ("" : "+r" (b_fw)); > for (; b_fw != __end_builtin_fw; b_fw++) { > should be enough. And indeed, without that it is undefined behavior. You might want to do end only then instead of the start. Because in theory GCC could say it is always false as &__end_builtin_fw[-1] is undefined behavior too so GCC say if the initial value was not __end_builtin_fw[0] go into an infinite loop.