Опция -ipa включает так называемый межпроцедурный анализ (IPA, interprocedural analysis), выполняемый компилятором. Это разрешает оптимизацию по всей программе, включая оптимизацию между отдельными модулями исходного кода, которые компилируются раздельно. Опция -ipa генерирует дополнительные файлы с расширением .ipa, которые должны быть удалены только совместно со связанными с ними объектными файлами. Эта функция позволяет компилятору видеть все исходные файлы, которые будут вовлечены в проект на завершающей стадии линковки, и использовать эту информацию при оптимизации. В результате оптимизация будет осуществляться не на уровне отдельного элемента трансляции (translation unit), а не уровне взаимодействия между элементами трансляции. Чтобы опция -ipa работала, она должна быть применена для всех файлов C и C++ программы. Указание опции -ipa также подразумевает использование опции -O (см. ниже).
Все оптимизации, связанные с -ipa, осуществляются после начальной линковки, с помощью специальной программы, которая называется prelinker. Она заново вызывает компилятор для выполнения новых оптимизаций, повторного компилирования исходных файлов, если это необходимо - чтобы задействовать собранную (в файлах *.ipa) информацию.
VisualDSP++. Использование этой опции можно задать в GUI-интерфейсе настроек свойств проекта Project Options -> Compile -> General -> галочка Interprocedural optimization.
CCES. Свойства проекта -> Compile -> General -> Interprocedural analysis, или использование в командной строке опции -ipa.
Из-за того, что файл может быть заново перекомпилирован prelinker, не используйте опцию -S, чтобы посмотреть конечный оптимизированный файл ассемблера, когда разрешена работа опции -ipa. Вместо этого используйте опцию -save-temps, при которой может быть сначала выполнен полный цикл компиляции/линковки.
Включение межпроцедурного анализа автоматически разрешает использование опции -O для включения оптимизации.
[Взаимодействие IPA с библиотеками]
Когда разрешена функция IPA, компилятор анализирует все исходные файлы для построения информации использования всех функций и элементов данных. Затем компилятор использует эту информацию для выполнения отдельных оптимизаций между всеми исходными модулями кода путем их перекомпиляции, если это необходимо.
Поскольку IPA работает только на финальной стадии линковки, то нет выгоды в использовании опции -ipa, когда изначально скомпилированные файлы исходного кода преобразованы в объектный формат для включения в библиотеку. IPA захватит информацию и поместит её в формат объектного файла, но не сможет использовать её в этой точке, потому что содержимое библиотеки пока еще не используется в контексте оптимизации IPA. Когда IPA вовлекается во время линковки, будет восстановлена захваченная информация из всех линкуемых объектных файлов, которые были скомпилированы с опцией -ipa, и где это необходимо и возможно, будут перекомпилированы исходные файлы, чтобы применить дополнительные оптимизации.
Модули, слинкованные из библиотеки, не рекомпилируются таким способом, потому что для них недоступны модули исходного кода. Так что захваченная информация в библиотечном модуле может использоваться для будущей оптимизации в исходного кода приложения, но не даст выгоды для самого библиотечного модуля.
Если библиотечный модуль обращается к функции в модуле пользователя программы, это будет детектировано во время начальной фазы линковки, и IPA не будет игнорировать эту функцию. Если библиотечный модуль не скомпилирован с опцией -ipa, то IPA не делает никаких предположений о том, как может быть вызвана функция, так что функция не может быть эффективно оптимизирована как в случае, если бы все ссылки на неё в исходном коде были бы видимы для системы IPA, или из библиотечных модулей, скомпилированных с опцией -ipa.
[Ссылки]
1. C/C++ Compiler and Library Manual for Blackfin® Processors site:analog.com. |