Sur gcc, le manuel explique quoi -O3
, -Os
, etc. traduisent en termes d’arguments d’optimisation spécifiques (-funswitch-loops
, -fcompare-elim
, etc.)
Je recherche la même information pour clang.
J'ai regardé en ligne et dans man clang
qui ne donne que des informations générales (-O2
optimise plus que -O1
, -Os
optimise pour la vitesse,…) et a également regardé ici sur Stack Overflow et a trouvé this , mais je n'ai rien trouvé de pertinent dans les fichiers sources cités.
Edit: J'ai trouvé une réponse mais je suis toujours intéressé si quelqu'un a un lien vers une documentation manuelle toutes les passes d'optimisation et les passes sélectionnées par -Ox
. Actuellement, je viens de trouver ceci liste de passes, mais rien sur les niveaux d'optimisation.
J'ai trouvé this question connexe.
En résumé, pour en savoir plus sur les passes d’optimisation du compilateur:
llvm-as < /dev/null | opt -O3 -disable-output -debug-pass=Arguments
Comme indiqué dans la réponse de Geoff Nixon (+1), clang
exécute en outre des optimisations de niveau supérieur, que nous pouvons récupérer avec:
echo 'int;' | clang -xc -O3 - -o /dev/null -\#\#\#
La documentation des laissez-passer individuels est disponible ici .
Avec version 6.0 , les passes sont les suivantes:
baseline (-O0
):
opt
sets: -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrierclang
ajoute: -mdisable-fp-elim -mrelax-all-O1
est basé sur -O0
opt
ajoute: -targetlibinfo -tti -tbaa -scoped-noalias -assumption-cache-tracker -profile-summary-info -forceattrs -inferattrs -ipsccp-value-value - propagation -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remarque-emitter -instcombine -simplifycfg -basiccg -globals -a -Prune-eh -always- inline -functionattrs -sroa -memoryssa -early-cse-memssa -exécution-specifique -lazy-value-info -jump-threading -correlated-propagation -libcalls-shrinkwrap -branch-prob-block-freq-fre tailcallelim -associer -loop-simplifier -lcssa-vérification -lcssa -scalar-evolution -loop-rotation -licm -loop-unswitch -indvars -loop-idiome-suppression de boucle -loop-unroll -memdep -memcpyopt -scrp bits -bdce -dse -postdomtree -adce -barrier -barpo-functionattrs -globaldce -float2int -loop-accesses -loop-distribue -loop-vectorize -loop-load-elim-alignement-à partir de suppositions -passe-mort-prototypes - boucle-puits -instsimplify -div-rem-pairs -ve rify -ee-instrument -early-cse -lower-expectclang
ajoute: -momit-leaf-frame-pointeurclang
gouttes: -mdisable-fp-elim -mrelax-all-O2
est basé sur -O1
opt
ajoute: -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmergeopt
gouttes: toujours en ligneclang
ajoute: -vectorize-loops -vectorize-slp-O3
est basé sur -O2
opt
ajoute: -callsite-splitting -argpromotion-Ofast
est basé sur -O3
, valide dans clang
mais pas dans opt
clang
ajoute: -fno-signed-zéros -freciprocal-math -ffp-contract = rapide -menable-unsafe-fp-math -menable-no-nans -menable- no-infs -mreassociate -fno-trapping-math -ffast-math -ffinite-math-only-Os
est similaire à -O2
opt
gouttes: -libcalls-shrinkwrap et -pgo-memopt-opt-Oz
est basé sur -Os
opt
gouttes: -slp-vectorizerAvec version 3.8 , les passes sont les suivantes:
baseline (-O0
):
opt
sets: -targetlibinfo -tti -verifyclang
ajoute: -mdisable-fp-elim -mrelax-all-O1
est basé sur -O0
opt
ajoute: -globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-simplify -opoped-noalias -barrier -adce -deadargelim -deadargelim -memdep - licm -globals-aa -rpo-functionattrs -basiccg -loop-idiom -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-undwitch -mem2reg-simplifiercfg -early-cse -instcombine -sccp suppression - réassocier - prototypes de bandes mortes - boucles - basicaa - propagation de corrélation - lcssa - domaine - toujours-en-ligne -aa -block-freq -float2int -lower-expect -sroa -loop -looll-alignement-à partir de suppositions lazy-value-info -Prune-eh -jump-threading -loop-rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-trackerclang
ajoute: -momit-leaf-frame-pointeurclang
gouttes: -mdisable-fp-elim -mrelax-all-O2
est basé sur -O1
opt
ajoute: -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmergeopt
gouttes: toujours en ligneclang
ajoute: -vectorize-loops -vectorize-slp-O3
est basé sur -O2
opt
ajoute: -argpromotion-Ofast
est basé sur -O3
, valide dans clang
mais pas dans opt
clang
ajoute: -fno-signed-zéros -freciprocal-math -ffp-contract = rapide -menable-unsafe-fp-math -menable-no-nans -menable- non-inf-Os
est identique à -O2
-Oz
est basé sur -Os
opt
gouttes: -slp-vectorizerclang
gouttes: -vectorize-loopsAvec version 3.7 , les passes sont les suivantes (sortie analysée de la commande ci-dessus):
défaut (-O0): -targetlibinfo -verify -tti
-O1 est basé sur -O0
-O2 est basé sur -01
-O3 est basé sur -O2
-Os est identique à -O2
-Oz est basé sur -Os
Pour version 3.6 , les passes sont décrites dans le message de GYUNGMIN KIM.
Avec version 3.5 , les passes sont les suivantes (sortie analysée de la commande ci-dessus):
défaut (-O0): -targetlibinfo -verify -verify-di
-O1 est basé sur -O0
-O2 est basé sur -01
-O3 est basé sur -O2
-Os est identique à -O2
-Oz est basé sur -Os
Avec version 3.4 , les passes sont les suivantes (sortie analysée de la commande ci-dessus):
-O0: -targetlibinfo -preverify -domtree -verify
-O1 est basé sur -O0
-O2 est basé sur -01
-O3 est basé sur -O2
-Os est identique à -O2
-Oz est basé sur -O2
Avec version 3.2 , les passes sont les suivantes (sortie analysée de la commande ci-dessus):
-O0: -targetlibinfo -preverify -domtree -verify
-O1 est basé sur -O0
-O2 est basé sur -01
-O3 est basé sur -O2
-Os est identique à -O2
-Oz est identique à -Os
Modifier [mars 2014] supprimé les doublons des listes.
Modifier [avril 2014] lien de documentation ajouté + options pour la version 3.4
Modifier [septembre 2014] options ajoutées pour 3.5
Modifier [décembre 2015] ajouté des options pour 3.7 et mentionner la réponse existante pour 3.6
Modifier [mai 2016] ajouté des options pour 3.8, à la fois pour opt et clang et mentionne la réponse existante pour clang (versus opter)
Éditer [nov 2018] ajouter des options pour 6.0
La réponse de @ Antoine (et l'autre question liée) décrit avec précision les optimisations LLVM activées, mais il existe quelques autres options spécifiques à Clang (c.-à-d. qui affectent l'abaissement à l'AST) que affecté par les drapeaux -O[0|1|2|3|fast]
.
Vous pouvez y jeter un coup d'œil avec:
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 -\#\#\#
Par exemple, -O0
Active -mrelax-all
, -O1
Active -vectorize-loops
Et -vectorize-slp
, Et -Ofast
Active -menable-no-infs
, -menable-no-nans
, -menable-unsafe-fp-math
, -ffp-contract=fast
Et -ffast-math
.
@Techogrebo:
Oui, non, vous n'avez pas nécessairement besoin des autres outils LLVM. Essayer:
echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options
En outre, il y a beaucoup plus d'options détaillées que vous pouvez examiner/modifier avec Clang seul ... vous devez juste savoir comment vous y rendre!
Essayez quelques-uns de:
clang -help
clang -cc1 -help
clang -cc1 -mllvm -help
clang -cc1 -mllvm -help-list-hidden
clang -cc1as -help
LLVM 3.6-O1
Arguments de passage: -targetlibinfo -no-aa -tbaa -poped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -Prasic-e -inline cost -ways-inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -faire-de-l'achat lcssa -loop-rotation -licm -loop-unswitch -instcombine -scalar-evolution -loop-simplifier-lcssa -indvars -loop-idiome-suppression de boucle -function_tti -loop-unroll -memdep -memcpydom-sccp-DOMIN lazy-value-info -jump-threading -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simplifier -lcssa -branch-prob -block-prob -block-freal -scalar- evolution -loop-vectorize -instcombine -simplifycfg -domtree -instcombine -loops -loop-simplify-lcssa -scalar-evolution -function_tti -loop-unroll -alignment-from-a ssumptions -strip-dead-prototypes -verify -verify-di
-O2 base sur -O1
ajouter: -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge
et supprime: toujours en ligne
-O3 basé sur -O2
ajouter: -argpromotion