En gcc, el manual explica qué -O3
, -Os
etc. 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 clang
que solo brinda información general ( -O2
optimiza más que -O1
, -Os
optimiza 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
fuente
-simplifycfg
se repiten algunas banderas, como ?simplifycfg
es necesario para varios pases. Ydebug-pass=Arguments
probablemente ocurre antes de la deduplicación. Eliminé los duplicados en mi respuesta, gracias por sus comentarios.-Og
una 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 comoclang -cc1 -mllvm -help-list-hidden
(a menos que prefieras integrarlo).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,
-O0
permite-mrelax-all
,-O1
permite-vectorize-loops
y-vectorize-slp
, y-Ofast
permite-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 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
fuente
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
fuente