Это в основном результат произвольной константы в источниках GCC.
GCC имеет внутренний параметр, который контролирует, сколько раз цикл предварительно развернут во время оптимизации:
/* The maximum number of iterations of a loop the brute force algorithm
for analysis of # of iterations of the loop tries to evaluate. */
DEFPARAM(PARAM_MAX_ITERATIONS_TO_TRACK,
"max-iterations-to-track",
"Bound on the number of iterations the brute force #"
" of iterations analysis algorithm evaluates.",
1000, 0, 0)
Это используется для анализа циклов, если GCC не имеет специальной логики для выполнения какого-либо алгебраического преобразования для получения счетчика итераций.
Если вы измените этот параметр на другое значение, переключение с результата на другое будетслучиться с другой магической ценностью.С вашим исходным значением 998 я получаю это:
$ gcc -O3 -fwrapv -S -o- --param max-iterations-to-track=997 t.c | grep jl
jl .L3
$ gcc -O3 -fwrapv -S -o- --param max-iterations-to-track=998 t.c | grep jl
jl .L3
$ gcc -O3 -fwrapv -S -o- --param max-iterations-to-track=999 t.c | grep jl
$ gcc -O3 -fwrapv -S -o- --param max-iterations-to-track=1000 t.c | grep jl
Эти параметры являются внутренней деталью реализации и могут изменить значение в любое время или полностью исчезнуть.
(Версия компилятора Iused, основанный на GCC 6.3, не использует эти векторные инструкции для неоптимизированного случая, но представляет собой последовательность с условным скачком jl
, и точка отсечения немного отличается, предположительно из-за других оптимизаций.)