Niveaux d'optimisation de Clang

91

Sur gcc, le manuel explique ce -O3, -Osetc. traduire en termes d'arguments d'optimisation spécifique ( -funswitch-loops, -fcompare-elim, etc.)

Je cherche les mêmes informations pour clang .

J'ai regardé en ligne et dans man clanglequel ne donne que des informations générales ( -O2optimise plus que -O1, -Osoptimise pour la vitesse, ...) et j'ai également regardé ici sur Stack Overflow et j'ai trouvé cela , mais je n'ai rien trouvé de pertinent dans les fichiers source 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 . Actuellement, je viens de trouver cette liste de passes, mais rien sur les niveaux d'optimisation.-Ox

Antoine
la source

Réponses:

156

J'ai trouvé cette question connexe.

Pour résumer, 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), clangexécute en outre des optimisations de plus haut niveau, que nous pouvons récupérer avec:

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

La documentation des pass individuels est disponible ici .



Avec la version 6.0, les passes sont les suivantes:

  • ligne de base ( -O0):

    • optensembles : -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clangajoute : -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-remarque-émetteur -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-distribuer-loop-vectorize -loop-load-elim -alignment-from-assumptions -strip-dead-prototypes -loop-sink -instsimplify -div-rem-pairs -verify -ee-instrument -early-cse -lower-expect
    • clangajoute : -momit-leaf-frame-pointer
    • clanggouttes : -mdisable-fp-elim -mrelax-all
  • -O2 est basé sur -O1

    • optajoute : -inline -mldst-motion -gvn -elim-available-extern -slp-vectorizer -constmerge
    • optgouttes : -always-inline
    • clangajoute : -vectorize-loops -vectorize-slp
  • -O3 est basé sur -O2

    • optajoute : -callsite-splitting -argpromotion
  • -Ofastest basé sur -O3, valide dans clangmais pas dansopt

    • clangajoute : -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

    • optgouttes : -libcalls-shrinkwrap et -pgo-memopt-opt
  • -Oz est basé sur -Os

    • optgouttes : -slp-vectorizer

Avec la version 3.8, les passes sont les suivantes:

  • ligne de base ( -O0):

    • optensembles : -targetlibinfo -tti -verify
    • clangajoute : -mdisable-fp-elim -mrelax-all
  • -O1 est basé sur -O0

    • optajoute : -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 -réassocier -stripbasica-dead-prototypes -loop-corrélés -propagation -lcssa -domtree -always-inline -aa -block-freq -float2int -lower-expect -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clangajoute : -momit-leaf-frame-pointer
    • clanggouttes : -mdisable-fp-elim -mrelax-all
  • -O2 est basé sur -O1

    • optajoute : -elim-dispon-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optgouttes : -always-inline
    • clangajoute : -vectorize-loops -vectorize-slp
  • -O3 est basé sur -O2

    • optajoute : -argpromotion
  • -Ofastest basé sur -O3, valide dans clangmais pas dansopt

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

  • -Oz est basé sur -Os

    • optgouttes : -slp-vectorizer
    • clanggouttes : -vectorize-loops


Avec la 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 -toujours-en ligne
  • -O2 est basé sur -01

    • ajoute : -elim-dispon-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • supprime : -always-inline
  • -O3 est basé sur -O2

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

  • -Oz est basé sur -Os

    • supprime : -slp-vectorizer


Pour la version 3.6, les passes sont décrites dans l'article de GYUNGMIN KIM.


Avec la 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 : -correlated-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 : -always-inline
  • -O3 est basé sur -O2

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

  • -Oz est basé sur -Os

    • supprime : -slp-vectorizer


Avec la 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 -tailcallelim -tbaa
  • -O2 est basé sur -01

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

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

  • -Oz est basé sur -O2

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


Avec la 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 -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-prototypes
  • -O2 est basé sur -01

    • ajoute : -inline -globaldce -constmerge
    • supprime : -always-inline
  • -O3 est basé sur -O2

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

  • -Oz est identique à -Os


Edit [mars 2014] a supprimé les doublons des listes.

Edit [avril 2014] ajout du lien vers la documentation + options pour la version 3.4

Edit [septembre 2014] a ajouté des options pour la version 3.5

Modifier [décembre 2015] a ajouté des options pour 3.7 et mentionner la réponse existante pour 3.6

Edit [mai 2016] a ajouté des options pour 3.8, à la fois pour opt et clang et mentionnez la réponse existante pour clang (versus opt)

Modifier [novembre 2018] ajouter des options pour la version 6.0

Antoine
la source
2
Existe-t-il un moyen de faire cela avec la version de clang livrée avec XCode5? J'ai essayé de chercher la commande llvm-as, mais elle n'existe sur ma machine nulle part que je puisse voir
Teknogrebo
@Antoine, pourquoi certains drapeaux, comme -simplifycfgse répètent?
Paschalis
2
@Paschalis: Je ne suis pas sûr, mais comme certaines passes d'optimisation ne fonctionnent que si d'autres passes ont été exécutées, et par exemple simplifycfgsont requises par plusieurs passes. Et debug-pass=Argumentscela se produit probablement avant la déduplication. J'ai supprimé les doublons dans ma réponse, merci pour vos commentaires.
Antoine
5
Certaines optimisations créent des éléments qui peuvent être optimisés davantage (code mort, etc.), il peut donc être judicieux de réexécuter certaines passes d'optimisation.
cyco130
1
@ZachB / @Antoine Pourquoi pas (aussi?) LLVM 7 (ou est-ce ce que vous vouliez dire?) Aussi: 1. Je ne sais pas depuis combien de temps il est là, mais il y a aussi -Ogun la GCC maintenant; 2. Toutes les spécificités des anciennes versions sont-elles encore nécessaires? 3. Je pense que compte tenu des beaux changements qui ont été apportés au fil des ans et du statut de la communauté, je vais réduire ma réponse en mentionnant simplement des choses comme clang -cc1 -mllvm -help-list-hidden(sauf si vous préférez l'intégrer).
Geoff Nixon
15

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

Vous pouvez jeter un œil à ceux-ci 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, -O0permet -mrelax-all, -O1permet -vectorize-loopset -vectorize-slp, et -Ofastpermet -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fastet -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 existe des options beaucoup plus détaillées que vous pouvez examiner / modifier avec Clang seul ... il vous suffit de savoir comment y accéder!

Essayez quelques-unes de:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help

Geoff Nixon
la source
3

LLVM 3.6 -O1

Arguments de réussite:-targetlibinfo -no-aa -tbaa -scoped-noalias -assumption-cache-tracker -basicaa -notti -verify-di -ipsccp -globalopt -deadargelim -domtree -instcombine -simplifycfg -basiccg -prune-eh -inline-cost -toujours -inline -functionattrs -sroa -domtree -early-cse -lazy-value-info -jump-threading -correlated-propagation -simplifycfg -domtree -instcombine -tailcallelim -simplifycfg -reassociate -domtree -loops -loop-simplify -l -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 -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 base sur -O1

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

et supprime: -always-inline

-O3 basé sur -O2

ajouter: -argpromotion

GYUNGMIN KIM
la source