Уровни оптимизации Clang

94

На НКУ, руководство объясняет , что -O3, -Osи т.д. переводить с точки зрения аргументов оптимизации конкретных ( -funswitch-loops, -fcompare-elimи т.д.)

Я ищу такую ​​же инфу для clang .

Я искал в Интернете и в man clangкотором дается только общая информация ( -O2оптимизирует больше -O1, -Osоптимизирует скорость,…), а также посмотрел здесь, в Stack Overflow, и нашел это , но я не нашел ничего подходящего в цитируемых исходных файлах.

Изменить: я нашел ответ, но мне все еще интересно, есть ли у кого-нибудь ссылка на руководство пользователя, документирующее все проходы оптимизации и выбранные проходы . В настоящее время я только что нашел этот список проходов, но ничего об уровнях оптимизации.-Ox

Антуан
источник

Ответы:

160

Я нашел этот связанный вопрос.

Подводя итог, чтобы узнать об этапах оптимизации компилятора:

llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments

Как указано в ответе Джеффа Никсона (+1), clangдополнительно выполняется несколько оптимизаций более высокого уровня, которые мы можем получить с помощью:

echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#

Документация по индивидуальным пропускам доступна здесь .



В версии 6.0 проходы следующие:

  • базовая линия ( -O0):

    • optустанавливает : -tti -verify -ee-instrument -targetlibinfo -assuming-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clangдобавляет : -mdisable-fp-elim -mrelax-all
  • -O1 основан на -O0

    • opt добавляет:-targetlibinfo -tti -tbaa -scoped-noalias -assume-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-spreading -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy -branch-prob -lazy-block-freq -opt-remame-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa -speculative-execution -lazy-value-info -jump-threading -correlated-aggation -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-simpleify -lcssa-verify -lcssa -scalar-evolution -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-access -loop-distribute-loop-vectorize -loop-load-elim -alignment-from-Предположения -strip-dead-prototypes -loop-сток -instsimplify -div-rem-pair -verify -ee-instrument -early-cse -lower-expect
    • clangдобавляет : -momit-leaf-frame-pointer
    • clangкапли : -mdisable-fp-elim -mrelax-all
  • -O2 основан на -O1

    • optдобавляет : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • optкапли : -всегда в линию
    • clangдобавляет : -vectorize-loops -vectorize-slp
  • -O3 основан на -O2

    • optдобавляет : -callsite-splitting -argpromotion
  • -Ofastоснован на -O3, действителен, clangно не вopt

    • clangдобавляет : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-math-only
  • -Os похож на -O2

    • optкапли : -libcalls-shrinkwrap и -pgo-memopt-opt
  • -Oz основан на -Os

    • optкапли : -slp-vectorizer

В версии 3.8 проходы следующие:

  • базовая линия ( -O0):

    • optустанавливает : -targetlibinfo -tti -verify
    • clangдобавляет : -mdisable-fp-elim -mrelax-all
  • -O1 основан на -O0

    • optдобавляет : -globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-simpleify -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals-aa -rpo-functionattrs -basiccg -loop-idiom -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-accesses -memcpyopt -loop-deletion -reassociate -strip-dead-prototypes -correlated -basicaa -propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-accepts -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assuming-cache-tracker
    • clangдобавляет : -momit-leaf-frame-pointer
    • clangкапли : -mdisable-fp-elim -mrelax-all
  • -O2 основан на -O1

    • optдобавляет : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optкапли : -всегда в линию
    • clangдобавляет : -vectorize-loops -vectorize-slp
  • -O3 основан на -O2

    • optдобавляет : -argpromotion
  • -Ofastоснован на -O3, действителен, clangно не вopt

    • clangдобавляет : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os такой же как -O2

  • -Oz основан на -Os

    • optкапли : -slp-vectorizer
    • clangкапли : -векторизовать-петли


В версии 3.7 проходы следующие (проанализированный вывод приведенной выше команды):

  • по умолчанию (-O0): -targetlibinfo -verify -tti

  • -O1 основан на -O0

    • добавляет : -sccp -loop-simpleify -float2int -lazy-value-info -correlated-aggation -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses -assuming-cache-tracker -reassociate -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -prune-eh -loop-unswitch -alignment-from-допущений -early-cse -inline -cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-expect -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep -always-inline
  • -O2 основан на -01

    • добавляет : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • удаляет : -always-inline
  • -O3 основан на -O2

    • добавляет : -argpromotion -verif
  • -Os идентичен -O2

  • -Oz основан на -Os

    • удаляет : -slp-vectorizer


Для версии 3.6 проходы описаны в сообщении GYUNGMIN KIM.


В версии 3.5 проходы следующие (разобранный вывод команды выше):

  • по умолчанию (-O0): -targetlibinfo -verify -verify-di

  • -O1 основан на -O0

    • добавляет : -correlated-spreading -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-simpleify -loop-vectorize -inline-cost -branch-prob -early-cse -lazy-value-info -loop-rotate -strip-dead-prototypes -loop-deletion -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -sccp -always-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-expect -licm -loop-idiom -adce -domtree -lcssa
  • -O2 основан на -01

    • добавляет : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • удаляет : -always-inline
  • -O3 основан на -O2

    • добавляет : -argpromotion
  • -Os идентичен -O2

  • -Oz основан на -Os

    • удаляет : -slp-vectorizer


В версии 3.4 проходы следующие (разобранный вывод команды выше):

  • -O0: -targetlibinfo -preverify -domtree -verify

  • -O1 основан на -O0

    • добавляет : -adce -always-inline -basicaa -basiccg -correlated-spreadation -deadargelim -dse -early-cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threading -lazy-value-info -lcssa -licm -loop-deletion -loop-idiom -loop-rotate -loop-simpleify -loop-unroll -loop-unswitch -loops -lower-expect -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -O2 основан на -01

    • добавляет : -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • удаляет : -always-inline
  • -O3 основан на -O2

    • добавляет : -argpromotion
  • -Os идентичен -O2

  • -Oz основан на -O2

    • удаляет : -barrier -loop-vectorize -slp-vectorizer


В версии 3.2 проходы следующие (разобранный вывод команды выше):

  • -O0: -targetlibinfo -preverify -domtree -verify

  • -O1 основан на -O0

    • добавляет : -sroa -early-cse -lower-expect -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -simplify-libcalls -lazy -info -jump-threading -correlated -progation -tailcallelim -reassociate -loops -loop-simpleify -lcssa -loop-rotate -licm -loop-unswitch -scalar-evolution -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -dse -adce -strip-dead-prototypes
  • -O2 основан на -01

    • добавляет : -inline -globaldce -constmerge
    • удаляет : -always-inline
  • -O3 основан на -O2

    • добавляет : -argpromotion
  • -Os идентичен -O2

  • -Oz идентично -Os


Изменить [март 2014 г.] удалила дубликаты из списков.

Изменить [апрель 2014 г.] добавлена ​​ссылка на документацию + параметры для 3.4

Edit [сентябрь 2014 г.] добавлены параметры для версии 3.5

Редактировать [декабрь 2015] добавлены параметры для 3.7 и упомянут существующий ответ для 3.6.

Правка [май 2016 г.] добавлены параметры для 3.8 как для opt, так и для clang, и упомянут существующий ответ для clang (вместо opt)

Изменить [ноя 2018] добавить параметры для 6.0

Антуан
источник
2
Есть ли способ сделать это с версией clang, поставляемой с XCode5? Я пробовал искать команду llvm-as, но ее нет на моей машине нигде, что я могу видеть
Текногребо
@Antoine, почему некоторые флаги вроде -simplifycfgповторяются?
Paschalis
2
@Paschalis: Я не уверен, но поскольку некоторые проходы оптимизации работают, только если были запущены другие проходы, и, например simplifycfg, требуется несколько проходов. И, debug-pass=Argumentsвероятно, произойдет до дедупликации. Я удалил дубликаты в своем ответе, спасибо за ваш отзыв.
Антуан
5
Некоторые оптимизации создают материал, который можно оптимизировать в дальнейшем (мертвый код и т. Д.), Поэтому имеет смысл повторно запустить некоторые этапы оптимизации.
cyco130
1
@ZachB / @Antoine Почему бы не (тоже?) LLVM 7 (или это то, что вы имели в виду?) Также: 1. Я не уверен, как долго он там был, но теперь есть -Ogа-ля GCC; 2. Нужна ли еще вся специфика для старых версий? 3. Я думаю, учитывая приятные изменения, которые были внесены за эти годы, и статус сообщества, я собираюсь сократить свой ответ до простого упоминания таких вещей, как clang -cc1 -mllvm -help-list-hidden(если вы не захотите интегрировать его).
Джефф Никсон
16

Ответ @Antoine (и другой связанный вопрос) точно описывает оптимизацию LLVM, которая включена, но есть несколько других параметров, специфичных для Clang (т.е. тех, которые влияют на снижение до AST), на которые влияет-O[0|1|2|3|fast] флаги.

Вы можете взглянуть на них с помощью:

echo 'int;' | clang -xc -O0 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O1 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O2 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#

echo 'int;' | clang -xc -Ofast - -o /dev/null -\#\#\#

Например, -O0позволяет -mrelax-all, -O1позволяет -vectorize-loopsи -vectorize-slp, и -Ofastпозволяет -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fastи -ffast-math.


@Techogrebo:

Да, нет необходимости в других инструментах LLVM. Пытаться:

echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options

Кроме того, есть гораздо более подробные параметры, которые вы можете изучить / изменить с помощью только Clang ... вам просто нужно знать, как к ним добраться!

Попробуйте несколько из:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help

Джефф Никсон
источник
3

LLVM 3.6 -O1

Передайте аргументы:-targetlibinfo -no-aa -tbaa -scoped-noalias -assuming-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -always -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-spreading -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simpleify -lcssa -rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simpleify -lcssa -indvars -loop-idiom -loop-deletion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value -info -jump-threading -correlated-spreading -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simpleify -lcssa -branch-prob -block-freq -scalar-evolution -loop -vectorize -instcombine-simplifycfg -domtree -instcombine -loops -loop-simpleify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-Допущения -strip-dead-prototypes -verify -verify-di

-O2 база на -O1

добавить: -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge

и удаляет: -always-inline

-O3 на основе -O2

добавить: -argpromotion

ГЮНГМИН КИМ
источник