Clang niveles de optimización
compiler-optimization user-manual (3)
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 online 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é this , 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é this lista de pases, pero nada en los niveles de optimización.
Encontré this pregunta relacionada.
En resumen, para conocer los pasos de optimización del compilador:
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 this .
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 enclang
pero no enopt
-
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