LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

вот довольно тривиальный код, в котором clang ставит проверки переполнения

clang вообще довольно плохой компилятор, но тут у тебя нету static или lto, я вот расширил шаги, и как видишь, компилятор понимает какие значения могут появится в step2, и не генерирует printf: https://godbolt.org/z/85cbvaq9E

Для реально сложных случаев, я уже написал что есть pre/post: https://en.cppreference.com/w/cpp/language/contracts, они позволяют указать как будет идти преобразование в функции, и там же можно задать компилятору новый диапазон, эти pre/post находятся прямо в прототипе функции.

так что межмодульная оптимизация подбирает уже оставшиеся крохи

Есть разные виды lto, ты описываешь какой то легкий, но тоже полезный в крупных программах, а я говорю о полноценном, где сохраняется внутреннее представление компилятора, и возможно проводить сложные оптимизации. С таким внутреннем представлением, которое достается оптимизатору lto, работает gcc analyzer, а как ты понимаешь, статическому анализатору надо много информации, и она на входе к lto есть.

Исправление MOPKOBKA, :

вот довольно тривиальный код, в котором clang ставит проверки переполнения

clang вообще довольно плохой компилятор, но тут у тебя нету static или lto, я вот расширил шаги, и как видишь, компилятор понимает какие значения могут появится в step2, и не генерирует printf: https://godbolt.org/z/85cbvaq9E

Для реально сложных случаев, я уже написал что есть pre/post: https://en.cppreference.com/w/cpp/language/contracts, они позволяют указать как будет идти преобразование в функции, и там же можно задать компилятору новый диапазон, эти pre/post находятся прямо в прототипе функции.

так что межмодульная оптимизация подбирает уже оставшиеся крохи

Есть разные виды lto, ты описываешь какой то легкий, но тоже полезный в крупных программах, а я говорю о полноценном, где сохраняется внутреннее представление компилятора, и возможно проводить сложные оптимизации. С таким внутреннем представлением, которое достается оптимизатору lto, работает gcc analyzer, а как ты понимаешь, статическому анализатору надо достаточно информации.

Исходная версия MOPKOBKA, :

вот довольно тривиальный код, в котором clang ставит проверки переполнения

clang вообще довольно плохой компилятор, но тут у тебя нету static или lto, я вот расширил шаги, и как видишь, компилятор понимает какие значения могут появится в step2, и не генерирует printf: https://godbolt.org/z/85cbvaq9E

Для реально сложных случаев, я уже написал что есть pre/post: https://en.cppreference.com/w/cpp/language/contracts, они позволяют указать как будет идти преобразование в функции, и там же можно задать компилятору новый диапазон, эти pre/post находятся прямо в прототипе функции.

так что межмодульная оптимизация подбирает уже оставшиеся крохи

Есть разные виды lto, ты описываешь какой то легкий, но тоже полезный в крупных программах, а я говорю о полноценном, где сохраняется внутреннее представление компилятора, и возможно проводить сложные оптимизации. С таким внутреннем представлением, которое остается от lto, работает gcc analyzer, а как ты понимаешь, статическому анализатору надо достаточно информации.