Ответ 1
Персональные страницы могут устаревать, но вы можете найти фактические списки для O2 и O3.
Чтобы получить полный список (почти, проверьте "обновление" ) опций оптимизации -f
, которые я использую, я предлагаю вам использовать -fverbose-asm -save-temps
(или -fverbose-asm -S
) - есть полный список в верхней части asm файла (*.с).
Для 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.
UPDATE: В GCC WIKI есть вопросы об этом:
- "Is -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