Niveles de optimización de Clang

91

En gcc, el manual explica qué -O3, -Osetc. traducir en términos de argumentos de optimización específica ( -funswitch-loops, -fcompare-elim, etc.)

Estoy buscando la misma información para clang .

Busqué en línea y en el man clangque solo brinda información general ( -O2optimiza más que -O1, -Osoptimiza para la velocidad,…) y también busqué aquí en Stack Overflow y encontré esto , pero no encontré nada relevante en los archivos fuente citados.

Editar: encontré una respuesta, pero todavía estoy interesado si alguien tiene un enlace a un manual de usuario que documente todos los pases de optimización y los pases seleccionados por . Actualmente, acabo de encontrar esta lista de pases, pero nada sobre los niveles de optimización.-Ox

Antoine
fuente

Respuestas:

156

Encontré esta pregunta relacionada.

En resumen, para obtener información sobre las pasadas de optimización del compilador:

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

Como se señaló en la respuesta de Geoff Nixon (+1), clangademás ejecuta algunas optimizaciones de nivel superior, que podemos recuperar con:

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

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



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

  • línea de base ( -O0):

    • optconjuntos : -tti -verify -ee-instrument -targetlibinfo -assumption-cache-tracker -profile-summary-info -forceattrs -basiccg -always-inline -barrier
    • clangagrega : -mdisable-fp-elim -mrelax-all
  • -O1 está basado en -O0

    • opt agrega:-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-comment-emitter -instcombine -simplifycfg -basiccg -globals-aa -prune-eh -always-inline -functionattrs -sroa -memoryssa-temprano-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-verificación -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-accede -loop-distribuir-loop-vectorize -loop-load-elim -alignment-from-assumptions -strip-dead-prototypes -loop-sink -instsimplify -div-rem-pairs -verify -ee-instrument-temprano-cse -lower-hope
    • clangagrega : -momit-leaf-frame-pointer
    • clanggotas : -mdisable-fp-elim -mrelax-all
  • -O2 está basado en -O1

    • optagrega : -inline -mldst-motion -gvn -elim-avail-extern -slp-vectorizer -constmerge
    • optgotas : -siempre-en línea
    • clangagrega : -vectorizar-bucles -vectorizar-slp
  • -O3 está basado en -O2

    • optagrega : -callsite-splitting -argpromotion
  • -Ofastse basa en -O3, válido en clangpero no enopt

    • clangagrega : -fno-ceros-firmados -freciprocal-math -ffp-contract = fast -menable-inseguro-fp-math -menable-no-nans -menable-no-infs -mreassociate -fno-trapping-math -ffast-math -finita-solo-matemáticas
  • -Os es parecido a -O2

    • optgotas : -libcalls-shrinkwrap y -pgo-memopt-opt
  • -Oz está basado en -Os

    • optgotas : -slp-vectorizer

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

  • línea de base ( -O0):

    • optconjuntos : -targetlibinfo -tti -verify
    • clangagrega : -mdisable-fp-elim -mrelax-all
  • -O1 está basado en -O0

    • optagrega : -globalopt -bits-exigidos -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 -correlated -basicaa- -propagation -lcssa -domtree -siempre-inline -aa -block-freq -float2int -lower-esperado -sroa -loop-unroll -alignment-from-assumptions -lazy-value-info -prune-eh -jump-threading -loop -rotate -indvars -bdce -scalar-evolution -tbaa -assumption-cache-tracker
    • clangagrega : -momit-leaf-frame-pointer
    • clanggotas : -mdisable-fp-elim -mrelax-all
  • -O2 está basado en -O1

    • optagrega : -elim-avail-extern -mldst-motion -slp-vectorizer -gvn -inline -globaldce -constmerge
    • optgotas : -siempre-en línea
    • clangagrega : -vectorizar-bucles -vectorizar-slp
  • -O3 está basado en -O2

    • optañade : -argpromotion
  • -Ofastse basa en -O3, válido en clangpero no enopt

    • clangagrega : -fno-ceros-firmados -freciprocal-math -ffp-contract = fast -menable-unsafe-fp-math -menable-no-nans -menable-no-infs
  • -Os es lo mismo que -O2

  • -Oz está basado en -Os

    • optgotas : -slp-vectorizer
    • clanggotas : -vectorizar-bucles


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 -reasociate -eliminación-de-bucle -prob-de-rama-salto-subprocesamiento -domtree -dse -loop-rotate -ipsccp -instcombine -scoped-noalias -licm -prune-eh -loop-unswitch -alignment-from-assumptions-temprano-cse -inline -cost -simplifycfg -strip-dead-prototypes -tbaa -sroa -no-aa -adce -functionattrs -lower-esperado -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

    • añade : -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 : -propagación-correlativa -basiccg -simplifycfg -no-aa -jump-threading -sroa -loop-unswitch -ipsccp -instcombine -memdep -memcpyopt -barrier -block-freq -loop-simplify -loop-vectorize -inline-cost -branch-prob-temprano-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-esperado -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

    • añade : -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 -siempre-en línea -basicaa -basiccg -propagación-correlacionada -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-loop -lower-wait -memcpyopt -memdep -no-aa -notti -prune-eh -reassociate -scalar -evolución -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

    • añade : -argpromotion
  • -Os es idéntico a -O2

  • -Oz se basa 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-esperado -no-aa -tbaa -basicaa -globalopt -ipsccp -deadargelim -instcombine -simplifycfg -basiccg -prune-eh -siempre-inline -functionattrs -simplify-libcalls -lazy-value -info -jump-threading -propagación-correlacionada -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 se basa en -01

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

    • añade : -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] vínculo de documentación agregado + opciones para 3.4

Editar [septiembre de 2014] agregó opciones para 3.5

Editar [diciembre de 2015] agregó opciones para 3.7 y mencione la respuesta existente para 3.6

Editar [mayo de 2016] agregó opciones para 3.8, tanto para opt como clang y mencione la respuesta existente para clang (versus opt)

Editar [noviembre de 2018] agregar opciones para 6.0

Antoine
fuente
2
¿Hay alguna forma de hacer esto con la versión de clang que viene con XCode5? Intenté buscar el comando llvm-as, pero no existe en mi máquina en ningún lugar que pueda ver
Teknogrebo
@Antoine, ¿por qué -simplifycfgse repiten algunas banderas, como ?
Paschalis
2
@Paschalis: No estoy seguro, pero dado que algunos pases de optimización solo funcionan si se han ejecutado otros pases y, por ejemplo, simplifycfges necesario para varios pases. Y debug-pass=Argumentsprobablemente ocurre antes de la deduplicación. Eliminé los duplicados en mi respuesta, gracias por sus comentarios.
Antoine
5
Algunas optimizaciones crean elementos que se pueden optimizar aún más (código muerto, etc.), por lo que podría tener sentido volver a ejecutar algunas pasadas de optimización.
cyco130
1
@ZachB / @Antoine ¿Por qué no (¿también?) LLVM 7 (¿o es eso lo que quisiste decir?) Además: 1. No estoy seguro de cuánto tiempo ha estado ahí, pero ahora también hay -Oguna GCC; 2. ¿Siguen siendo necesarios todos los detalles de las versiones anteriores? 3. Creo que, dados los buenos cambios que se han realizado a lo largo de los años, y el estado de la comunidad, reduciré mi respuesta a solo mencionar cosas como clang -cc1 -mllvm -help-list-hidden(a menos que prefieras integrarlo).
Geoff Nixon
15

La respuesta de @ Antoine (y la otra pregunta vinculada) describen 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 reducción al AST) que se ven afectadas por las -O[0|1|2|3|fast]banderas.

Puedes 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, -O0permite -mrelax-all, -O1permite -vectorize-loopsy -vectorize-slp, y -Ofastpermite -menable-no-infs, -menable-no-nans, -menable-unsafe-fp-math, -ffp-contract=fasty -ffast-math.


@Techogrebo:

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

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

Además, hay opciones mucho más detalladas que puede examinar / modificar solo con Clang ... ¡solo necesita 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

Geoff Nixon
fuente
3

LLVM 3.6 -O1

Pasar argumentos:-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 -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 -rotar -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 -propagación-correlacionada -domtree -memdep -dse -adce -simplifycfg -domtree -instcombine -barrier -domtree -loops -loop-simplify -lcssa -branch-prob -block-freq -scalar-evolution -loop -vectorizar -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 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

añadir: -argpromotion

GYUNGMIN KIM
fuente