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-pointerclang
капли: -mdisable-fp-elim -mrelax-all
-O2
основывается на-O1
opt
добавляет: -inline -mldst-motion -gvn -elim-vend-extern -slp-vectorizer -constmergeopt
капли: -всегда-встроенный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 -verifyclang
добавляет: -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-trackerclang
добавляет: -momit-leaf-frame-pointerclang
капли: -mdisable-fp-elim -mrelax-all
-O2
основывается на-O1
opt
добавляет: -elim-vend-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmergeopt
капли: -всегда-встроенный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