2012-04-24 12 views
10

Ich arbeite an einem Projekt, das ich mit LLVM 2.6 und dem Frontend llvm-gcc kompiliert habe. Ich versuche, es mit LLVM 3.1 und clang zu kompilieren. Als ich das tat, bekam ich folgende Fehlermeldung über -O5 Optimierungsstufe:Optimierungsstufen in LLVM und Clang

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

jedoch LLVM 2.6 und llvm-gcc haben mit der -O5 Flagge hat gut funktioniert. Ich sah die folgende Dokumentation über die Clang Optimierungsstufen:

-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. 

Also ich versuche, die -O5 im Makefile, um herauszufinden, was ich arbeite mit in erster Linie zu tun (ich nicht geschrieben hätte Makefile). Ist das etwas, das sich geändert hat und früher mit LLVM verwendet wurde? Oder ist es immer noch ein nützliches Feature und ich muss es nur auf andere Weise aktivieren.

Auch in dem Fall ist es sinnvoll, der Befehl ich ausgeführt habe, dass der Fehler gibt im Grunde ist:

/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 

Auch falls es zählt ich auf einem Linux (Ubuntu 10.04) x86_64-System am Laufen.

Antwort

12

Gcc behandelt jede -On für n> = 4 as -O3:

Die -O-Flag eine beliebige Zahl von 0-9 akzeptieren aber nur null bis drei umgesetzt werden, und ich glaube nicht, dass Jeder hat Pläne, irgendwann vier bis neun umzusetzen. Die Tatsache, dass Leute dieses -O9 Idiom verwenden, ist ein wenig beunruhigend, denn bedeutet, dass sie jede erdenkliche Optimierung, die gcc möglicherweise jemals bieten könnte, auch wenn es Kompilierung Wochen für keine Gewinn machen.

Größere Ebenen sollten nicht verwendet werden, Sie haben nur Makefile niedriger Qualität. So

Angabe -O9 ist ein bisschen - Typ Unsinn

Also, wenn gcc-Compiler verwendet wird, Sie gültige Varianten -O haben "aber das 10.59 geht!": -O0, -O1, -O2, -O3. Aber der Treiber konvertiert leise alle -On zu -O3.

LLVM (sowohl clang als auch llvm-gcc-Varianten des Treibers) unterstützt nur Ebenen bis zu -O4 (-O4 ist genau das gleiche wie -O3 -flto). Daher sollten Sie -O4 nicht ohne Tests verwenden, da lto langsamer ist und möglicherweise Ihr Programm durchbrechen kann.

2

Es könnte ein Fehler im Makefile gewesen sein, den llvm-gcc nicht als Fehler erkannt hat, aber es hat geklingelt.

Verwandte Themen