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

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

Я ищу ту же информацию для Clang.

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

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

4 ответа

Решение

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

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

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 -assume-cache-tracker -profile-summary-info -forceattrs -basiccg -всегда-встроенный-барьер
    • clang добавляет: -mdisable-fp-elim -mrelax-all
  • -O1 основывается на -O0

    • opt добавляет: -targetlibinfo -tti -tbaa -scoped-noalias -exposition-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-пропаганда -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-замечание-эмиттер -instcombine -simplifycfg -basiccg -globals-aa -prune-eh-всегда-inline -functionattrs -sroa -memoryssa-ранее-cse-memssa -speculartive -execution -lazy-value-info -jump-threading -коррелированное-распространение -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-упрощение -lcssa-проверка -lcssa -scalar-evolution -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -deeded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-access -loop-распределить -loop-vectorize -loop-load-elim -выравнивание-от-предположений -полосы-мертвые-прототипы -loop-раковина -instsimplify -div-rem-pair -verify -ee-instrument -early-cse -lower-ожидайте
    • clang добавляет: -momit-leaf-frame-pointer
    • clang капли: -mdisable-fp-elim -mrelax-all
  • -O2 основывается на -O1

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

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

    • clang добавляет: -fno-подписанные нули -freciprocal-math -ffp-contract=fast -able-unsafe-fp-math -ableable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-математических только
  • -Os похож на -O2

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

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

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

  • базовый уровень (-O0):

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

    • opt добавляет: -globalopt -допустимые-биты -branch-prob -inferattrs -ipsccp -dse -loop-упрощение -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals-aa -rpo-functionattrs -basiccg -loop-идиома -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-доступы -mmcpyopt -loop-делеция -reassociate -провод-мертв-прототипы -lops -propagation -lcssa -domtree-всегда-встроенный -aa -block-freq -float2int -lower-wait -sroa -loop-unroll -alignment-from-предположения -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-vend-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-подписанный-нули -freciprocal-math -ffp-contract = быстро-менабельный-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os такой же как -O2

  • -Oz основывается на -Os

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


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

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

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

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

    • добавляет: -elim-vend-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • удаляет: -всегда-встроенный
  • -O3 основан на -O2

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

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

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


Для версии 3.6 пропуски описаны в посте GYUNGMIN KIM.


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

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

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

    • добавляет: -коррелированное распространение -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -барьер -block-freq -loop-упрощение -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 -всегда-встроенный -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-wait -licm -loop-idiom -adce -domtree -lcssa
  • -O2 основан на -01

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

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

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

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


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

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

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

    • добавляет: -adce -всегда-inline -basicaa -basiccg -коррелированное-распространение -deadargelim -dse -early-cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threading -lazy-value-info -lcssa -licm -loop-delete -loop-idiom -loop-rotate -loop-упрощение -loop-unroll -loop-unswitch -loops -ниже-ожидают -mecpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar-evolution -sccp -simplifycfg -sroa -strip-dead-прототипы -tailcallelim -tbaa
  • -O2 основан на -01

    • добавляет: -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • удаляет: -всегда-встроенный
  • -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-ожидайте -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -всегда-inline -functionattrs -simplify-libcalls -lazy-value-info -jump-threading -коррелированное-распространение -tailcallelim -reassociate -loops -loop-упрощение -lcssa -loop-rotate -licm -loop-unswitch -scalar-evolution -indvars -lolo-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -dse -adce -strip-dead-prototypes
  • -O2 основан на -01

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

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

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


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

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

Редактировать [сентябрь 2014] добавлены опции для 3.5

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

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

Редактировать [ноябрь 2018] добавить опции для 6.0

@ Ответ Антуана (и другой связанный вопрос) точно описывает включенные оптимизации 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

Начиная с clang/LLVM 13.0.0, устаревший менеджер проходов устарел, и по умолчанию используется новый менеджер проходов. Это означает, что предыдущее решение для печати проходов оптимизации, используемых для различных уровней оптимизации, будет работать только в том случае, если диспетчер проходов прежней версии явно включен с помощью -enable-new-pm=0. Итак, пока существует устаревший менеджер проходов (ожидается до LLVM 14), можно использовать следующую команду

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

Кроме того, порядок выполнения проходов оптимизации с помощью нового менеджера проходов можно извлечь с помощью --debug-pass-manager(вместо -debug-pass=Arguments). К сожалению, вывод очень подробный, и необходимо выполнить некоторую обработку, чтобы восстановить поведение вручную с помощью -passes=. Если интерес представляют только проходы трансформации, можно использовать опцию -debug-pass-manager=quietпропустить информацию об анализах.

Существует руководство пользователя о том, как использовать новый менеджер пропусков с optна веб- сайте LLVM.

LLVM 3.6-O1

Проходные аргументы: -targetlibinfo -no-aa -tbaa -scoped-noalias -exposition-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -дерево -instcombine -simplifycfg -basiccg -prune-ehin стоимость-всегда-inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -коррелированные-распространение -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -lolo-упрощать lcssa -loop-rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-упрощение -lcssa -indvars -loop-idiom -loop-delete -function_tti -lolo-unroll -memdep -memcpyopt -sccp -domtree -inbcom lazy-value-info -jump-threading -коррелированное-распространение -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-упрощение -lcssa -branch-prob -block-freq -scalar-evolution -loop-vectorize -instcombine -simplifycfg -domtree -instcombine -loops -loop-упрощение -lcssa -scalar-evolution -function_tti -loop-unroll -выравнивание-от-a-a ssumptions -strip-dead-prototypes -verify -verify-di

-O2 основание на -O1

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

и удаляет: -всегда-встроенный

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

добавить: -argpromotion

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