Clang niveles de optimización

En gcc, el manual explica a qué se -Os , -Os , etc. en términos de argumentos de optimización específicos ( -funswitch-loops , -fcompare-elim , etc.)

Estoy buscando la misma información para clang .

He buscado en línea y en man clang que solo brinda información general ( -O2 optimiza más que -O1 , -Os optimiza la velocidad, …) y también busqué en Stack Overflow y encontré esto , pero no he encontrado nada relevante en los archivos fuente citados.

Editar: Encontré una respuesta, pero todavía estoy interesado si alguien tiene un enlace a un manual del usuario que documenta todos los pases de optimización y los pases seleccionados por -O x . Actualmente encontré esta lista de pases, pero nada en los niveles de optimización.

Encontré esta pregunta relacionada.

En resumen, para conocer los pasos de optimización del comstackdor:

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

Como se señala en la respuesta de Geoff Nixon (+1), clang también ejecuta algunas optimizaciones de nivel superior, que podemos recuperar con:

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

La documentación de pases individuales está disponible aquí .



Con la versión 3.8 los pases son los siguientes:

  • línea base ( -O0 ):

    • opt sets : -targetlibinfo -tti -verify
    • clang agrega : -mdisable-fp-elim -mrelax-all
  • -O1 se basa en -O0

    • opt agrega : -globalopt -demanded-bits -branch-prob -inferattrs -ipsccp -dse -loop-simplify -scoped-noalias -barrier -adce -deadargelim -memdep -licm -globals-aa -rpo-functionattrs -basiccg -loop- idioma -forceattrs -mem2reg -simplifycfg -early-cse -incomcombine -sccp -loop-unswitch -loop-vectorize -tailcallelim -functionattrs -loop-accesses -memcpyopt -loop-deletion -reassociate -strip-dead-prototipos -loops -basicaa - correlated-propagation -lcssa -domtree -always-inline -a -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
    • clang agrega : -momit-leaf-frame-puntero
    • gotas de clang : -mdisable-fp-elim -mrelax-all
  • -O2 se basa en -O1

    • opt agrega : -elimp-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • gotas optativas: -siempre-en línea
    • clang agrega : -vectorize-loops -vectorize-slp
  • -O3 se basa en -O2

    • opt agrega : -argpromotion
  • -Ofast se basa en -O3 , válido en clang pero no en opt

    • clang agrega : -fno-signed-zeros -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os es lo mismo que -O2

  • -Oz se basa en -Os

    • opt gotas : -slp-vectorizer
    • gotas de clang : -vectorize-loops


Con la versión 3.7 los pases son los siguientes (salida analizada del comando anterior):

  • predeterminado (-O0): -targetlibinfo -verify -tti

  • -O1 se basa en -O0

    • agrega : -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 -siempre-en línea
  • -O2 se basa en -01

    • Agrega : -elim-avail-extern -globaldce -inline -constmerge -mldst-motion -gvn -slp-vectorizer
    • elimina : -siempre-en línea
  • -O3 se basa en -O2

    • agrega : -argpromotion -verif
  • -Os es idéntico a -O2

  • -Oz se basa en -Os

    • elimina : -slp-vectorizer


Para la versión 3.6, los pases están documentados en la publicación de GYUNGMIN KIM.


Con la versión 3.5 los pases son los siguientes (salida analizada del comando anterior):

  • predeterminado (-O0): -targetlibinfo -verify -verify-di

  • -O1 se basa en -O0

    • agrega : -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 se basa en -01

    • agrega : -gvn -constmerge -globaldce -slp-vectorizer -mldst-motion -inline
    • elimina : -siempre-en línea
  • -O3 se basa en -O2

    • agrega : -argpromotion
  • -Os es idéntico a -O2

  • -Oz se basa en -Os

    • elimina : -slp-vectorizer


Con la versión 3.4 los pases son los siguientes (salida analizada del comando anterior):

  • -O0: -targetlibinfo -preverify -domtree -verify

  • -O1 se basa en -O0

    • agrega : -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 se basa en -01

    • agrega : -barrier -constmerge -domtree -globaldce -gvn -inline -loop-vectorize -preverify -slp-vectorizer -targetlibinfo -verify
    • elimina : -siempre-en línea
  • -O3 se basa en -O2

    • agrega : -argpromotion
  • -Os es idéntico a -O2

  • -Oz está basado en -O2

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


Con la versión 3.2 los pases son los siguientes (salida analizada del comando anterior):

  • -O0: -targetlibinfo -preverify -domtree -verify

  • -O1 se basa en -O0

    • agrega : -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-prototipos
  • -O2 se basa en -01

    • agrega : -inline -globaldce -constmerge
    • elimina : -siempre-en línea
  • -O3 se basa en -O2

    • agrega : -argpromotion
  • -Os es idéntico a -O2

  • -Oz es idéntico a -Os


Editar [marzo de 2014] eliminó los duplicados de las listas.

Editar [abril de 2014] agregó enlace de documentación + opciones para 3.4

Editar [septiembre de 2014] opciones añadidas para 3.5

Edite [diciembre de 2015] opciones agregadas para 3.7 y mencione la respuesta existente para 3.6

Edite [mayo de 2016] opciones agregadas para 3.8, tanto para opt y clang y mencione la respuesta existente para clang (versus opt)

La respuesta de @ Antoine (y la otra pregunta relacionada) describe con precisión las optimizaciones de LLVM que están habilitadas, pero hay algunas otras opciones específicas de Clang (es decir, aquellas que afectan la disminución a la AST) que se vieron afectadas por -O[0|1|2|3|fast] banderas.

Puede echar un vistazo a estos con:

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 -\#\#\#

Por ejemplo, -O0 habilita -mrelax-all , -O1 habilita -vectorize-loops y -vectorize-slp , y -Ofast habilita -menable-no-infs , -menable-no-nans , -menable-unsafe-fp-math , -ffp-contract=fast y -ffast-math .


@Techogrebo:

Sí, no, no necesariamente necesita las otras herramientas de LLVM. Tratar:

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

Además, hay muchas más opciones detalladas que puedes examinar / modificar solo con Clang … ¡solo necesitas saber cómo llegar a ellas!

Pruebe algunos de:

clang -help

clang -cc1 -help

clang -cc1 -mllvm -help

clang -cc1 -mllvm -help-list-hidden

clang -cc1as -help

LLVM 3.6- O1

Pass 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 -siempre-en-línea -funciones -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 -branch-prob -block-freq -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 en -O1

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

y elimina: -siempre-en línea

-O3 basado en -O2

agregar: -argpromotion