flang компилятор доказывает, что программа не зациклится 0.6.2 GitHub

Межмодульная оптимизация ускорила не только работу, но и сборку большого файла

Ожидание было такое: -flto даёт 1,03–1,60 раза в работе, а сборка становится дольше примерно вдвое — это и было доводом не включать флаг по умолчанию, а завести отдельную строку «собрать быстро» / «работать быстро».

Замер это ожидание опроверг на большом файле. Точка самораскрутки (bootstrap/, 6,2 МБ порождённого C) собирается:

make -j4
-O238,7 с
-O2 -flto17,7 с

То есть вдвое БЫСТРЕЕ, а не вдвое медленнее. Причина понятная: с -flto шаг cc -c перестаёт оптимизировать и становится дешёвым, а вся оптимизация уезжает на компоновку, где gcc режет программу на разделы и обрабатывает их параллельно. На маленькой программе выигрывать нечему, там разделов один, и плата за компоновку видна — там сборка и правда дороже.

Отсюда решение: флаг включён по умолчанию, а не спрятан в отдельную строку. Кому нужна быстрая сборка вместо быстрой работы — make CFLAGS='-std=c99 -O2', и это написано прямо в порождаемом Makefile.

Второе, что проверено, потому что об этом легко забыть: ar rcs строит указатель архива и с -flto (binutils с подключаемым модулем). Иначе напечатанная библиотека собиралась бы, а линковаться с ней было бы нельзя.

Поправка 20 августа 2026. Направление подтвердилось повторно, абсолютные числа — нет: точка раскрутки выросла с 6,2 МБ до 19,3 МБ, и на том же make -j4 вышло 93,7 с без LTO против 58,4 с с LTO. Отношение съехало с 2,2× на 1,6×. Числа ниже читать как «замер на точке в 6,2 МБ», а не как нынешнее состояние — см. building-the-binary-costs-a-minute-not-an-hour.

Чем подтверждено. Ветка work/skorost, коммит c903983. Времена — по /usr/bin/time -v на тихой машине, один прогон каждого варианта (разница вдвое много больше разброса прибора в 30 %). Сборка проходит с полным строгим набором -Werror -pedantic без единого предупреждения.

Чем ограничено. Числа сняты на gcc 15.2.0. У clang устройство LTO другое (ThinLTO против полного), и переносить эти времена на него нельзя.

Связано: type-inference-answers-with-a-node-mark, biggest-win-for-least-work