2011-06-23 23 views
25

Recientemente recibí un informe de error sobre un programa que no se puede compilar con el modificador -O3 (consulte https://github.com/cschwan/sage-on-gentoo/issues/66). En particular, el problema es que la compilación se cuelga en un cierto punto. El problema se resuelve compilando con -O2 (estoy muy consciente del hecho de que los programas compilados con -O3 pueden estar rotos, pero no sabía que -O3 puede colgar el compilador). Si desea reproducir el problema ejecutar¿Cuál es la diferencia entre -O3 y (-O2 + indicadores que man gcc dice -O3 agrega a -O2)?

wget http://perso.ens-lyon.fr/xavier.pujol/fplll/libfplll-3.0.12.tar.gz 
tar -xf libfplll-3.0.12.tar.gz 
cd libfplll-3.0.12 
./configure CXXFLAGS="-O3" 
make 

Me preguntaba por qué -O3 cuelga el compilador y así que traté de localizar el problema. Primero, intenté descubrir la diferencia entre -O2 entre -O3. página del manual de gcc afirma que -O3 permite a los interruptores de O2 y las siguientes (permite llamar x):

-finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload 
-ftree-vectorize -fipa-cp-clone 

me comprobó que mediante la comparación de la salida de gcc cuando se invoca con -Q -O2 --help=optimizers y -Q -O3 --help=optimizers. Luego planeé eliminar selectivamente los interruptores para encontrar el que causa el problema. Sin embargo, la compilación funciona bien con O2 y los interruptores adicionales anteriormente, por lo que concluyen

-O3 != -O2 x 

Ahora mi pregunta: (? Indocumentado) ¿Alguien sabe si existe una diferencia adicional entre O2 y O3, ¿Alguien ha experimentado un comportamiento similar? ¿Es esto quizás un error del compilador?

+0

creo, se debe añadir al problema -O3 plazo tales opciones "-ftree-dump-todo-todo--frtl volcado -all-all "y para encontrar la última etapa que tiene un truco en él. Además, chech la pila de gcc con iniciarlo bajo 'gdb --args' y deteniéndolo con Ctrl-C. – osgx

Respuesta

18

Las páginas de manual pueden estar desactualizadas, pero puede encontrar listas reales para O2 y O3.

Para obtener la lista completa (casi, marque "actualización") de -f opciones de optimización utilizados efectivamente, le sugiero que utilice el -fverbose-asm -save-temps (o -fverbose-asm -S) - no es una lista completa en la parte superior del archivo asm (*. s).

Para gcc-4.6.0 que tiene x (la diferencia entre O2 y O3) a ser:

-fgcse-after-reload 
-finline-functions 
-fipa-cp-clone 
-fpredictive-commoning 
-ftree-loop-distribute-patterns 
-ftree-vectorize 
-funswitch-loops 

Otra fuente de información de tu pregunta es las fuentes de GCC (archivo gcc/opts.c y posiblemente gcc/common.opt) como gcc-4.6.0:

/* -O3 optimizations. */ 
{ OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 }, 
/* Inlining of functions reducing size is a good idea with -Os 
    regardless of them being declared inline. */ 
{ OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 }, 
{ OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 }, 

también he comprobado, hace cheque gcc -On en otros archivos (cscope símbolo de búsqueda de x_optimize).

El único uso adicional de n de la opción -On lo está guardando en macro __OPTIMIZE__. Por lo tanto, algunos encabezados pueden comportarse de manera diferente para el valor de esta macro igual a 2 o 3.

ACTUALIZACIÓN: There are questions about it in GCC WIKI:

  • "? ¿Es -O1 (O2, O3 o -Os) equivalente a las opciones individuales -foptimization"

No. En primer lugar, las opciones de optimización individuales (-f *) no habilitan la optimización, se requiere una opción -Os o -Ox con x> 0. Segundo, los indicadores -Ox habilitan muchas optimizaciones que no están controladas por ninguna opción individual -f *. There are no plans to add individual options for controlling all these optimizations.

  • "Lo banderas específica están habilitados por -O1 (O2, O3 o -Os)?"

varía según la plataforma y la versión de GCC. Puede obtener GCC que le diga qué banderas que permite al hacer esto:

touch empty.c 
gcc -O1 -S -fverbose-asm empty.c 
cat empty.s 
+4

Su respuesta me dio la pista correcta - en gcc/opts.c Encontré parámetros adicionales que se establecen con -O3: 'max-aliased-vops' y' avg-aliased-vops'. Este último es la fuente de mi problema. Cuando se establece en '3' (que es el valor predeterminado para -O3), el compilador muestra el mismo comportamiento. ¡Gracias! – cschwan

+0

En aras de la integridad: 'max-partial-antic-length' también se efectúa con -O3. Esto también está documentado correctamente en la página man de gcc, aunque no se menciona en la descripción de -O3. – cschwan

+0

cschwan, me alegra oír que encuentras el problema, pero creo que * vops y * antic * se agregan en la versión gentoo de gcc o smth like, porque no hay tales opciones en "vainilla" gcc-4.6 – osgx

3

Si su compilador se cuelga, entonces sí, lo consideraría un error del compilador. Los compiladores también tienen errores.

(incluso si el compilador utilizado para compilar el compilador de tener errores, un error podría ser introducido en el nuevo compilador - gcc toma algunas medidas para evitar que por su arranque puesta en escena sin embargo.)

Podría haber otras cosas también, por ejemplo la optimización realizada solo lleva mucho, mucho más tiempo para llevarse a cabo, o el aumento en el nivel de optimización hace que se use más memoria y el sistema comienza a causar daños.

Cuestiones relacionadas