Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Подводя итог, узнайте о прогонах оптимизации компилятора:

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

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

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

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



С версией 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-simplify -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 -loops -basicaa -correlated-propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-conditions -lazy-value-info -prune-eh -jump-threading -loop-rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clang добавляет: -momit-leaf-frame-pointer
    • clang drops: -mdisable-fp-elim -mrelax-all
  • -O2 основан на -O1

    • opt добавляет: -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • opt drops: -allways-inline
    • 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 drops: -slp-vectorizer
    • clang drops: -vectorize-loops

<ч/" >

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

  • default (-O0): -targetlibinfo -verify -tti

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

    • добавляет: -sccp -loop-simplify -float2int -lazy-value-info -correlated-propagating -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt -loop-accesses -assumption-cache- tracker -reassociate -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -prune-eh -loop-unswitch -ограничение-из-предположений -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 - скалярная эволюция -memdep -алайн-inline
  • -O2 основан на -01

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

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

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

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

<ч/" >

Для версии 3.6 проходы соответствуют документу в сообщении GYUNGMIN KIM.

<ч/" >

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

  • default (-O0): -targetlibinfo -verify -verify-di

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

    • добавляет: -коррелированное-распространение -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-simplify -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
    • удаляет: -allways-inline
  • -O3 основан на -O2

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

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

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

<ч/" >

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

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

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

    • добавляет: -adce -allways-inline -basicaa -basiccg -correlated-propagation -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-simplify -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
    • удаляет: -allways-inline
  • -O3 основан на -O2

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

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

    • удаляет: -барьер -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-value-info -jump-threading -correlated-distribution -tailcallelim -reassociate -loops -loop-simplify -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
    • удаляет: -allways-inline
  • -O3 основан на -O2

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

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

<ч/" >

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

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

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

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

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

Ответ 2

@Ответ на 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 -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -ways-inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop -simplify -lcssa -loop-rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplify -lcssa -indvars -loop-idiom -loop-deletion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simplify -lcssa -branch-prob -block-freq -scalar-evolution -loop-vectorize -instcombine -simplifycfg -domtree -instcombine -loops -loop-simplify -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-fr om-предположения -strip-dead-prototypes -verify -verify-di

-O2 база на -O1

add: -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge

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

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

добавить: -argpromotion