Options That Control Optimization
These options control various sorts of optimizations:
-O
-O1 Optimize. Optimizing compilation takes somewhat more time, and a
lot more memory for a large function.
Without -O, the compiler's goal is to reduce the cost of compila-
tion and to make debugging produce the expected results. State-
ments are independent: if you stop the program with a breakpoint
between statements, you can then assign a new value to any variable
or change the program counter to any other statement in the func-
tion and get exactly the results you would expect from the source
code.
With -O, the compiler tries to reduce code size and execution time,
without performing any optimizations that take a great deal of com-
pilation time.
-O2 Optimize even more. GCC performs nearly all supported optimiza-
tions that do not involve a space-speed tradeoff. The compiler
does not perform loop unrolling or function inlining when you spec-
ify -O2. As compared to -O, this option increases both compilation
time and the performance of the generated code.
-O2 turns on all optional optimizations except for loop unrolling,
function inlining, and register renaming. It also turns on the
-fforce-mem option on all machines and frame pointer elimination on
machines where doing so does not interfere with debugging.
Please note the warning under -fgcse about invoking -O2 on programs
that use computed gotos.
-O3 Optimize yet more. -O3 turns on all optimizations specified by -O2
and also turns on the -finline-functions and -frename-registers options.
-O0 Do not optimize.
-Os Optimize for size. -Os enables all -O2 optimizations that do not
typically increase code size. It also performs further optimiza-
tions designed to reduce code size.
If you use multiple -O options, with or without level numbers, the
last such option is the one that is effective.