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 listę przejść, ale nic na poziomie optymalizacji.

Author: Community, 2013-03-21

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 w clang, ale nie w opt

    • 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 w clang, ale nie w opt

    • 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

 164
Author: Antoine,
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

 16
Author: Geoff Nixon,
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

 3
Author: GYUNGMIN KIM,
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