web-dev-qa-db-fra.com

Niveaux d'optimisation Clang

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.

83
Antoine

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 -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-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-expect
    • clang ajoute: -momit-leaf-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: -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-vectorizer

Avec version 3.8 , les passes sont les suivantes:

  • baseline (-O0):

    • opt sets: -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 -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-tracker
    • clang ajoute: -momit-leaf-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: -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-vectorizer
    • clang gouttes: -vectorize-loops

Avec 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

    • ajoute: -sccp -loop-simplify -float2int -lazy-value-info -correlated-propagation -bdce -lcssa -deadargelim -loop-unroll -loop-vectorize -barrier -barrier -memcpyopt -loop- accède à -assumption-cache-tracker -reassociate -loop-deletion -branch-prob -jump-threading -domtree -dse -loop-rotation -ipsccp -instcombine -scoped-noalias -licm -Prune-eh -loop-unsh-unsignalalignment- from-suppositions -early-cse -inline-cost -simplifycfg -protonnes-mortes -tbaa -sroa -no-aa -adce -functionattrs -lower-expect -basiccg -loops -loop-idiome-tailcimelim -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: -always-inline
  • -O3 est basé sur -O2

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

  • -Oz est basé sur -Os

    • supprime: -slp-vectorizer

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

    • ajoute: -correlated-propagation -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt-barrier -block-freer-loop-loop simplifier-vectoriser-en ligne-coût-en-ligne-branch-prob -early-cse -lazy-valeur-info -loop-rotation -strip-dead-prototypes -l'extraction de boucle -tbaa -Prune-eh -indvars -loop-loop-unroll - ré-associez -loops -sccp -always-inline -basicaa -dse -globalopt -tailcallelim -functionattrs -deadargelim -notti -niveau -calin-évolution -lower-expect -licm -loop-idiome -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 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-idiome -loop-rotation -loop-simplifier -loop-unroll -loop-unswitch -loops -lower-expect -memcpyopt -memdep -no-aa-aa - notti -Prune-eh-réassocier -scalar-evolution -sccp -simplifycfg -sroa -strip-dead-prototypes -tailcallelim -tbaa
  • -O2 est basé sur -01

    • ajoute: -barrier -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 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-simplifier -lcssa -loop-rotation -licm -loop-unsconnect -scalar-evolution -indexations idiome -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


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

141
Antoine

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

13
Geoff Nixon

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

3
GYUNGMIN KIM