Clang Optimierungsstufen

Auf gcc erklärt das Handbuch , was -O3 , -Os usw. in Bezug auf bestimmte Optimierungsargumente ( -funswitch-loops , -fcompare-elim usw.) übersetzt.

Ich bin auf der Suche nach den gleichen Informationen für Clang .

Ich habe online geschaut und im man clang das gibt nur allgemeine Informationen ( -O2 optimiert mehr als -O1 , -Os optimiert auf Geschwindigkeit, …) und schaute auch hier auf Stack Overflow und fand dies , aber ich habe nichts Relevantes gefunden in den zitierten Quelldateien.

Bearbeiten: Ich habe eine Antwort gefunden, aber ich bin immer noch interessiert, wenn jemand einen Link zu einem Benutzerhandbuch hat, das alle Optimierungsdurchläufe und die von -O x ausgewählten Durchgänge dokumentiert. Momentan habe ich gerade diese Liste von Pässen gefunden, aber nichts auf Optimierungsebenen.

Solutions Collecting From Web of "Clang Optimierungsstufen"

Ich habe diese verwandte Frage gefunden.

Um es zusammenzufassen, erfahren Sie mehr über die Compiler-Optimierung:

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

Wie in der Antwort von Geoff Nixon (+1) gezeigt, führt clang zusätzlich einige Optimierungen auf höherer Ebene durch, die wir abrufen können:

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

Die Dokumentation der einzelnen Pässe ist hier verfügbar.



Mit Version 3.8 sind die Pässe wie folgt:

  • Basislinie ( -O0 ):

    • opt Sets : -targetlibinfo -tti -verify
    • clang fügt hinzu : -mdisable-fp-elim -relax-all
  • -O1 basiert auf -O0

    • opt fügt hinzu : -globalopt -demanded-bits -branch-prob-infresser -ipsccp -dse -loop-simplify -scoped-noalias -barriere -adce -deadargelim -memdep -lic -globals -aa -rpo-funktionattras -basiccg -loop- idiom -forceattrs -memoleg -simplifycfg -early-cse -instcombine -scp -loop-unswitch -loop-vectorize -tailcallelim -funktionsattraktoren -loop-zugänge -memcpyopt -loop-deletion -reassociate-strip-dead-prototypen -loops -basicaa- correlated-propagation -lcssa -dom -tree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-annahmen -lazy-value-info -prune-eh -jump-threading - loop-rotate -indvars -bdce -scalar-evolution -tbaa -anwesenheits-cache-tracker
    • clang fügt hinzu : -momit-leaf-frame-pointer
    • Klangtropfen: -mdisable-fp-elim -relax-all
  • -O2 basiert auf -O1

    • opt fügt hinzu : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • opt drops : -immer-inline
    • clang fügt hinzu : -vectorize-loops -vectorize-slp
  • -O3 basiert auf -O2

    • opt fügt hinzu : -argpromotion
  • -Ofast basiert auf -O3 , gültig in clang aber nicht in opt

    • clang fügt hinzu : -fno-signed-zeros -reziprok-math -ffp-contract = schnell -fähig-unsichere-fp-math -manable-no-nans -manable-no-infs
  • -Os ist das gleiche wie -O2

  • -Oz basiert auf -Os

    • opt fällt : -slp-vectorizer
    • Klangtropfen: -vectorize-loops


Mit Version 3.7 sind die Pässe wie folgt (geparste Ausgabe des obigen Befehls):

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

  • -O1 basiert auf -O0

    • fügt hinzu : -sccp -loop-simplify -float2int -lazy-wert-info -korrelierte-ausbreitung -bdce -lcssa -deadargelim -loop-ausrollen -loop-vektorisieren -barriere -memcpyopt -loop-zugriffs-aufnahme-cache-tracker -reassociate -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -lic -prune-eh -loop-unswitch -ausrichtung-von-annahmen -erober-cse -inline -cost -simplifycfg -strip-dead-prototypen -tbaa -roa -no-aa -adce -funktionsattraktionen -niedriger-erwarten -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep-immer-inline
  • -O2 basiert auf -01

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

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

  • -Oz basiert auf -Os

    • Entfernt: -slp-Vektorizer


Für Version 3.6 sind die Pässe wie in GYUNGMIN KIM's Post dokumentiert.


Mit Version 3.5 sind die Pässe wie folgt (geparste Ausgabe des obigen Befehls):

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

  • -O1 basiert auf -O0

    • fügt hinzu : -correlated-propagation -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barriere -block-freq -loop-vereinfachen -loop-vectorize -inline-kosten -branch-prob -early-cse -lazy-Wert-Info -loop-rotate-strip-dead-Prototypen -loop-Deletion -tbaa -prune-eh -indvars -loop-unroll -reassociate -loops -scpp-immer-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-erwarten -lic -loop-idiom -adce -domtree -lcssa
  • -O2 basiert auf -01

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

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

  • -Oz basiert auf -Os

    • Entfernt: -slp-Vektorizer


Mit Version 3.4 sind die Pässe wie folgt (geparste Ausgabe des obigen Befehls):

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

  • -O1 basiert auf -O0

    • fügt hinzu : -adce -always-inline -basicaa -basiccg -korrelierte-propagation -deadargelim -dse -early-cse -funktionsattribute -globalopt -indvars -inline-cost -instcombine -ipsccp -jump-threading -lazy-value-info -lcssa -lic -loop-deletion -loop-idiom -loop-rotate -loop-vereinfachen -loop-unroll -loop-unswitch -loops -lower-erwarten -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolution -scp -simplifycfg -sroa -strip-dead-prototypen -tailcallelim -tbaa
  • -O2 basiert auf -01

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

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

  • -Oz basiert auf -O2

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


Mit Version 3.2 sind die Pässe wie folgt (geparste Ausgabe des obigen Befehls):

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

  • -O1 basiert auf -O0

    • fügt hinzu : -sroa -early-cse -nieder-erwarten -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -simplify-libcalls -lazy-value -info -jump-threading -korreliert-propagation -tailcallelim -reassociate -loops -loop-vereinfachen -lcssa -loop-rotieren -licm -loop-unswitch -skalar-evolution -indvars -loop-idiom -loop-löschen -loop-ausrollen -memdep -memcpyopt -scp-dse -adce-strip-dead-prototypen
  • -O2 basiert auf -01

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

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

  • -Oz ist identisch mit -Os


Edit [März 2014] entfernt Duplikate aus Listen.

Edit [April 2014] hinzugefügt Dokumentation Link + Optionen für 3.4

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

Edit [Dezember 2015] fügte Optionen für 3.7 hinzu und erwähnt existierende Antworten für 3.6

Edit [Mai 2016] Optionen für 3.8 hinzugefügt, sowohl für opt als auch für clang und Erwähnung existierender Antworten für clang (versus opt)

@ Antoines Antwort (und die andere verknüpfte Frage) beschreibt genau die LLVM- Optimierungen, die aktiviert sind, aber es gibt einige andere Clang-spezifische Optionen (dh diejenigen, die Auswirkungen auf die AST haben), die von -O[0|1|2|3|fast] betroffen sind -O[0|1|2|3|fast] flags.

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 ermöglicht -mrelax-all , -O1 -vectorize-loops und -vectorize-slp und -Ofast -menable-no-infs , -menable-no-nans , -menable-unsafe-fp-math , -ffp-contract=fast und -ffast-math .


@Techogrebo:

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

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

Außerdem gibt es eine Menge detailliertere Optionen, die Sie mit Clang alleine untersuchen / ändern können … Sie müssen nur wissen, wie Sie zu ihnen kommen können!

Probieren Sie ein paar aus:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help

LLVM 3.6 -O1

Argumente übergeben: -targetlibinfo -no-aa -tbaa -scoped-noalias-Annahme-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-wert-info -jump-threading -korreliert-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify – lcssa -loop-rotieren -licm -loop-unswitch -instcombine -scalar-evolution -loop-vereinfachen -lcssa -indvars -loop-idiom -loop-löschen -funktion_tti -loop-ausrollen -memdep -memcpyopt -scp -domtree -instcombine – lazy-value-info -jump-threading -korreliert-propagieren -domtree -memdep -dse -adce -simplifycfg -domtree -instcombined -barrier -domtree -loops -loop-vereinfachen -lcssa -branch-prob -block-freq -scalar- evolution -loop-vectorize -instcombine -simplifycfg -domtree -instcombine -loops -loop-vereinfachen -lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-a ssumptions -strip-dead-prototypen -verify -verify-di

-O2 Basis auf -O1

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

und entfernt: -always-inline

-O3 basierend auf -O2

füge hinzu: -argpromotion