Какую оптимизацию выполняет LLVM?

Я хотел бы конкретно знать, чему соответствуют различные уровни оптимизации LLVM.

то есть, я хотел бы знать, какие проходы оптимизации точно выполняются (вне интерфейса) и в каком порядке, когда я использую опции "-0x" llvm (или clang или opt). "Человек" соответствующих инструментов не предоставляет много информации по этому вопросу (для oposite одного gcc).

Я знаю об этой полезной странице: http://llvm.org/docs/Passes.html, но он не предоставляет никакой информации о параметрах "-Ox". Я искал некоторые отладочные или подробные параметры (esp. используя информацию из "opt --help"), но я не мог найти никакой полезной опции.

в качестве дополнения я заметил, проанализировав код, что все различные инструменты LLVM, а также clang используют разные драйверы, которые анализируют параметры по-своему. Все эти драйверы похожи по отношению к параметрам " - Ox ?

редактировать: я нашел опцию "- debug-pass=Arguments" для инструмента "opt", который дает следующий вывод для опции "O1":

Pass Arguments:  -targetdata -no-aa -tbaa -targetlibinfo -basicaa -simplifycfg -domtree -scalarrepl -early-cse -lower-expect
Pass Arguments:  -targetlibinfo -targetdata -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -scalarrepl-ssa -domtree -early-cse -simplify-libcalls -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -iv-users -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -instcombine -lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -instcombine -strip-dead-prototypes -preverify -domtree -verify

Это недалеко от того, что я хотел, но остается два вопроса:

  • почему два списка ?

  • есть ли аналогичная опция для других инструментов, особенно "clang"? (согласно моим тестам, "-debug-pass=Arguments " не работает с лязг)

редактировать: опция "- debug-pass=Structure "для инструмента" opt " дает еще более удобные для пользователя данные (отhttp://llvm.org/docs/WritingAnLLVMPass.html)

1 ответов


почему два списка?

пропуска функции и модуля имеют их собственные менеджеры пропуска и поэтому печатают вне отдельно.

есть ли аналогичная опция для других инструментов, особенно "clang"

С clang вы можете использовать-mllvm-debug-pass=Аргументы.