Я думаю, что наиболее полезным здесь может быть понимание того, как выполняются проходы и в каком состоянии находится код во время LTO.
Прежде всего, когда компилятор запускает проходы оптимизации, они выполняются как набор, добавленный в файл PassManager
. Это означает, что LLVM/Clang
при передаче чего-то вроде -O3
создаст копию PassManager
и впоследствии предоставит ей набор проходов, который, как ожидается, обеспечит O3
уровень оптимизации. Это сильно отличается от того, что вы делаете с внешней библиотекой, которая должна быть предоставлена вручную и не может быть нормально вписана в конвейер передачи.
Тогда у нас есть положение вещей при выполнении LTO. Во время оптимизации времени соединения все отдельные единицы перевода были объединены и теперь представляют собой единый Module
. Это означает, что оптимизация, выполняемая для каждой функции, будет выполняться для каждой функции в кодовой базе. Точно так же помодульная оптимизация будет выполняться на полном Module
и, следовательно, предлагать межпроцедурный анализ/оптимизацию.
Если вы хотите использовать внутримодульный пропуск, то нет причин делать это во время LTO, вместо этого вы можете просто создать ModulePass
и запустить его на каждом устройстве.
person
jtv
schedule
06.10.2015