> части функций, которые не используются.Я проверял на разном софте.
1) Упомянутый мной tweetnacl-lite, с которым я развлекаюсь засовывая его в cortex-M. Если с LTO собрать, но нигде не вызвать, LTO его выносит целиком. Ну то-есть от него ничего не остается. Если другого кода не было - я получаю пустой бинарь, состоящий из дефолтных vectors. Как еще эффективнее код выносить я даже и не знаю :)
2) В большом сложном бинаре на плюсах LTO вырубил примерно четверть кода.
Как по мне так там с -flto -fwhole-program (whole-program имеет некие особенности, ахтунг) dead code вырубается очень даже.
> Больше всего выбрасывает -ffunction-sections -fdata-sections + -Wl,--gc-sections так
> как выкидывает неиспользуемые функции и данные целиком.
Упомянутое вроде бы вырубает неиспользуемые функции просто в ноль. И особенности особенностями, а в типовых случаях не вижу никаих проблем. Законы мерфи не отменяли.
> Зависит от того какой код. Допустим 10% уходило на вызов + сохранение
> + восстановление регистров. Мы инлайним эту функцию 10-100 раз - код растет.
Если мы вместо 10% на сохранение потратим это на инлайн - какая, собственно, разница? Единственным достижением станет более шустрый код, где прологи-эпилоги заменятся на мелкую функцию. А так там эвристика есть, IIRC, на предмет что выгоднее. Все это если не указан явно инлайн или ноинлайн, конечно же, там компилер будет следовать указаниям програмера.
>> И у gcc вроде есть анализы когда и что выгоднее.
> AFAIK зависит от агрессивности оптимизации, сам он точно рассчитать и предсказать не может.
Не знаю как насчет точности но при решении инлайнить или нет если не было явного хинта, оценивается размер кода функции vs экономия от отсутствия пролога-эпилога и принимается решение, инлайнить или нет. На первый взгляд вполне разумно сделано. Пардон не помню где читал описание уровней и lto.
> Для этого нужно исполнить код с типичными данными на входе.
> У gcc есть и такой режим (забыл как он называется).
Вы про profile-guided optimization чтоли? Это несколько другое. Они как-то геморно делаются и настолько круто мне, имхо, не надо.
> Не всегда. Например большая функция на несколько страниц с switch на кучу
> case. Она может быть разбита и преобразована в десятки мелких функций.
Вполне возможно, но я не знаю насколько анализатор это умеет. Он умеет настолько много что всех его умений я не знаю.