Optimierungsstufen klirren

90

Auf gcc, das Handbuch erklärt , was -O3, -Osetc. übersetzen zu in Bezug auf spezifische Optimierung Argumente ( -funswitch-loops, -fcompare-elimusw.)

Ich suche die gleichen Informationen für Clang .

Ich habe sehe Online und in man clangdenen gibt nur allgemeine Informationen ( -O2optimiert mehr als -O1, -Osoptimiert für die Geschwindigkeit, ...) und auch hier auf Stack - Überlauf gesucht und gefunden dies , aber ich habe nichts relevant in den genannten Quelldateien gefunden.

Bearbeiten: Ich habe eine Antwort gefunden, bin aber immer noch interessiert, ob jemand einen Link zu einem Benutzerhandbuch hat, in dem alle Optimierungsdurchläufe und die von ausgewählten Ausweise dokumentiert sind . Derzeit habe ich gerade diese Liste von Durchläufen gefunden, aber nichts auf Optimierungsstufen.-Ox

Antoine
quelle

Antworten:

155

Ich habe diese verwandte Frage gefunden.

Um es zusammenzufassen und sich über Compiler-Optimierungsdurchläufe zu informieren:

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

Wie in Geoff Nixons Antwort (+1) ausgeführt, werden clangzusätzlich einige Optimierungen auf höherer Ebene ausgeführt, die wir abrufen können mit:

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

Die Dokumentation der einzelnen Ausweise finden Sie hier .



Mit Version 6.0 lauten die Pässe wie folgt:

  • Grundlinie ( -O0):

    • optsetzt : -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg-immer-inline-barrier
    • clangfügt hinzu : -mdisable-fp-elim -mrelax-all
  • -O1 basiert auf -O0

    • opt fügt hinzu::-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 -zweig-prob -lazy-block-freq -opt-bemerkenswert-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh-immer-inline-functionattrs -sroa -memoryssa -early-cse-memssa -speculative-Ausführung -lazy-value-info -jump-threading -correlated-propagation -libcalls-shrinkwrap -branch-prob -block-freq -pgo-memop-opt -tailcallelim -reassociate -loop-simplify -lcssa-verification -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-verteilen-loop-vectorize -loop-load-elim -alignment-from-Annahmen -strip-dead-Prototypen -loop-sink -instsimplify -div-rem-Paare -verify -ee-instrument -early-cse -lower-erwarten
    • clangfügt hinzu : -momit-leaf-frame-pointer
    • clangTropfen : -mdisable-fp-elim -mrelax-all
  • -O2 basiert auf -O1

    • optfügt hinzu : -inline -mldst-motion -gvn -elim-available-extern -slp-vectorizer -constmerge
    • optTropfen :-immer-inline
    • clangfügt hinzu : -vectorize-loops -vectorize-slp
  • -O3 basiert auf -O2

    • optfügt hinzu : -callsite-splitting -argpromotion
  • -Ofastbasiert auf -O3, gültig in clangaber nicht inopt

    • clangfügt hinzu : -fno-signierte-Nullen -freciprocal-math -ffp-contract = schnell -menable-unsicher-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-math-only
  • -Os ist ähnlich wie -O2

    • optTropfen : -libcalls-shrinkwrap und -pgo-memopt-opt
  • -Oz basiert auf -Os

    • optTropfen : -slp-Vektorisierer

Mit Version 3.8 lauten die Pässe wie folgt:

  • Grundlinie ( -O0):

    • optsetzt : -targetlibinfo -tti -verify
    • clangfügt hinzu : -mdisable-fp-elim -mrelax-all
  • -O1 basiert auf -O0

    • optfügt hinzu : -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-accesses -memcpyopt -loop-deletion -reassociate -strip-dead-prototypes -loops -basicaa- -propagation -lcssa -domtree-immer-inline -aa -block-freq -float2int -lower-erwarten -sroa -loop-unroll -alignment-from-Annahmen -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clangfügt hinzu : -momit-leaf-frame-pointer
    • clangTropfen : -mdisable-fp-elim -mrelax-all
  • -O2 basiert auf -O1

    • optfügt hinzu : -elim-available-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optTropfen :-immer-inline
    • clangfügt hinzu : -vectorize-loops -vectorize-slp
  • -O3 basiert auf -O2

    • optfügt hinzu : -argpromotion
  • -Ofastbasiert auf -O3, gültig in clangaber nicht inopt

    • clangfügt hinzu : -fno-signierte-Nullen -freciprocal-math -ffp-contract = schnell -menable-unsicher-fp-math -menable-no-nans -menable-no-infs
  • -Os ist das gleiche wie -O2

  • -Oz basiert auf -Os

    • optTropfen : -slp-Vektorisierer
    • clangTropfen : -vectorize-Schleifen


In Version 3.7 lauten die Durchläufe wie folgt (analysierte Ausgabe des obigen Befehls):

  • Standard (-O0): -targetlibinfo -verify -tti

  • -O1 basiert auf -O0

    • fügt hinzu : -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -prune-eh -loop-unswitch -alignment-from-Annahmen -early-cse-inline -cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-erwarten -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep-immer-inline
  • -O2 basiert auf -01

    • fügt hinzu : -elim-available-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • entfernt : -imways-inline
  • -O3 basiert auf -O2

    • fügt hinzu : -argpromotion -verif
  • -Os ist identisch mit -O2

  • -Oz basiert auf -Os

    • entfernt : -slp-vectorizer


Für Version 3.6 sind die Ausweise wie im Beitrag von GYUNGMIN KIM dokumentiert.


In Version 3.5 lauten die Durchläufe wie folgt (analysierte Ausgabe des obigen Befehls):

  • Standard (-O0): -targetlibinfo -verify -verify-di

  • -O1 basiert auf -O0

    • fügt hinzu : -korrelierte-Ausbreitung -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-immer-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-erwarten -licm -loop-idiom -adce -domtree -lcssa
  • -O2 basiert auf -01

    • fügt hinzu : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • entfernt : -imways-inline
  • -O3 basiert auf -O2

    • fügt hinzu : -argpromotion
  • -Os ist identisch mit -O2

  • -Oz basiert auf -Os

    • entfernt : -slp-vectorizer


In Version 3.4 lauten die Durchläufe wie folgt (analysierte Ausgabe des obigen Befehls):

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

  • -O1 basiert auf -O0

    • fügt hinzu : -adce-immer-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-erwarten -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -O2 basiert auf -01

    • fügt hinzu : -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • entfernt : -imways-inline
  • -O3 basiert auf -O2

    • fügt hinzu : -argpromotion
  • -Os ist identisch mit -O2

  • -Oz basiert auf -O2

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


In Version 3.2 lauten die Durchläufe wie folgt (analysierte Ausgabe des obigen Befehls):

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

  • -O1 basiert auf -O0

    • fügt hinzu : -sroa -early-cse -lower-erwarten -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -imways-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-Prototypen
  • -O2 basiert auf -01

    • fügt hinzu : -inline -globaldce -constmerge
    • entfernt : -imways-inline
  • -O3 basiert auf -O2

    • fügt hinzu : -argpromotion
  • -Os ist identisch mit -O2

  • -Oz ist identisch mit -Os


Bearbeiten [März 2014] entfernte Duplikate aus Listen.

Bearbeiten [April 2014] Dokumentationslink + Optionen für 3.4 hinzugefügt

Bearbeiten [September 2014] Optionen für 3.5 hinzugefügt

Edit [Dezember 2015] fügte Optionen für 3.7 hinzu und erwähnte die vorhandene Antwort für 3.6

Bearbeiten [Mai 2016] fügte Optionen für 3.8 für opt und clang hinzu und erwähnte die vorhandene Antwort für clang (versus opt)

Bearbeiten [November 2018] Optionen für 6.0 hinzufügen

Antoine
quelle
2
Gibt es eine Möglichkeit, dies mit der mit XCode5 gelieferten Version von clang zu tun? Ich habe versucht, nach dem Befehl llvm-as zu suchen, aber er existiert auf meinem Computer nirgendwo, wo ich ihn sehen kann
Teknogrebo,
@Antoine, warum werden einige Flags wie -simplifycfgwiederholt?
Paschalis
2
@Paschalis: Ich bin mir nicht sicher, aber da einige Optimierungsdurchläufe nur funktionieren, wenn einige andere Durchläufe ausgeführt wurden, und dies beispielsweise simplifycfgfür mehrere Durchgänge erforderlich ist. Und debug-pass=Argumentspassiert wahrscheinlich vor der Deduplizierung. Ich habe die Duplikate in meiner Antwort entfernt, danke für Ihr Feedback.
Antoine
5
Einige Optimierungen erstellen Dinge, die weiter optimiert werden können (toter Code usw.). Daher ist es möglicherweise sinnvoll, einige Optimierungsdurchläufe erneut auszuführen.
Cyco130
1
@ZachB / @Antoine Warum nicht (auch?) LLVM 7 (oder haben Sie das gemeint?) Außerdem: 1. Ich bin mir nicht sicher, wie lange es schon da ist, aber es gibt -Ogjetzt auch a la GCC; 2. Sind noch alle Angaben zu den älteren Versionen erforderlich? 3. Ich denke, angesichts der netten Änderungen, die im Laufe der Jahre vorgenommen wurden, und des Community-Status werde ich meine Antwort darauf beschränken, nur Dinge wie zu erwähnen clang -cc1 -mllvm -help-list-hidden(es sei denn, Sie möchten es lieber integrieren).
Geoff Nixon
15

Die Antwort von @ Antoine (und die andere verknüpfte Frage) beschreiben genau die aktivierten LLVM- Optimierungen, es gibt jedoch einige andere Clang-spezifische Optionen (dh diejenigen, die sich auf das Absenken auf den AST auswirken), die von den -O[0|1|2|3|fast]Flags betroffen sind .

Sie können sich diese ansehen mit:

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

Zum Beispiel -O0ermöglicht -mrelax-all, -O1ermöglicht -vectorize-loopsund -vectorize-slp, und -Ofastermöglicht es -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fastund -ffast-math.


@ Techogrebo:

Ja, nein, die anderen LLVM-Tools sind nicht unbedingt erforderlich. Versuchen:

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

Außerdem gibt es viel detailliertere Optionen, die Sie allein mit Clang untersuchen / ändern können ... Sie müssen nur wissen, wie Sie zu ihnen gelangen!

Probieren Sie einige aus:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help

Geoff Nixon
quelle
3

LLVM 3.6 -O1

Argumente übergeben:-targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost-immer -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -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 -korrelierte-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-Annahmen -strip-dead-prototypes -verify -verify-di

-O2 basiert auf -O1

füge hinzu: -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge

und entfernt: -imways-inline

-O3 basierend auf -O2

hinzufügen: -argpromotion

GYUNGMIN KIM
quelle