Man pages can be outdated, but you can find actual lists for O2 and O3.
To get full list (almost, check “update”) of -f
optimization options actually used, I suggest you use the -fverbose-asm -save-temps
(or -fverbose-asm -S
) – there is a full list at a top of asm file (*.s).
For gcc-4.6.0 I got x (the difference between O2 and O3) to be:
-fgcse-after-reload
-finline-functions
-fipa-cp-clone
-fpredictive-commoning
-ftree-loop-distribute-patterns
-ftree-vectorize
-funswitch-loops
Another source of information for your question is the sources of GCC (file gcc/opts.c
and possibly gcc/common.opt
) as 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 },
I have also checked, does gcc check -On
in other files (cscope symbol search for x_optimize
).
The only additional usage of n
from option -On
is saving it value into macro __OPTIMIZE__
. So some headers can behave differently for value of this macro equal 2 or 3.
UPDATE: There are questions about it in GCC WIKI:
- “Is -O1 (-O2,-O3 or -Os) equivalent to individual -foptimization options?”
No. First, individual optimization options (-f*) do not enable optimization, an option -Os or -Ox with x > 0 is required. Second, the -Ox flags enable many optimizations that are not controlled by any individual -f* option. There are no plans to add individual options for controlling all these optimizations.
- “What specific flags are enabled by -O1 (-O2, -O3 or -Os)?“
Varies by platform and GCC version. You can get GCC to tell you what flags it enables by doing this:
touch empty.c
gcc -O1 -S -fverbose-asm empty.c
cat empty.s