Poziomy optymalizacji Clang

95

Na gcc, instrukcja wyjaśnia, co -O3, -Ositp tłumaczyć w kategoriach argumenty specyficzne Optimization ( -funswitch-loops, -fcompare-elimetc.)

Szukam tych samych informacji dla clang .

Zajrzałem do Internetu, w man clangktórym podano tylko ogólne informacje ( -O2optymalizuje więcej niż -O1, -Osoptymalizuje pod kątem szybkości,…), a także spojrzałem tutaj na przepełnienie stosu i znalazłem to , ale nie znalazłem nic istotnego w cytowanych plikach źródłowych.

Edycja: znalazłem odpowiedź, ale nadal jestem zainteresowany, czy ktoś ma link do instrukcji obsługi dokumentującej wszystkie przebiegi optymalizacyjne i wybrane przez . Obecnie właśnie znalazłem listę przejść, ale nic na poziomach optymalizacji.-Ox

Antoine
źródło

Odpowiedzi:

160

Znalazłem to powiązane pytanie.

Podsumowując, aby dowiedzieć się o przebiegach optymalizacji kompilatora:

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

Jak wskazano w odpowiedzi Geoffa Nixona (+1), clangdodatkowo uruchamia kilka optymalizacji wyższego poziomu, które możemy pobrać za pomocą:

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

Dokumentacja poszczególnych karnetów dostępna jest tutaj .



W wersji 6.0 przepustki są następujące:

  • linia bazowa ( -O0):

    • optzestawy : -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clangdodaje : -mdisable-fp-elim -mrelax-all
  • -O1 oparta jest na -O0

    • opt dodaje:-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 -branch-prob -lazy-block-freq -opt-note-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa -speculative-wykonanie -lazy-value-info -jump-threading -correlated-propagation -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-simplify -lcssa-weryfikacja -lcssa -scalar-evolution -loop-rotate -licm -loop-unswitch -indvars -loop-idiom -loop-deletion -loop-unroll -memdep -memcpyopt -sccp -demanded-bits -bdce -dse -postdomtree -adce -barrier -rpo-functionattrs -globaldce -float2int -loop-accesses -loop-distribute-loop-vectorize -loop-load-elim -alignment-from-assptions -strip-dead-prototypes -loop-sink -instsimplify -div-rem-par -verify -ee-instrument -early-cse -lower-oczekiwać
    • clangdodaje : -momit-leaf-frame-pointer
    • clangkrople : -mdisable-fp-elim -mrelax-all
  • -O2 oparta jest na -O1

    • optdodaje : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • optkrople : -always-inline
    • clangdodaje : -vectorize-loops -vectorize-slp
  • -O3 oparta jest na -O2

    • optdodaje : -callsite-splitting -argpromotion
  • -Ofastjest oparty na -O3, ważny w, clangale nie wopt

    • clangdodaje : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-tylko matematyka
  • -Os jest podobne do -O2

    • optdrops : -libcalls-shrinkwrap i -pgo-memopt-opt
  • -Oz oparta jest na -Os

    • optkrople : -slp-wektoryzator

W wersji 3.8 przepustki są następujące:

  • linia bazowa ( -O0):

    • optzestawy : -targetlibinfo -tti -verify
    • clangdodaje : -mdisable-fp-elim -mrelax-all
  • -O1 oparta jest na -O0

    • optdodaje : -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 -cororated -propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-oczekiwać -sroa -loop-unroll -alignment-from-assptions -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clangdodaje : -momit-leaf-frame-pointer
    • clangkrople : -mdisable-fp-elim -mrelax-all
  • -O2 oparta jest na -O1

    • optdodaje : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optkrople : -always-inline
    • clangdodaje : -vectorize-loops -vectorize-slp
  • -O3 oparta jest na -O2

    • optdodaje : -argpromotion
  • -Ofastjest oparty na -O3, ważny w, clangale nie wopt

    • clangdodaje : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os jest taki sam jak -O2

  • -Oz oparta jest na -Os

    • optkrople : -slp-wektoryzator
    • clangkrople : -vectorize-pętle


W wersji 3.7 przebiegi są następujące (przeanalizowane wyjście powyższego polecenia):

  • domyślnie (-O0): -targetlibinfo -verify -tti

  • -O1 bazuje na -O0

    • dodaje : -sccp -loop-simplify -float2int -lazy-value-info -correlated-propagation -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 -alignment-from-assptions -early-cse -inline -cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-oczekiwać -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep -always-inline
  • -O2 jest oparte na -01

    • dodaje : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • usuwa : -always-inline
  • -O3 bazuje na -O2

    • dodaje : -argpromotion -verif
  • -Os jest identyczne z -O2

  • -Oz jest oparte na -Os

    • usuwa : -slp-vectorizer


W przypadku wersji 3.6 przepustki są zgodne z dokumentacją w poście GYUNGMIN KIM.


W wersji 3.5 przebiegi są następujące (przeanalizowane wyjście powyższego polecenia):

  • domyślnie (-O0): -targetlibinfo -verify -verify-di

  • -O1 bazuje na -O0

    • dodaje : -correlated-propagation -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-oczekiwać -licm -loop-idiom -adce -domtree -lcssa
  • -O2 jest oparte na -01

    • dodaje : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • usuwa : -always-inline
  • -O3 bazuje na -O2

    • dodaje : -argpromotion
  • -Os jest identyczne z -O2

  • -Oz jest oparte na -Os

    • usuwa : -slp-vectorizer


W wersji 3.4 przebiegi są następujące (przeanalizowane wyjście powyższego polecenia):

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

  • -O1 bazuje na -O0

    • dodaje : -adce -always-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-oczekiwać -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -O2 jest oparte na -01

    • dodaje : -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • usuwa : -always-inline
  • -O3 bazuje na -O2

    • dodaje : -argpromotion
  • -Os jest identyczne z -O2

  • -Oz bazuje na -O2

    • usuwa : -barrier -loop-vectorize -slp-vectorizer


W wersji 3.2 przebiegi są następujące (przeanalizowane wyjście powyższego polecenia):

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

  • -O1 bazuje na -O0

    • dodaje : -sroa -early-cse -lower-oczekiwać -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -simplify-libcalls -lazy-value -info -jump-threading -correlated-propagation -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 jest oparte na -01

    • dodaje : -inline -globaldce -constmerge
    • usuwa : -always-inline
  • -O3 bazuje na -O2

    • dodaje : -argpromotion
  • -Os jest identyczne z -O2

  • -Oz jest identyczne z -Os


Edycja [marzec 2014] usunęła duplikaty z list.

Edycja [kwiecień 2014] dodano link do dokumentacji + opcje dla 3.4

Edycja [wrzesień 2014] dodano opcje dla wersji 3.5

Edit [grudzień 2015] dodał opcje dla wersji 3.7 i wspomnij o istniejącej odpowiedzi dla wersji 3.6

Edytuj [maj 2016] dodano opcje dla wersji 3.8, zarówno dla opt, jak i clang oraz wspomnij o istniejącej odpowiedzi na clang (versus opt)

Edytuj [listopad 2018] dodaj opcje dla wersji 6.0

Antoine
źródło
2
Czy można to zrobić w wersji Clang, która jest dostarczana z XCode5? Próbowałem znaleźć polecenie llvm-as, ale nigdzie nie ma go na moim komputerze
Teknogrebo
@Antoine, dlaczego niektóre flagi, takie jak, -simplifycfgsą powtarzane?
Paschalis
2
@Paschalis: Nie jestem pewien, ale ponieważ niektóre przebiegi optymalizacji działają tylko wtedy, gdy zostały uruchomione inne przebiegi, na przykład simplifycfgjest wymagane przez wiele przebiegów. I debug-pass=Argumentsprawdopodobnie dzieje się to przed deduplikacją. Usunąłem duplikaty mojej odpowiedzi, dziękuję za Twoją opinię.
Antoine
5
Niektóre optymalizacje tworzą rzeczy, które można dalej optymalizować (martwy kod itp.), Więc może być sensowne ponowne uruchomienie niektórych przebiegów optymalizacji.
cyco130
1
@ZachB / @Antoine Dlaczego nie (też?) LLVM 7 (czy to miałeś na myśli?) Ponadto: 1. Nie jestem pewien, jak długo tam był, ale teraz jest też -Oga la GCC; 2. Czy wszystkie szczegóły dotyczące starszych wersji są nadal potrzebne? 3. Myślę, że biorąc pod uwagę niezłe zmiany, które zostały wprowadzone przez lata i status społeczności, ograniczę się do przytoczenia takich rzeczy clang -cc1 -mllvm -help-list-hidden(chyba że wolisz to zintegrować).
Geoff Nixon
16

Odpowiedź @ Antoine'a (i inne powiązane pytanie) dokładnie opisuje optymalizacje LLVM, które są włączone, ale istnieje kilka innych opcji specyficznych dla Clang (tj. Tych, które wpływają na obniżenie do AST), na które wpływają -O[0|1|2|3|fast]flagi.

Możesz się im przyjrzeć za pomocą:

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 -\#\#\#

Na przykład, -O0pozwala -mrelax-all, -O1umożliwia -vectorize-loopsi -vectorize-slp, i -Ofastpozwala -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fasti -ffast-math.


@Techogrebo:

Tak, nie, niekoniecznie potrzebujesz innych narzędzi LLVM. Próbować:

echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options

Ponadto istnieje wiele bardziej szczegółowych opcji, które możesz sprawdzić / zmodyfikować za pomocą samego Clang ... po prostu musisz wiedzieć, jak do nich dotrzeć!

Wypróbuj kilka z:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help

Geoff Nixon
źródło
3

LLVM 3,6 -O1

Przekaż argumenty:-targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -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-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-from-assptions -strip-dead-prototypes -verify -verify-di

-O2 baza na -O1

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

i usuwa: -always-inline

-O3 w oparciu o -O2

dodaj: -argpromotion

GYUNGMIN KIM
źródło