Рівні оптимізації Clang


91

На ПКУ, керівництво пояснює , що -O3, -Osі т.д. переводити з точки зору аргументів оптимізації конкретних ( -funswitch-loops, -fcompare-elimі т.д.)

Я шукаю ту ж інформацію про дзвін .

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

Редагувати: я знайшов відповідь, але мені все одно цікаво, якщо хтось має посилання на посібник користувача, в якому зафіксовано всі проходи оптимізації та вибрані проходи . На даний момент я щойно знайшов цей список пропусків, але нічого на рівнях оптимізації.-Ox

Відповіді:


156

Я знайшов цей родинний питання.

Підсумовуючи це, щоб дізнатись про проходи оптимізації компілятора:

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 -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -lsways-inline -barrier
    • clangдодає : -mdisable-fp-elim -mrelax-all
  • -O1 базується на -O0

    • opt додає:-targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp -called-value-propagation -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy -grab-prob -lazy-block-freq -opt-remark-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -sways-inline -functionattrs -sroa -memoryssa -early-cse-memssa -speculative-изпълнение -lazy-value-info -jump-threadading -correlated-propagation -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-спростити -lcssa-перевірка -lcssa -скалярна еволюція -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-funkctionattrs -globaldce -float2int -loop-доступ -loop-розподіл-luop-vectorize -loop-load-elim -alignment-from-acumptions -strip-dead-prototypes -loop-sink -instsimplify -div-rem-пары -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-avail-extern -slp-vectorizer -constmerge
    • optкраплі : -завжди вбудовані
    • clangдодає : -vectorize-loops -vectorize-slp
  • -O3 базується на -O2

    • optдодає : -розподіл виклику -argpromotion
  • -Ofastбазується на -O3, діє в, clangале не вopt

    • clangдодає : -fno-potpisaні-нулі -взаємна математика -ffp-контракт = швидкий -змінний-небезпечний-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -фінітна математика
  • -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 -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-спростити -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals-aa -rpo-funkctionattrs -basiccg -loop-idiom -forceattrs -mem2reg -simplifycfg -ranly-cse -incomcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-acces -memcpyopt -loop-deletion -reassociate -strip-dead-prototypea -loopsrebasbasica -розмноження -lcssa -domtree -завжди-вбудований -aa -block-freq -float2int -нижче-очікувати -sroa-петля-розгортання-вирівнювання-з-припущень -lazy-value-info -prune-eh -jump-threadading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-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-підписані-нулі -взаємна математика -ffp-контракт = швидкий -змінний-небезпечний-fp-math -menable-no-nans -menable-no-infs
  • -Os це те саме, що -O2

  • -Oz базується на -Os

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


У версії 3.7 проходи наступні (проаналізований вихід команди вище):

  • за замовчуванням (-O0): -targetlibinfo -verify -tti

  • -O1 базується на -O0

    • додає : -sccp -loop-спрощення -float2int -lazy-value-info -correlated-propagation -bdce -lcssa -deadargelim -oop-unroll -loop-vectorize -barrier -memcpyopt -loop-acces -assumption-cache-tracker -reassociate -цикл-видалення -галузь-проблема -перехід-різьблення -domtree -dse -цикл-обертання -ipsccp -вміст-комбінат -скоп-ноаліас -licm -prune-eh-петля-неперемикач-вирівнювання-з-припущень-рання-cse -inline -витрати -спрощенняcfg-смуга-мертві-прототипи -tbaa -sroa -no-aa -adce -functionattrs -нижче-очікувати -basiccg-петлі-петля-ідіома -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep -завжди вбудований
  • -O2 базується на -01

    • додає : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • видаляє : -завжди-вбудований
  • -O3 базується на -O2

    • додає : -argpromotion -verif
  • -Os ідентичний -O2

  • -Oz базується на -Os

    • видаляє : -slp-векторизатор


Для версії 3.6 пропуски вказані в документі GYUNGMIN KIM.


У версії 3.5 переходи наступні (проаналізований вихід команди вище):

  • за замовчуванням (-O0): -targetlibinfo -verify -verify-di

  • -O1 базується на -O0

    • додає : -correlated-propagation -basiccg -simplifycfg -no-aa -jump-threadading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-спростити -loop-vectorize -inline-cost -branch-prob -ranly-cse -lazy-value-info -loop-rotate -strip-dead-prototypes -loop-deletion -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -sccp -sways-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -скалярна еволюція -нижче-очікувати -licm-петля-ідіома -adce -domtree -lcssa
  • -O2 базується на -01

    • додає : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • видаляє : -завжди-вбудований
  • -O3 базується на -O2

    • додає : -argpromotion
  • -Os ідентичний -O2

  • -Oz базується на -Os

    • видаляє : -slp-векторизатор


У версії 3.4 передачі виконуються наступним чином (проаналізований вихід команди вище):

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

  • -O1 базується на -O0

    • додає : -adce -завжди вбудований -basicaa -basiccg -корельоване-розповсюдження -deadargelim -dse -ranly-cse -functionattrs -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threadading -lazy-value-info -lcssa -licm-циклу-видалення-циклу-ідіоми -циклу-обертання-циклу-спрощення -циклу-розгортання-циклу-відключення-циклів -нижче-очікування -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
    • видаляє : -завжди-вбудований
  • -O3 базується на -O2

    • додає : -argpromotion
  • -Os ідентичний -O2

  • -Oz базується на -O2

    • видаляє : -бар'єр-петля-векторизація -slp-векторизатор


У версії 3.2 передачі виконуються наступним чином (проаналізований вихід команди вище):

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

  • -O1 базується на -O0

    • додає : -sroa -рання-cse -нижче-очікувати -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -sways-inline -functionattrs -simplify-libcalls -lazy -lazy -інформація -скокове-потокове -корельоване-розповсюдження -tailcallelim -реасоціація -цикли -цикл-спрощення -lcssa -цикл-поворот -licm -цикл-відключення -скалярна еволюція -індвари -цикл-ідіома -цикл-видалення -цикл-розкрутка -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


2
Чи є спосіб зробити це з версією clang, яка постачається з XCode5? Я пробував шукати команду llvm-as, але її на моїй машині ніде немає, яку я бачу
Teknogrebo

@Antoine, чому деякі прапори подібні -simplifycfgповторюються?
Пасхаліс

2
@Paschalis: Я не впевнений, але оскільки деякі пропуски для оптимізації працюють лише у тому випадку, якщо були запущені деякі інші проходи, і, наприклад simplifycfg, потрібно кілька проходів. І, debug-pass=Argumentsймовірно, це відбувається до дедуплікації. Я видалив дублікати у своїй відповіді, дякую за ваш відгук.
Антуан

5
Деякі оптимізації створюють речі, які можна додатково оптимізувати (мертвий код тощо), тому може мати сенс повторити деякі проходи оптимізації.
cyco130

1
@ZachB / @Antoine Чому б і не (також?) LLVM 7 (чи це те, що ти мав на увазі?) Також: 1. Я не впевнений, як давно там був, але зараз існує також -Ogla GCC; 2. Чи все ще необхідні всі особливості для старих версій? 3. Я думаю, враховуючи приємні зміни, які були зроблені протягом багатьох років, і статус спільноти, я зріжу свою відповідь лише на згадування таких речей, як clang -cc1 -mllvm -help-list-hidden(якщо ви не хочете їх інтегрувати).
Джефф Ніксон,

15

Відповідь Антуана (та інше запитання пов’язане) точно описує ввімкнені оптимізації 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 -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 -asumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost-al -ways -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threadading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-спростити -lcssaloop -rotate -licm -loop-unswitch -instcombine -scalar-evolution -loop-up спростити -lcssa -indvars -loop-idiom -loop-deletion -function_tti -loop-unroll -memdep -memcpyopt -sccp -domtree -instcombine -lazy-value -інформація -скокове-потокове -корельоване-розповсюдження -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-upprosti -lcssa -branch-prob -block-freq -scalar-evolution -loop -векторизувати -комбінат-simplifycfg -domtree -instcombine -oops -loop-up спростити -lcssa -scalar-evolution-function_tti -oop-unroll -alignment-from-pretpostavки -strip-dead-prototypes -verify -verify-di

-O2 база на -O1

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

і видаляє: -завжди-вбудований

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

додати: -argpromotion

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.