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), clang
dodatkowo 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:
W wersji 3.8 przepustki są następujące:
linia bazowa ( -O0
):
opt
zestawy : -targetlibinfo -tti -verify
clang
dodaje : -mdisable-fp-elim -mrelax-all
-O1
oparta jest na -O0
opt
dodaje : -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
clang
dodaje : -momit-leaf-frame-pointer
clang
krople : -mdisable-fp-elim -mrelax-all
-O2
oparta jest na -O1
opt
dodaje : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
opt
krople : -always-inline
clang
dodaje : -vectorize-loops -vectorize-slp
-O3
oparta jest na -O2
opt
dodaje : -argpromotion
-Ofast
jest oparty na -O3
, ważny w, clang
ale nie wopt
clang
dodaje : -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
opt
krople : -slp-wektoryzator
clang
krople : -vectorize-pętle
W wersji 3.7 przebiegi są następujące (przeanalizowane wyjście powyższego polecenia):
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):
W wersji 3.4 przebiegi są następujące (przeanalizowane wyjście powyższego polecenia):
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
-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
-simplifycfg
są powtarzane?simplifycfg
jest wymagane przez wiele przebiegów. Idebug-pass=Arguments
prawdopodobnie dzieje się to przed deduplikacją. Usunąłem duplikaty mojej odpowiedzi, dziękuję za Twoją opinię.-Og
a 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 rzeczyclang -cc1 -mllvm -help-list-hidden
(chyba że wolisz to zintegrować).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,
-O0
pozwala-mrelax-all
,-O1
umożliwia-vectorize-loops
i-vectorize-slp
, i-Ofast
pozwala-menable-no-infs
,-menable-no-nans
,-menable-unsafe-fp-math
,-ffp-contract=fast
i-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
źródło
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
źródło