LLVM медленнее, когда активирован проход

Я использую LLVM для компиляции libtomcrypt, это очень быстро (несколько секунд), но когда я использую пустой проход (просто проход модуля, который ничего не делает), он очень медленный (несколько минут).

Кто-то знает почему?

Я использую Fedora 19.

LLVM, которую я использую, это LLVM 3.4 в сборке релиза.

Спасибо

1 ответ

Решение

Я могу придумать два способа, которыми пустой проход модуля может отрицательно повлиять на время компиляции:

1. Пройдите заказ

Модуль пропускает принудительную своего рода точку синхронизации на менеджере пропусков. Например, предположим, у вас есть следующее:

  1. Функция прохода А
  2. Функция Pass B

На модуле с двумя функциями f() а также g(), Менеджер пропусков может (и будет) сначала запускать A и B на f()и только тогда A и B на g(), Это полезно, среди прочего, для локальности памяти. Однако, если вы добавите модуль pass:

  1. Функция прохода А
  2. Модуль проход
  3. Функция Pass B

Затем вы заставляете менеджер проходов сначала запустить A для обеих функций, затем модуль pass, а затем B для обеих функций.

2. Аннулирование предыдущих результатов

Из документации:

Если проход не реализует метод getAnalysisUsage, по умолчанию он не имеет обязательных проходов и делает недействительными все остальные проходы.

Так что если ваш runOnModule метод возвращает trueменеджер проходов считает каждый предыдущий проход анализа недействительным, заставляя их повторно запускать, если они понадобятся позже.

Для более полной картины, я рекомендую прочитать документацию для полного объяснения того, что делает менеджер проходов.

Другие вопросы по тегам