Clang niveaux d'optimisation
Sur gcc, le manuel explique ce que -O3
, -Os
, etc. traduire dans les conditions spécifiques d'optimisation des arguments (-funswitch-loops
, -fcompare-elim
, etc.)
Je suis à la recherche pour la même info pour clang.
J'ai regardé en ligne et dans man clang
qui ne donne que de l'information générale (-O2
optimise plus de -O1
, -Os
optimise pour la vitesse, ...) et également cherché ici sur un Débordement de Pile et trouvé cette, mais je n'ai rien trouvé de pertinent dans la cité des fichiers source.
Edit: j'ai trouvé une réponse, mais je suis toujours intéressé si quelqu'un a un lien pour un utilisateur-manuel de documenter toutes optimisation de passe et les passes sélectionné par -Ox
. Actuellement, je viens de trouver cette liste de passe, mais rien sur l'optimisation des niveaux.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé cette liés à la question.
Pour résumer, afin de découvrir l'optimisation du compilateur passe:
Comme l'a souligné dans Geoff Nixon's réponse (+1),
clang
en outre s'exécute à un niveau supérieur optimisations, ce qui, nous pouvons le récupérer avec:Documentation de l'individu passe est disponible ici.
Avec version 6.0 les passes sont comme suit:
de base (
-O0
):opt
jeux de: -tti -vérifier -ee-instrument -targetlibinfo -l'assomption-cache-tracker -profil-résumé-info -forceattrs -basiccg -toujours-inline -barrièreclang
ajoute : -mdisable-fp-elim -mrelax-tous-O1
est basé sur-O0
opt
ajoute: -targetlibinfo -tti -terre aart -portée-noalias -l'assomption-cache-tracker -profil-résumé-info -forceattrs -inferattrs -ipsccp -disant valeur de propagation de l'-globalopt -domtree -mem2reg -deadargelim -basicaa -aa -boucles -paresseux-branche-prob -paresseux-bloc-freq -opt-remarque de l'émetteur -instcombine -simplifycfg -basiccg -globals-aa -prune-eh-toujours-inline -functionattrs -sroa -memoryssa -début-cse-memssa -spéculatives exécution -paresseux-valeur-info -sauter-threading -corrélation-propagation -libcalls-emballé -branche-prob -bloc-freq -pgo-memop-opt-tailcallelim -réassocier -boucle-simplifier -lcssa-vérification -lcssa -scalaire-evolution-boucle-rotation-licm -boucle-unswitch -indvars -boucle-langage -boucle-la suppression de la boucle-déroulez -memdep -memcpyopt -sccp -demandé-bits -bdce -dse-postdomtree -adce -barrière -apr-functionattrs -globaldce -float2int -boucle-accède à -boucle-distribuer -boucle-vectorisation de -boucle-charge-elim -alignement-de-hypothèses -bande-dead-prototypes -boucle-évier-instsimplify -div-rem-paires -vérifier -ee-instrument -début-cse-bas à attendreclang
ajoute : -momit-feuille-frame-pointerclang
gouttes : -mdisable-fp-elim -mrelax-tous-O2
est basé sur-O1
opt
ajoute: inline -mldst-motion-gvn -elim-en vain-extern-slp-vectorizer -constmergeopt
gouttes: -toujours-inlineclang
ajoute: -vectorisation-boucles -vectorisation-slp-O3
est basé sur-O2
opt
ajoute: -callsite-fractionnement -argpromotion-Ofast
est basé sur-O3
, valable dansclang
mais pas dansopt
clang
ajoute: -fno-signé-zéros -freciprocal-math-ffp-contrat=fast -menable-dangereux-fp-math-menable-pas-nans-menable-pas-infs -mreassociate -fno-piégeage-math-ffast-math-ffinite-math-seulement-Os
est similaire à-O2
opt
gouttes: -libcalls-emballé et -pgo-memopt-opt-Oz
est basé sur-Os
opt
gouttes: -slp-vectorizerAvec la version 3.8 les passes sont comme suit:
de base (
-O0
):opt
jeux de : -targetlibinfo -tti -vérifierclang
ajoute : -mdisable-fp-elim -mrelax-tous-O1
est basé sur-O0
opt
ajoute: -globalopt demandé bits -branche-prob -inferattrs -ipsccp -dse -boucle-simplifier -portée-noalias -barrière -adce -deadargelim -memdep -licm -globals-aa -apr-functionattrs -basiccg -boucle-langage -forceattrs -mem2reg -simplifycfg -début-cse-instcombine -sccp -boucle-unswitch -boucle-vectorisation -tailcallelim -functionattrs -boucle-accès -memcpyopt -boucle-suppression -réassocier -bande-dead-prototypes -boucles -basicaa -corrélation-propagation de lcssa -domtree -toujours-inline -aa -bloc-freq -float2int -bas-attendre -sroa -boucle-déroulez -alignement-de-hypothèses -paresseux-valeur-info -prune-eh-sauter-threading -boucle-rotation-indvars -bdce -scalaire-evolution-terre aart -l'assomption-cache-trackerclang
ajoute : -momit-feuille-frame-pointerclang
gouttes : -mdisable-fp-elim -mrelax-tous-O2
est basé sur-O1
opt
ajoute: -elim-en vain-extern-mldst-motion-slp-vectorizer -gvn -inline -globaldce -constmergeopt
gouttes: -toujours-inlineclang
ajoute: -vectorisation-boucles -vectorisation-slp-O3
est basé sur-O2
opt
ajoute: -argpromotion-Ofast
est basé sur-O3
, valable dansclang
mais pas dansopt
clang
ajoute: -fno-signé-zéros -freciprocal-math-ffp-contrat=fast -menable-dangereux-fp-math-menable-pas-nans-menable-pas-infs-Os
est le même que-O2
-Oz
est basé sur-Os
opt
gouttes: -slp-vectorizerclang
gouttes: -vectorisation-bouclesAvec version 3.7 les passes sont comme suit (analysée à la sortie de la commande ci-dessus):
par défaut (-O0): -targetlibinfo -vérifier -tti
-O1 est basé sur-O0
-O2 est basé sur -01
-O3 est basé sur-O2
-Os est identique à O2
-Oz est fondée sur l'Os
Pour version 3.6 les passes sont documentés dans GYUNGMIN KIM post.
Avec version 3.5 les passes sont comme suit (analysée à la sortie de la commande ci-dessus):
par défaut (-O0): -targetlibinfo -vérifier -vérifier-di
-O1 est basé sur-O0
-O2 est basé sur -01
-O3 est basé sur-O2
-Os est identique à O2
-Oz est fondée sur l'Os
Avec version 3.4 les passes sont comme suit (analysée à la sortie de la commande ci-dessus):
-O0: -targetlibinfo -preverify -domtree -vérifier
-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 comme suit (analysée à la sortie de la commande ci-dessus):
-O0: -targetlibinfo -preverify -domtree -vérifier
-O1 est basé sur-O0
-O2 est basé sur -01
-O3 est basé sur-O2
-Os est identique à O2
-Oz est identique à l'Os
Modifier [mars 2014] supprimé les doublons dans les listes.
Modifier [avril 2014] l'ajout de la documentation lien + options de 3,4
Modifier [septembre 2014] ajout d'options pour 3.5
Modifier [décembre 2015] ajout d'options pour 3,7 et mention de réponse existant pour 3,6
Modifier [mai 2016] ajout d'options pour 3.8, pour se retirer et de clang et mention de réponse existant pour clang (contre opt)
Modifier [nov 2018] ajouter des options pour 6.0
-simplifycfg
sont répétées?simplifycfg
est requis par de nombreuses passes. Etdebug-pass=Arguments
arrivera probablement avant la déduplication. J'ai supprimé les doublons dans ma réponse, merci pour vos commentaires.-Og
la GCC maintenant; 2. Sont toutes les spécificités pour les versions plus anciennes encore nécessaire? 3. Je pense que compte tenu de la belle modifications qui ont été apportées au fil des ans, et de la communauté statut, je vais couper ma réponse vers le bas, juste de mentionner des choses commeclang -cc1 -mllvm -help-list-hidden
(sauf si vous préférez intégrer).@Antoine de réponse (et l'autre question liée) à décrire avec précision la LLVM optimisations activées, mais il ya quelques autres Clang options spécifiques (c'est à dire, ceux qui influent sur l'abaissement de l'AST) qui a touché par la
-O[0|1|2|3|fast]
drapeaux.Vous pouvez prendre un coup d'oeil à ces 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
permet-mrelax-all
,-O1
permet-vectorize-loops
et-vectorize-slp
, et-Ofast
permet-menable-no-infs
,-menable-no-nans
,-menable-unsafe-fp-math
,-ffp-contract=fast
et-ffast-math
.@Techogrebo:
Oui, aucun n'avez pas nécessairement besoin de l'autre LLVM outils. Essayez:
echo 'int;' | clang -xc - -o /dev/null -mllvm -print-all-options
Aussi, il y a beaucoup plus d'options détaillées, vous pouvez examiner/modifier avec Clang seul... vous avez juste besoin de savoir comment les approcher!
Essayez quelques-unes de:
clang -help
clang -cc1 -help
clang -cc1 -mllvm -help
clang -cc1 -mllvm -help-list-hidden
clang -cc1as -help
LLVM 3.6
-O1
Passer Des Arguments: -targetlibinfo -pas-aa -terre aart -portée-noalias -l'assomption-cache-tracker -basicaa -notti -vérifier-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh-inline-coût -toujours-inline -functionattrs -sroa -domtree -début-cse-paresseux-valeur-info -sauter-threading -corrélation-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -réassocier -domtree -boucle -boucle-simplifier -lcssa -boucle-rotation-licm -boucle-unswitch -instcombine -scalaire-evolution-boucle-simplifier -lcssa -indvars -boucle-langage -boucle-suppression -function_tti -boucle-déroulez -memdep -memcpyopt -sccp -domtree -instcombine -paresseux-valeur-info -sauter-threading -corrélation-propagation -domtree -memdep -dse-adce -simplifycfg -domtree -instcombine -barrière -domtree -boucle -boucle-simplifier -lcssa -branche-prob -bloc-freq -scalaire-evolution -boucle-vectorisation -instcombine -simplifycfg -domtree -instcombine -boucle -boucle-simplifier -lcssa -scalaire-evolution-function_tti -boucle-déroulez -alignement-de-hypothèses -bande-dead-prototypes -vérifier -vérifier-di
-O2 base sur -O1
ajouter : -inline -mldst-motion-domtree -memdep -gvn -memdep -scalaire-evolution-slp-vectorizer -globaldce -constmerge
et supprime: -toujours-inline
-O3 fondés sur -O2
ajouter: -argpromotion