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 clang
zusä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:
Mit Version 3.8 lauten die Pässe wie folgt:
In Version 3.7 lauten die Durchläufe wie folgt (analysierte Ausgabe des obigen Befehls):
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):
In Version 3.4 lauten die Durchläufe wie folgt (analysierte Ausgabe des obigen Befehls):
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
-simplifycfg
wiederholt?simplifycfg
für mehrere Durchgänge erforderlich ist. Unddebug-pass=Arguments
passiert wahrscheinlich vor der Deduplizierung. Ich habe die Duplikate in meiner Antwort entfernt, danke für Ihr Feedback.-Og
jetzt 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ähnenclang -cc1 -mllvm -help-list-hidden
(es sei denn, Sie möchten es lieber integrieren).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
-O0
ermöglicht-mrelax-all
,-O1
ermöglicht-vectorize-loops
und-vectorize-slp
, und-Ofast
ermöglicht es-menable-no-infs
,-menable-no-nans
,-menable-unsafe-fp-math
,-ffp-contract=fast
und-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
quelle
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
quelle