Уровни оптимизации в LLVM и Clang

Я работаю над проектом, который я компилировал с LLVM 2.6 и интерфейсом llvm-gcc. Я пытаюсь проверить его компиляцию с помощью LLVM 3.1 и clang. Когда я это сделал, я получил следующее сообщение об ошибке -O5:

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

Однако LLVM 2.6 и llvm-gcc отлично работали с флагом -O5. Я видел следующую документацию о уровнях оптимизации 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.

Итак, я пытаюсь выяснить, что делает -O5 в Makefile, с которым я работаю, в первую очередь (я не писал Makefile). Это что-то, что изменилось и использовалось для использования с LLVM? Или это все еще полезная функция, и мне просто нужно активировать ее каким-то другим способом.

Также в случае полезности команды, которую я запускаю, которая дает ошибку, в основном:

/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

Также в случае, если это имеет значение, я запускаю систему Linux (Ubuntu 10.04) x86_64.

Ответ 1

Gcc рассматривает любой -On для n >= 4 как -O3:

Флаг -O принимает любое число из 0-9, но реализованы только ноль-три, и я не думаю, что у любого есть планы, чтобы когда-либо реализовать четыре-девять в ближайшее время. Тот факт, что люди используют эту -O9-идиому, немного тревожит, потому что это означает, что они хотят любой мыслимой оптимизации, возможно, когда-либо предлагал, даже если он сделал компиляцию, заняв недели усиление.

Большие уровни не должны использоваться, у вас есть только качественный Makefile.

Таким образом, указание -O9 немного ", но это одиннадцать!" - введите бессмыслицу

Итак, когда используется gcc-компилятор, у вас есть допустимые варианты -O: -O0, -O1, -O2, -O3. Но драйвер будет конвертировать любой -On в -O3 молча.

LLVM (как версии clang, так и llvm-gcc) поддерживает только уровни до -O4 (-O4 точно так же, как -O3 -flto). Поэтому вы не должны использовать -O4 без тестирования, потому что lto работает медленнее и, возможно, может разорвать вашу программу.

Ответ 2

Возможно, в Makefile была ошибка, которую llvm-gcc не распознал как ошибку, но clang сделал.