На НКУ, руководство объясняет , что -O3
, -Os
и т.д. переводить с точки зрения аргументов оптимизации конкретных ( -funswitch-loops
, -fcompare-elim
и т.д.)
Я ищу такую же инфу для clang .
Я искал в Интернете и в man clang
котором дается только общая информация ( -O2
оптимизирует больше -O1
, -Os
оптимизирует скорость,…), а также посмотрел здесь, в Stack Overflow, и нашел это , но я не нашел ничего подходящего в цитируемых исходных файлах.
Изменить: я нашел ответ, но мне все еще интересно, есть ли у кого-нибудь ссылка на руководство пользователя, документирующее все проходы оптимизации и выбранные проходы . В настоящее время я только что нашел этот список проходов, но ничего об уровнях оптимизации.-Ox
-simplifycfg
повторяются?simplifycfg
, требуется несколько проходов. И,debug-pass=Arguments
вероятно, произойдет до дедупликации. Я удалил дубликаты в своем ответе, спасибо за ваш отзыв.-Og
а-ля GCC; 2. Нужна ли еще вся специфика для старых версий? 3. Я думаю, учитывая приятные изменения, которые были внесены за эти годы, и статус сообщества, я собираюсь сократить свой ответ до простого упоминания таких вещей, какclang -cc1 -mllvm -help-list-hidden
(если вы не захотите интегрировать его).Ответ @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
источник
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
источник