Справочные страницы могут быть устаревшими, но вы можете найти фактические списки для O2 и O3.
Чтобы получить полный список ( почти , проверьте "обновление") из -f
параметров оптимизациифактически используется, я предлагаю вам использовать -fverbose-asm -save-temps
(или -fverbose-asm -S
) - есть полный список вверху файла asm (* .s).
Для gcc-4.6.0 я получил x (разница между O2 и O3):
-fgcse-after-reload
-finline-functions
-fipa-cp-clone
-fpredictive-commoning
-ftree-loop-distribute-patterns
-ftree-vectorize
-funswitch-loops
Другим источником информации для вашего вопроса являются источники GCC (файл gcc/opts.c
и, возможно, gcc/common.opt
) как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 },
Я также проверил, проверяет ли gcc -On
в других файлах (поиск символа cscope для x_optimize
).
Единственное дополнительное использованиеn
из опции -On
сохраняет значение в макросе __OPTIMIZE__
.Поэтому некоторые заголовки могут вести себя по-разному для значения этого макроса, равного 2 или 3.
ОБНОВЛЕНИЕ: В GCC WIKI есть вопросы :
- " Является ли -O1 (-O2, -O3 или -Os) эквивалентным индивидуальным опциям оптимизации?"
Нет.Во-первых, отдельные параметры оптимизации (-f *) не включают оптимизацию, требуется параметр -Os или -Ox с x> 0.Во-вторых, флаги -Ox включают много оптимизаций, которые не контролируются ни одной отдельной опцией -f *. Не планируется добавлять отдельные опции для управления всеми этими оптимизациями.
- " Какие конкретные флаги включены -O1 (-O2, -O3или -Os)?"
Зависит от платформы и версии GCC.Вы можете заставить GCC сообщить вам, какие флаги он включает, выполнив следующее:
touch empty.c
gcc -O1 -S -fverbose-asm empty.c
cat empty.s