124 votes

Niveaux d'optimisation de Clang

Pour gcc, le manuel explique ce que -O3 , -Os etc., se traduisent en termes d'arguments d'optimisation spécifiques ( -funswitch-loops , -fcompare-elim etc.)

Je cherche la même info pour clang .

J'ai regardé en ligne et en man clang qui ne donne que des informations générales ( -O2 optimise de manière plus agressive que -O1 , -Os optimise la taille, ...) et j'ai également regardé ici sur Stack Overflow et trouvé ce 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 un manuel d'utilisation documentant toutes les passes d'optimisation et les passes sélectionnées par l'utilisateur, il peut le faire. -O_x_ . Actuellement, je viens de trouver ce liste de passages, mais rien sur les niveaux d'optimisation.

196voto

Antoine Points 3068

J'ai trouvé ce question connexe.

En résumé, pour connaître les passes d'optimisation du compilateur :

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

Comme indiqué dans Geoff Nixon Réponse de l'entreprise (+1), clang exécute en outre quelques optimisations de plus haut niveau, que nous pouvons récupérer :

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

La documentation relative aux laissez-passer individuels est disponible aquí .

Vous pouvez comparer l'effet de la modification d'indicateurs de haut niveau tels que -O comme ça :

diff -wy --suppress-common-lines  \
  <(echo 'int;' | clang -xc     - -o /dev/null -\#\#\# 2>&1 | tr " " "\n" | grep -v /tmp) \
  <(echo 'int;' | clang -xc -O0 - -o /dev/null -\#\#\# 2>&1 | tr " " "\n" | grep -v /tmp)
# will tell you that -O0 is indeed the default.

Avec version 6.0 les passes sont les suivants :

  • de base ( -O0 ):

    • opt fixe : -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clang 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 -called-value-propagation -globalopt -domtree -mem2reg -deadargelim -basicaa -aa -loops -lazy-branch-prob -lazy-block-freq -opt-remark- emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa -early-cse-memssa -speculative-execution -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-distribute -loop-vectorize -loop-load-elim -alignment-from-assumptions -strip-dead-prototypes -loop-sink -instsimplify -div-rem-pairs -verify -ee-instrument -early-cse -lower-expect
    • clang ajoute : -momit-frame-pointeur
    • clang gouttes : -mdisable-fp-elim -mrelax-all
  • -O2 est basé sur -O1

    • opt ajoute : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • opt gouttes : -toujours en ligne
    • clang ajoute : -vectoriser-boucles -vectoriser-slp
  • -O3 est basé sur -O2

    • opt ajoute : -fractionnement de site d'appel -promotion d'arguments
  • -Ofast est basé sur -O3 valable en clang mais pas dans opt

    • clang ajoute : -fno-signed-zeros -freciprocal-math -ffp-contract=fast -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-vectoriseur

Avec version 3.8 les passes sont les suivants :

  • de base ( -O0 ):

    • opt fixe : -targetlibinfo -tti -verify
    • clang ajoute : -mdisable-fp-elim -mrelax-all
  • -O1 est basé sur -O0

    • opt ajoute : -globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-simplify -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals-aa -rpo-functionattrs - basiccg -loop-idiom -forceattrs -mem2reg -simplifycfg -early-cse -instcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-accesses - memcpyopt -loop-deletion -reassociate -strip-dead-prototypes -loops -basicaa -correlated-propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower- expecter -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune-eh -jump-threading -loop-rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clang ajoute : -momit-frame-pointeur
    • clang gouttes : -mdisable-fp-elim -mrelax-all
  • -O2 est basé sur -O1

    • opt ajoute : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • opt gouttes : -toujours en ligne
    • clang ajoute : -vectoriser-boucles -vectoriser-slp
  • -O3 est basé sur -O2

    • opt ajoute : -argpromotion
  • -Ofast est basé sur -O3 valable en clang mais pas dans opt

    • clang ajoute : -fno-signed-zeros -freciprocal-math -ffp-contract=fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os est la même chose que -O2

  • -Oz est basé sur -Os

    • opt gouttes : -slp-vectoriseur
    • clang gouttes : -vectoriser les boucles

----------

Avec version 3.7 les passes sont les suivantes (sortie analysée de la commande ci-dessus) :

  • par défaut (-O0) : -targetlibinfo -verify -tti

  • -O1 est basé sur -O0

    • ajoute : -sccp -loop-simplify -float2int -lazy-value-info -correlated-propagation -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -memcpyopt - loop-accesses -assumption-cache-tracker -reassociate -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotate -ipsccp -instcombine -scoped- noalias -licm -prune-eh -loop-unswitch -alignment-from-assumptions -early-cse -inline-cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce - functionattrs -lower-expect -basiccg -loops -loop-idiom -tailcallelim -basicaa -indvars -globalopt -block-freq -scalar-evolution -memdep -always-inline
  • -O2 est basé sur -01

    • ajoute : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • supprime : -toujours en ligne
  • Le -O3 est basé sur le -O2

    • ajoute : -argpromotion -verif
  • -Os est identique à -O2

  • -Oz est basé sur -Os

    • supprime : -slp-vectoriseur

----------

Para version 3.6 les passes sont comme documenté dans le post de GYUNGMIN KIM.


----------

Avec version 3.5 les passes sont les suivantes (sortie analysée de la commande ci-dessus) :

  • par défaut (-O0) : -targetlibinfo -verify -verify-di

  • -O1 est basé sur -O0

    • ajoute : -corrélation-propagation -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 -always-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -scalar-evolution -lower-expect -licm -loop-idiom -adce -domtree -lcssa
  • -O2 est basé sur -01

    • ajoute : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • supprime : -toujours en ligne
  • Le -O3 est basé sur le -O2

    • ajoute : -argpromotion
  • -Os est identique à -O2

  • -Oz est basé sur -Os

    • supprime : -slp-vectoriseur

----------

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

    • ajoute : -adce -always-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-expect -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar-evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -taillelim -tbaa
  • -O2 est basé sur -01

    • ajoute : -barrière -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • supprime : -toujours en ligne
  • Le -O3 est basé sur le -O2

    • ajoute : -argpromotion
  • -Os est identique à -O2

  • -Oz est basé sur -O2

    • supprime : -barrière -loop-vectoriser -slp-vectoriser

----------

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

    • ajoute : -sroa -early-cse -lower-expect -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -always-inline -functionattrs -simplify-libcalls -lazy-value-info -jump-threading -correlated- propagation -taillecallelim -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-prototypes
  • -O2 est basé sur -01

    • ajoute : -inline -globaldce -constmerge
    • supprime : -toujours en ligne
  • Le -O3 est basé sur le -O2

    • ajoute : -argpromotion
  • -Os est identique à -O2

  • -Oz est identique à -Os


-------------

Modifier [mars 2014] Suppression des doublons dans les listes.

Modifier [avril 2014] ajout d'un lien vers la documentation + options pour 3.4

Modifier [septembre 2014] ajout d'options pour 3.5

Modifier [décembre 2015] ajout d'options pour la 3.7 et mention de la réponse existante pour la 3.6

Modifier [mai 2016] ajout d'options pour 3.8, à la fois pour opt et clang et mention de la réponse existante pour clang (versus opt)

Modifier [nov 2018] ajouter des options pour 6.0

22voto

Geoff Nixon Points 146

La réponse d'@Antoine (et l'autre question liée) décrivent avec précision l'objectif de l'entreprise. LLVM qui sont activées, mais il y a quelques autres options spécifiques à Clang (c'est-à-dire celles qui affectent l'abaissement à l'AST) qui sont affectées par l'option -O[0|1|2|3|fast] drapeaux.

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


@Techogrebo :

Oui, non, vous n'avez pas nécessairement besoin des autres outils LLVM. Essayez :

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

De plus, il y a beaucoup plus d'options détaillées que vous pouvez examiner/modifier avec Clang seul... vous devez juste savoir comment y accéder !

Essayez-en quelques-uns :

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help

3voto

GYUNGMIN KIM Points 39

LLVM 3.6 -O1

Passez les arguments : -targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-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- value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -lcssa -loop-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 -correlated-propagation -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simplify -lcssa -simplify -lcssa -branch-prolify -lcssa -branch-prolify -lcssa -branch-prolify -lcssa -indvars -lcssa -lcssa -branch-prolify -lcssa -lcssa 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-assumptions -strip-dead-prototypes -verify -verify-di

-O2 basé sur -O1

ajouter : -inline -mldst-motion -domtree -memdep -gvn -memdep -scalar-evolution -slp-vectorizer -globaldce -constmerge

et supprime : -always-inline

-O3 à partir de -O2

ajouter : -argpromotion

3voto

tierriminator Points 100

À partir de clang / LLVM 13.0.0, l'ancien gestionnaire de passes a été déprécié et le nouveau gestionnaire de passes est utilisé par défaut. Cela signifie que la solution précédente pour imprimer les passes d'optimisation utilisées pour les différents niveaux d'optimisation dans le fichier opt ne fonctionnera que si le gestionnaire de passes héritées est explicitement activé par la commande -enable-new-pm=0 . Ainsi, tant que le gestionnaire de passes hérité existe (prévu jusqu'à LLVM 14), on peut utiliser la commande suivante

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

Alternativement, l'ordre d'exécution des passes d'optimisation avec le nouveau gestionnaire de passes peut être extrait avec --debug-pass-manager (au lieu de -debug-pass=Arguments ). Malheureusement, la sortie est très verbeuse et un certain traitement doit être effectué pour reconstruire le comportement manuellement avec -passes= . Si seules les passes de transformation sont intéressantes, on peut utiliser l'option -debug-pass-manager=quiet pour sauter les informations sur les analyses.

Il existe un guide de l'utilisateur sur la manière d'utiliser le nouveau gestionnaire de passe avec opt sur le Site web de LLVM .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X