Poziomy optymalizacji Clang
Na gcc, Instrukcja wyjaśnia, co -O3
, -Os
, itd. przełożyć na konkretne argumenty optymalizacyjne (-funswitch-loops
, -fcompare-elim
, itd.)
szukam tych samych informacji dla clang .
Szukałem w Internecie i w man clang
który podaje tylko ogólne Informacje (-O2
optymalizuje więcej niż -O1
, -Os
optymalizuje prędkość,...) a także zajrzałem tutaj na Stack Overflow i znalazłem to , ale nie znalazłem nic istotnego w cytowane pliki źródłowe.
Edit: znalazłem odpowiedź, ale jestem nadal zainteresowany jeśli ktoś ma link do instrukcji obsługi dokumentującej wszystkie przejścia optymalizacyjne i przejścia wybrane przez -Ox
. Obecnie znalazłem tę listę przejść, ale nic na poziomie optymalizacji.
3 answers
Znalazłem to powiązane pytanie.
Podsumowując, aby dowiedzieć się o optymalizacji kompilatora:
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
Jak wskazano wGeoff Nixon 'S odpowiedź (+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 jest dostępna tutaj .
Z Wersja 6.0 przebieg jest następujący:
-
(
-O0
):-
opt
sets: -tti-verify-ee-instrument-targetlibinfo-assumption-cache-tracker-profile-summary-info-forceattrs-basiccg-always-inline-barrier -
clang
dodaje: - mdisable-fp-elim-mrelax-all
-
-
-O1
opiera się na-O0
-
opt
dodaje: -targetlibinfo-tti-tbaa-scoped-noalias-assumption-cache-tracker-profile-summary-info-forceattrs-infinitrs -ipsccp -called-value-propagation-globalopt-domtree-mem2reg-deadargelim-basicaa-aa-loops-lazy-branch-prob-lazy-block-freq-opt-remark-emiter-instcombine-simplifycfg-basiccg-globals-aa-prune-eh-always-inline-functrs-sroa-memoryssa-early-CSE-memssa-speculative-execution-lazy-value-info-jump-threading-correlated-propagacja-libcalls-Shrinkwrap-Branch-prob-Block-freq-PGO-memop-opt-tailcallelim-resocjalizuj-loop-simplify-lcssa-verification-lcssa-scalar-Evolution -loop-rotate-licm-loop-unswitch-indvars-loop-idiom-loop-delesion-loop-unroll-memdep-memcpyopt-sccp-requested-bits-bdce-DSE-postdomtree-adce-barrier-RPO-functionattrs-globaldce-float2int-loop-accesses-loop-distribute-loop-vectorize-loop-load-elim-alignment-from-Assemblies-strip-dead-prototypy-loop-sink-instsimplify-div-REM-pairs-verify-EE-instrument-Early-CSE-lower-expect -
clang
dodaje: - momit-leaf-frame-pointer -
clang
drops: - mdisable-fp-elim-mrelax-all
-
-
-O2
opiera się na-O1
-
opt
dodaje: - inline-mldst-motion-gvn-elim-avail-extern-slp-vectorizer-constmerge -
opt
krople : - zawsze-inline -
clang
dodaje: - vectorize-loops-vectorize-slp
-
-
-O3
opiera się na-O2
-
opt
dodaje: - callsite-splitting - argpromotion
-
-
-Ofast
jest oparty na-O3
, ważny wclang
, ale nie wopt
-
clang
w przeciwieństwie do tego, w jaki sposób można uzyskać dostęp do Internetu, w jaki sposób można korzystać z Internetu, w jaki sposób można uzyskać dostęp do Internetu.]}
-
-
-Os
jest podobny do-O2
-
opt
krople: - libcalls-shrinkwrap i -PGO-memopt-opt
-
-
-Oz
opiera się na-Os
-
opt
krople : - slp-vectorizer
-
Z Wersja 3.8 przepustki są następujące:
-
(
-O0
):-
opt
sets: - targetlibinfo-tti-verify -
clang
dodaje: - mdisable-fp-elim-mrelax-all
-
-
-O1
opiera się na-O0
-
opt
dodaje: -globalopt-requested-bits-branch-prob-inferattrs-ipsccp-DSE-loop-simplify-scoped-noalias-barrier-adce-deadargelim-memdep-licm-globals-aa-RPO-functions-basiccg-loop-idiom-forceattrs-mem2reg-simplifycfg-early-cse-instcombine-sccp-loop-unswitch-loop-vectorize-tailcallelim-functionattrs-loop-accesses-memcpyopt-loop-delesion-resocjate-strip-Dead-prototypy-loops-basicaa-correlated-propagation-lcssa-domtree w 2009 roku firma S. A. wprowadziła do swojej oferty nowe rozwiązania, które umożliwiły jej wdrożenie w 2009 roku nowych technologii, takich jak np.: budowa, budowa, budowa, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja, modernizacja]} -
clang
dodaje: - momit-leaf-frame-pointer -
clang
drops: - mdisable-fp-elim-mrelax-all
-
-
-O2
opiera się na-O1
-
opt
dodaje: - elim-avail-extern -mldst-motion-slp-vectorizer-gvn-inline-globaldce-constmerge -
opt
krople : - zawsze-inline -
clang
dodaje: - vectorize-loops-vectorize-slp
-
-
-O3
opiera się na-O2
-
opt
dodaje : - argpromotion
-
-
-Ofast
jest oparty na-O3
, ważny wclang
, ale nie wopt
-
clang
dodaje: - FNO-signed-zeros w 2007 roku, po raz pierwszy w historii, w Polsce, w Polsce, w 2008 roku, w Polsce, w 2009 roku, w Polsce, w 2009 roku, w Polsce, w 2009 roku, w Polsce, w 2009 roku, w Polsce, w 2009 roku, w Polsce, w 2009 roku, w 2009 roku.]}
-
-Os
jest taki sam jak-O2
-
-Oz
opiera się na-Os
-
opt
krople : - slp-vectorizer -
clang
drops : - vectorize-loops
-
Z w wersji 3.7 przebieg jest następujący (przetwarzane wyjście polecenia powyżej):
-
Default (- O0): - targetlibinfo-verify-tti
-
- O1 opiera się na-O0
- dodaje: -sccp-loop-simplify-float2int-lazy-value-info-correlated-propagacja-bdce-lcssa-deadargelim-loop-unroll-loop-vectorize-barrier-memcpyopt-loop-accesses-assumption-cache-tracker-resocjalizuj-loop-delesion-branch-prob-jump-threading-domtree-DSE-loop-rotate-ipsccp-instcombine-scoped-noalias-licm-śliwka-EH w 2009 roku firma została założona przez firmę tbaa, która od 2009 roku zajmuje się dystrybucją i dystrybucją sprzętu komputerowego, a od 2009 roku zajmuje się dystrybucją sprzętu komputerowego i oprogramowania komputerowego.]}
-
- O2 opiera się na -01
- dodaje: -elim-avail-extern-globaldce-inline-constmerge-mldst-motion-gvn-slp-vectorizer
- usuwa : - zawsze-inline
-
- O3 opiera się na-O2
- dodaje: - argpromotion-verif
-
-Os jest identyczny z-O2
-
- Oz opiera się na-Os
- usuwa :- slp-vectorizer
Dla Wersja 3.6 przepustki są udokumentowane w poście GYUNGMIN Kima.
Z Wersja 3.5 przepustki są następujące (przetwarzane wyjście polecenia powyżej):
Default (- O0):- targetlibinfo-verify-verify-di
-
- O1 opiera się 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-prototypy-loop-deletion w 2011 roku w ramach programu "Horyzont 2020" w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 "Horyzont 2020" - program ramowy Horyzont 2020 w ramach programu Horyzont 2020 w ramach programu Horyzont 2020 "Horyzont 2020" - program ramowy Horyzont 2020 w ramach programu Horyzont 2020 "Horyzont 2020" -program ramowy Horyzont 2020 w ramach programu Horyzont 2020 "Horyzont 2020" - program ramowy Horyzont 2020]}
-
- O2 opiera się na -01
- dodaje: -gvn-constmerge-globaldce-slp-vectorizer-mldst-motion-inline
- usuwa :- zawsze-inline
-
- O3 opiera się na -O2
- dodaje: - argpromotion
-
-Os jest identyczny z-O2
-
- Oz opiera się na-Os
- usuwa :- slp-vectorizer
Z Wersja 3.4 przebieg jest następujący (przetwarzane wyjście polecenia powyżej):
-
-O0: - targetlibinfo-preverify-domtree-verify
-
- O1 opiera się 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-delete-loop-idiom-loop-rotate-loop-simplify-loop-unroll-loop-unswitch-loops-lower-expect-memcpyopt-memdep-no-AA-notti-prune-EH-resocjalizuj-scalar-Evolution-SCCP-simplifycfg-sroa-strip-Dead-prototypy-tailcallim - tbaa
-
- O2 opiera się na -01
- dodaje: -barrier-constmerge-domtree-globaldce-gvn-inline-loop-vectorize-preverify-slp-vectorizer-targetlibinfo-verify
- usuwa :- zawsze-inline
-
- O3 opiera się na-O2
- dodaje: - argpromotion
-
-Os jest identyczny z-O2
-
- Oz opiera się na -O2
- usuwa: - barrier-loop-vectorize-slp-vectorizer
Z Wersja 3.2 przebieg jest następujący (przetwarzane wyjście polecenia powyżej):
-
-O0: - targetlibinfo-preverify-domtree-verify
-
- O1 opiera się na-O0
- dodaje: -sroa-early-cse-lower-expect-no-aa-tbaa-basicaa-globalopt-ipsccp-deadargelim-instcombine -simplifycfg-basiccg-prune-eh-always-inline-functrs-simplify-libcalls-lazy-value-info-jump-threading-correlated-propagation-tailcallelim-resocjalizuj-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-prototypy
-
- O2 opiera się na -01
- dodaje : - inline-globaldce - konstmerge
- usuwa :- zawsze-inline
-
- O3 opiera się na-O2
- dodaje: - argpromotion
-
-Os jest identyczny z-O2
-
-Oz jest identyczny z-Os
Edytuj [marzec 2014] usunięto duplikaty z list.
Edytuj [Kwiecień 2014] Dodano link do dokumentacji + opcje dla 3.4
Edytuj [wrzesień 2014] dodano opcje dla 3.5
Edytuj [Grudzień 2015] dodano opcje dla 3.7 i wymienić istniejącą odpowiedź dla 3.6
Edytuj [w 2016 roku, po raz pierwszy na rynku pojawiła się nowa wersja clang, która została wprowadzona w 2016 roku.]}
Edytuj [listopad 2018] Dodaj opcje dla 6.0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-05 05:03:12
@Antoine ' s answer (and the other question linked) dokładnie opisuje LLVM optymalizacje, które są włączone, ale istnieje kilka innych opcji specyficznych dla Clang (tj. tych, które wpływają na obniżenie do AST), które mają wpływ na flagi -O[0|1|2|3|fast]
.
Możesz na nie spojrzeć 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
umożliwia -mrelax-all
, -O1
umożliwia -vectorize-loops
i -vectorize-slp
oraz -Ofast
umożliwia -menable-no-infs
, -menable-no-nans
, -menable-unsafe-fp-math
, -ffp-contract=fast
i -ffast-math
.
@Techogrebo:
Tak, nie koniecznie potrzebują innych narzędzi LLVM. Spróbuj:
echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options
Ponadto, istnieje wiele bardziej szczegółowych opcji, które można zbadać / zmodyfikować za pomocą samego Clang... musisz tylko wiedzieć, jak się do nich dostać!
Spróbuj kilka z:
clang -help
clang -cc1 -help
clang -cc1 -mllvm -help
clang -cc1 -mllvm -help-list-hidden
clang -cc1as -help
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-20 04:09:50
LLVM 3.6 - O1
Argumenty Pass: -targetlibinfo-no-aa-tbaa-scoped-noalias-assumption-cache-tracker-basicaa-notti-verify-di-ipsccp-globalopt-deadargelim-domtree-instcombine-simplifycfg-basiccg-prune-EH-inline-cost-always-inline-functionattrs-sroa-domtree-early-cse-lazy-value-info-jump-threading-correlated-propagation-Simplifycfg-domtree-instcombine-tailcallelim-simplifycfg-resocjate-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-from-Assemblies-strip-dead-prototypy-verify-verify-di
-Baza O2 na-o1
Dodaj : -inline-mldst-motion-domtree-memdep-GVN-memdep-scalar-evolution-slp-vectorizer-globaldce-constmerge
I usuwa: - zawsze-inline
-O3 na bazie -O2
Dodaj: - argpromotion
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 07:14:50