2012-04-24 16 views
10

Estoy trabajando en un proyecto que había estado compilando con LLVM 2.6 y el front-end llvm-gcc. Estoy tratando de probar compilando con LLVM 3.1 y clang. Cuando hice esto me dieron el siguiente mensaje de error sobre -O5 nivel de optimización:Niveles de optimización en LLVM y Clang

error: invalid value '5' in '-O5' 

Sin embargo, LLVM 2.6 y llvm-gcc han trabajado bien con la bandera -O5. Vi la siguiente documentación acerca de los niveles de optimización Clang:

-O0 -O1 -O2 -Os -O3 -O4 
     Specify which optimization level to use. -O0 means "no optimization": this level compiles the 
     fastest and generates the most debuggable code. -O2 is a moderate level of optimization which 
     enables most optimizations. -Os is like -O2 with extra optimizations to reduce code size. -O3 
     is like -O2, except that it enables optimizations that take longer to perform or that may 
     generate larger code (in an attempt to make the program run faster). On supported platforms, -O4 
     enables link-time optimization; object files are stored in the LLVM bitcode file format and whole 
     program optimization is done at link time. -O1 is somewhere between -O0 and -O2. 

Así que estoy tratando de averiguar lo que el -O5 en el Makefile estoy trabajando con estaba haciendo en primer lugar (I no escribió el Makefile). ¿Esto es algo que cambió y solía usarse con LLVM? O sigue siendo una característica útil y solo necesito activarlo de alguna otra manera.

También en caso de que sea útil el comando Estoy corriendo que está dando el error es básicamente:

/bin/clang -g -c -mcmodel=medium -fstrict-aliasing -Wstrict-aliasing -O5 -emit-llvm -fkeep-inline-functions -fno-stack-protector -c -o foo.bc foo.cpp 

También en el caso Importa estoy corriendo en un sistema Linux x86_64 (10.04 Ubuntu).

Respuesta

12

gcc trata cualquier -On para n> = 4 as -O3:

La bandera -O aceptará cualquier número de 0-9 pero sólo cero a tres están en marcha, y no creo que cualquiera tiene algún plan para implementar alguna vez del cuatro al nueve en el corto plazo. El hecho de que las personas usen este idioma -O9 es un poco perturbador, porque implica que quieren todas las optimizaciones concebibles que gcc podría ofrecer , incluso si la compilación lleva semanas sin ganancia.

No se deben utilizar niveles más grandes, tiene simplemente Makefile de baja calidad.

Así especificando -O9 es un poco de - tipo sin sentido

lo tanto, cuando se utiliza el compilador gcc, se tienen variantes válidas de -O "pero ésta va a once!": -O0, -O1, -O2, -O3. Pero el controlador convertirá cualquier -On a -O3 en silencio.

LLVM (las variantes de driver de clang y llvm-gcc) solo admite niveles de hasta -O4 (-O4 es lo mismo que -O3 -flto). Por lo tanto, no debe usar -O4 sin probar, porque lto es más lento y posiblemente puede interrumpir su programa.

2

Puede haber sido un error en el Makefile que llvm-gcc no reconoció como un error, pero clang lo hizo.

Cuestiones relacionadas