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