Next: Instrumentation Options, Previous: Debugging Options, Up: Invoking GCC
These options control various sorts of optimizations.
Without any optimization option, the compiler's goal is to reduce the cost of compilation and to make debugging produce the expected results. Statements 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 function and get exactly the results you expect from the source code.
Turning on optimization flags makes the compiler attempt to improve the performance and/or code size at the expense of compilation time and possibly the ability to debug the program.
The compiler performs optimization based on the knowledge it has of the program. Compiling multiple files at once to a single output file mode allows the compiler to use information gained from all of the files when compiling each of them.
Not all optimizations are controlled directly by a flag. Only optimizations that have a flag are listed in this section.
Most optimizations are completely disabled at -O0 or if an -O level is not set on the command line, even if individual optimization flags are specified. Similarly, -Og suppresses many optimization passes.
Depending on the target and how GCC was configured, a slightly different set of optimizations may be enabled at each -O level than those listed here. You can invoke GCC with -Q --help=optimizers to find out the exact set of optimizations that are enabled at each level. See Overall Options, for examples.
-O
-O1
With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time.
-O turns on the following optimization flags:
-fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fforward-propagate -fguess-branch-probability -fif-conversion -fif-conversion2 -finline-functions-called-once -fipa-modref -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fmerge-constants -fmove-loop-invariants -fmove-loop-stores -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -funit-at-a-time
-O2
-O2 turns on all optimization flags specified by -O1. It also turns on the following optimization flags:
-falign-functions -falign-jumps -falign-labels -falign-loops -fcaller-saves -fcode-hoisting -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fexpensive-optimizations -ffinite-loops -fgcse -fgcse-lm -fhoist-adjacent-loads -finline-functions -finline-small-functions -findirect-inlining -fipa-bit-cp -fipa-cp -fipa-icf -fipa-ra -fipa-sra -fipa-vrp -fisolate-erroneous-paths-dereference -flra-remat -foptimize-sibling-calls -foptimize-strlen -fpartial-inlining -fpeephole2 -freorder-blocks-algorithm=stc -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fstore-merging -fstrict-aliasing -fthread-jumps -ftree-builtin-call-dce -ftree-loop-vectorize -ftree-pre -ftree-slp-vectorize -ftree-switch-conversion -ftree-tail-merge -ftree-vrp -fvect-cost-model=very-cheap
Please note the warning under -fgcse about
invoking -O2 on programs that use computed gotos.
-O3
-fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning -fsplit-loops -fsplit-paths -ftree-loop-distribution -ftree-partial-pre -funswitch-loops -fvect-cost-model=dynamic -fversion-loops-for-strides
-O0
-Os
-falign-functions -falign-jumps -falign-labels -falign-loops -fprefetch-loop-arrays -freorder-blocks-algorithm=stc
It also enables -finline-functions, causes the compiler to tune for
code size rather than execution speed, and performs further optimizations
designed to reduce code size.
-Ofast
-Og
Like -O0, -Og completely disables a number of optimization passes so that individual options controlling them have no effect. Otherwise -Og enables all -O1 optimization flags except for those that may interfere with debugging:
-fbranch-count-reg -fdelayed-branch -fdse -fif-conversion -fif-conversion2 -finline-functions-called-once -fmove-loop-invariants -fmove-loop-stores -fssa-phiopt -ftree-bit-ccp -ftree-dse -ftree-pta -ftree-sra
-Oz
If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.
Options of the form -fflag specify machine-independent flags. Most flags have both positive and negative forms; the negative form of -ffoo is -fno-foo. In the table below, only one of the forms is listed—the one you typically use. You can figure out the other form by either removing `no-' or adding it.
The following options control specific optimizations. They are either activated by -O options or are related to ones that are. You can use the following flags in the rare cases when “fine-tuning” of optimizations to be performed is desired.
-fno-defer-pop
-fforward-propagate
This option is enabled by default at optimization levels -O1,
-O2, -O3, -Os.
-ffp-contract=
styleThe default is -ffp-contract=fast.
-fomit-frame-pointer
On some targets this flag has no effect because the standard calling sequence always uses a frame pointer, so it cannot be omitted.
Note that -fno-omit-frame-pointer doesn't guarantee the frame pointer is used in all functions. Several targets always omit the frame pointer in leaf functions.
Enabled by default at -O1 and higher.
-foptimize-sibling-calls
Enabled at levels -O2, -O3, -Os.
-foptimize-strlen
strlen
,
strchr
or strcpy
) and
their _FORTIFY_SOURCE
counterparts into faster alternatives.
Enabled at levels -O2, -O3.
-fno-inline
always_inline
attribute. This is the default when not
optimizing.
Single functions can be exempted from inlining by marking them
with the noinline
attribute.
-finline-small-functions
Enabled at levels -O2, -O3, -Os.
-findirect-inlining
Enabled at levels -O2, -O3, -Os.
-finline-functions
If all calls to a given function are integrated, and the function is
declared static
, then the function is normally not output as
assembler code in its own right.
Enabled at levels -O2, -O3, -Os. Also enabled
by -fprofile-use and -fauto-profile.
-finline-functions-called-once
static
functions called once for inlining into their
caller even if they are not marked inline
. If a call to a given
function is integrated, then the function is not output as assembler code
in its own right.
Enabled at levels -O1, -O2, -O3 and -Os,
but not -Og.
-fearly-inlining
always_inline
and functions whose body seems
smaller than the function call overhead early before doing
-fprofile-generate instrumentation and real inlining pass. Doing so
makes profiling significantly cheaper and usually inlining faster on programs
having large chains of nested wrapper functions.
Enabled by default.
-fipa-sra
Enabled at levels -O2, -O3 and -Os.
-finline-limit=
nInlining is actually controlled by a number of parameters, which may be specified individually by using --param name=value. The -finline-limit=n option sets some of these parameters as follows:
max-inline-insns-single
max-inline-insns-auto
See below for a documentation of the individual parameters controlling inlining and for the defaults of these parameters.
Note: there may be no value to -finline-limit that results in default behavior.
Note: pseudo instruction represents, in this particular context, an
abstract measurement of function's size. In no way does it represent a count
of assembly instructions and as such its exact meaning might change from one
release to an another.
-fno-keep-inline-dllexport
dllexport
attribute or declspec. See Declaring Attributes of Functions.
-fkeep-inline-functions
static
functions that are declared inline
into the object file, even if the function has been inlined into all
of its callers. This switch does not affect functions using the
extern inline
extension in GNU C90. In C++, emit any and all
inline functions into the object file.
-fkeep-static-functions
static
functions into the object file, even if the function
is never used.
-fkeep-static-consts
static const
when optimization isn't turned
on, even if the variables aren't referenced.
GCC enables this option by default. If you want to force the compiler to
check if a variable is referenced, regardless of whether or not
optimization is turned on, use the -fno-keep-static-consts option.
-fmerge-constants
This option is the default for optimized compilation if the assembler and linker support it. Use -fno-merge-constants to inhibit this behavior.
Enabled at levels -O1, -O2, -O3, -Os.
-fmerge-all-constants
This option implies -fmerge-constants. In addition to
-fmerge-constants this considers e.g. even constant initialized
arrays or initialized constant variables with integral or floating-point
types. Languages like C or C++ require each variable, including multiple
instances of the same variable in recursive calls, to have distinct locations,
so using this option results in non-conforming
behavior.
-fmodulo-sched
-fmodulo-sched-allow-regmoves
-fno-branch-count-reg
The default is -fbranch-count-reg at -O1 and higher,
except for -Og.
-fno-function-cse
This option results in less efficient code, but some strange hacks that alter the assembler output may be confused by the optimizations performed when this option is not used.
The default is -ffunction-cse
-fno-zero-initialized-in-bss
This option turns off this behavior because some programs explicitly rely on variables going to the data section—e.g., so that the resulting executable can find the beginning of that section and/or make assumptions based on that.
The default is -fzero-initialized-in-bss.
-fthread-jumps
Enabled at levels -O1, -O2, -O3, -Os.
-fsplit-wide-types
long
long
on a 32-bit system, split the registers apart and allocate them
independently. This normally generates better code for those types,
but may make debugging more difficult.
Enabled at levels -O1, -O2, -O3,
-Os.
-fsplit-wide-types-early
This is the default on some targets.
-fcse-follow-jumps
if
statement with an
else
clause, CSE follows the jump when the condition
tested is false.
Enabled at levels -O2, -O3, -Os.
-fcse-skip-blocks
if
statement with no else clause,
-fcse-skip-blocks causes CSE to follow the jump around the
body of the if
.
Enabled at levels -O2, -O3, -Os.
-frerun-cse-after-loop
Enabled at levels -O2, -O3, -Os.
-fgcse
Note: When compiling a program using computed gotos, a GCC extension, you may get better run-time performance if you disable the global common subexpression elimination pass by adding -fno-gcse to the command line.
Enabled at levels -O2, -O3, -Os.
-fgcse-lm
Enabled by default when -fgcse is enabled.
-fgcse-sm
Not enabled at any optimization level.
-fgcse-las
Not enabled at any optimization level.
-fgcse-after-reload
Enabled by -O3, -fprofile-use and -fauto-profile.
-faggressive-loop-optimizations
-funconstrained-commons
-fcrossjumping
Enabled at levels -O2, -O3, -Os.
-fauto-inc-dec
-fdce
-fdse
-fif-conversion
Enabled at levels -O1, -O2, -O3, -Os, but
not with -Og.
-fif-conversion2
Enabled at levels -O1, -O2, -O3, -Os, but
not with -Og.
-fdeclone-ctor-dtor
Enabled by -Os.
-fdelete-null-pointer-checks
Note however that in some environments this assumption is not true. Use -fno-delete-null-pointer-checks to disable this optimization for programs that depend on that behavior.
This option is enabled by default on most targets. On Nios II ELF, it defaults to off. On AVR, CR16, and MSP430, this option is completely disabled.
Passes that use the dataflow information
are enabled independently at different optimization levels.
-fdevirtualize
-fdevirtualize-speculatively
-fdevirtualize-at-ltrans
-fexpensive-optimizations
Enabled at levels -O2, -O3, -Os.
-free
Enabled for Alpha, AArch64 and x86 at levels -O2,
-O3, -Os.
-fno-lifetime-dse
-flive-range-shrinkage
-fira-algorithm=
algorithm-fira-region=
region-fira-hoist-pressure
This option is enabled at level -Os for all targets.
-fira-loop-pressure
This option is enabled at level -O3 for some targets.
-fno-ira-share-save-slots
-fno-ira-share-spill-slots
-flra-remat
Enabled at levels -O2, -O3, -Os.
-fdelayed-branch
Enabled at levels -O1, -O2, -O3, -Os,
but not at -Og.
-fschedule-insns
Enabled at levels -O2, -O3.
-fschedule-insns2
Enabled at levels -O2, -O3, -Os.
-fno-sched-interblock
-fno-sched-spec
-fsched-pressure
-fsched-spec-load
-fsched-spec-load-dangerous
-fsched-stalled-insns
-fsched-stalled-insns=
n-fsched-stalled-insns-dep
-fsched-stalled-insns-dep=
n-fsched2-use-superblocks
This only makes sense when scheduling after register allocation, i.e. with
-fschedule-insns2 or at -O2 or higher.
-fsched-group-heuristic
-fsched-critical-path-heuristic
-fsched-spec-insn-heuristic
-fsched-rank-heuristic
-fsched-last-insn-heuristic
-fsched-dep-count-heuristic
-freschedule-modulo-scheduled-loops
-fselective-scheduling
-fselective-scheduling2
-fsel-sched-pipelining
-fsel-sched-pipelining-outer-loops
-fsemantic-interposition
-fshrink-wrap
-fshrink-wrap-separate
-fcaller-saves
This option is always enabled by default on certain machines, usually those which have no call-preserved registers to use instead.
Enabled at levels -O2, -O3, -Os.
-fcombine-stack-adjustments
Enabled by default at -O1 and higher.
-fipa-ra
Enabled at levels -O2, -O3, -Os, however the option
is disabled if generated code will be instrumented for profiling
(-p, or -pg) or if callee's register usage cannot be known
exactly (this happens on targets that do not expose prologues
and epilogues in RTL).
-fconserve-stack
-ftree-reassoc
-fcode-hoisting
-ftree-pre
-ftree-partial-pre
-ftree-forwprop
-ftree-fre
-ftree-phiprop
-fhoist-adjacent-loads
-ftree-copy-prop
-fipa-pure-const
-fipa-reference
-fipa-reference-addressable
-fipa-stack-alignment
-fipa-pta
-fipa-profile
cold
, noreturn
, static constructors or destructors) are
identified. Cold functions and loop less parts of functions executed once are
then optimized for size.
Enabled by default at -O1 and higher.
-fipa-modref
-fipa-cp
-fipa-cp-clone
-fipa-bit-cp
-fipa-vrp
-fipa-icf
Although the behavior is similar to the Gold Linker's ICF optimization, GCC ICF works on different levels and thus the optimizations are not same - there are equivalences that are found only by GCC and equivalences found only by Gold.
This flag is enabled by default at -O2 and -Os.
-flive-patching=
levelIf the compiler's optimization uses a function's body or information extracted from its body to optimize/change another function, the latter is called an impacted function of the former. If a function is patched, its impacted functions should be patched too.
The impacted functions are determined by the compiler's interprocedural optimizations. For example, a caller is impacted when inlining a function into its caller, cloning a function and changing its caller to call this new clone, or extracting a function's pureness/constness information to optimize its direct or indirect callers, etc.
Usually, the more IPA optimizations enabled, the larger the number of impacted functions for each function. In order to control the number of impacted functions and more easily compute the list of impacted function, IPA optimizations can be partially enabled at two different levels.
The level argument should be one of the following:
-flive-patching=inline-clone disables the following optimization flags:
-fwhole-program -fipa-pta -fipa-reference -fipa-ra -fipa-icf -fipa-icf-functions -fipa-icf-variables -fipa-bit-cp -fipa-vrp -fipa-pure-const -fipa-reference-addressable -fipa-stack-alignment -fipa-modref
In addition to all the flags that -flive-patching=inline-clone disables, -flive-patching=inline-only-static disables the following additional optimization flags:
-fipa-cp-clone -fipa-sra -fpartial-inlining -fipa-cp
When -flive-patching is specified without any value, the default value is inline-clone.
This flag is disabled by default.
Note that -flive-patching is not supported with link-time optimization
(-flto).
-fisolate-erroneous-paths-dereference
-fisolate-erroneous-paths-attribute
returns_nonnull
or nonnull
attribute. Isolate those paths from the main control flow and turn the
statement with erroneous or undefined behavior into a trap. This is not
currently enabled, but may be enabled by -O2 in the future.
-ftree-sink
-ftree-bit-ccp
-ftree-ccp
-fssa-backprop
-fssa-phiopt
-ftree-switch-conversion
-ftree-tail-merge
-ftree-dce
-ftree-builtin-call-dce
errno
but are otherwise free of side effects. This flag is
enabled by default at -O2 and higher if -Os is not also
specified.
-ffinite-loops
This option is enabled by default at -O2 for C++ with -std=c++11
or higher.
-ftree-dominator-opts
-ftree-dse
-ftree-ch
-ftree-loop-optimize
-ftree-loop-linear
-floop-strip-mine
-floop-block
-fgraphite-identity
-floop-nest-optimize
-floop-parallelize-all
-ftree-coalesce-vars
-ftree-loop-if-convert
-ftree-loop-distribution
DO I = 1, N A(I) = B(I) + C D(I) = E(I) * F ENDDO
is transformed to
DO I = 1, N A(I) = B(I) + C ENDDO DO I = 1, N D(I) = E(I) * F ENDDO
This flag is enabled by default at -O3.
It is also enabled by -fprofile-use and -fauto-profile.
-ftree-loop-distribute-patterns
This pass distributes the initialization loops and generates a call to memset zero. For example, the loop
DO I = 1, N A(I) = 0 B(I) = A(I) + I ENDDO
is transformed to
DO I = 1, N A(I) = 0 ENDDO DO I = 1, N B(I) = A(I) + I ENDDO
and the initialization loop is transformed into a call to memset zero.
This flag is enabled by default at -O3.
It is also enabled by -fprofile-use and -fauto-profile.
-floop-interchange
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j];
is transformed to
for (int i = 0; i < N; i++) for (int k = 0; k < N; k++) for (int j = 0; j < N; j++) c[i][j] = c[i][j] + a[i][k]*b[k][j];
This flag is enabled by default at -O3.
It is also enabled by -fprofile-use and -fauto-profile.
-floop-unroll-and-jam
-ftree-loop-im
-ftree-loop-ivcanon
-ftree-scev-cprop
-fivopts
-ftree-parallelize-loops=n
-ftree-pta
-ftree-sra
-fstore-merging
-ftree-ter
-ftree-slsr
-ftree-vectorize
-ftree-loop-vectorize
-ftree-slp-vectorize
-ftrivial-auto-var-init=
choiceswitch
statement. Using -Wtrivial-auto-var-init to report all
such cases.
The three values of choice are:
The default is `uninitialized'.
You can control this behavior for a specific variable by using the variable
attribute uninitialized
(see Variable Attributes).
-fvect-cost-model=
modelThe default cost model depends on other optimization flags and is
either `dynamic' or `cheap'.
-fsimd-cost-model=
model-ftree-vrp
-fsplit-paths
-fsplit-ivs-in-unroller
A combination of -fweb and CSE is often sufficient to obtain the same effect. However, that is not reliable in cases where the loop body is more complicated than a single basic block. It also does not work at all on some architectures due to restrictions in the CSE pass.
This optimization is enabled by default.
-fvariable-expansion-in-unroller
This optimization is enabled by default for PowerPC targets, but disabled
by default otherwise.
-fpartial-inlining
Enabled at levels -O2, -O3, -Os.
-fpredictive-commoning
This option is enabled at level -O3.
It is also enabled by -fprofile-use and -fauto-profile.
-fprefetch-loop-arrays
This option may generate better or worse code; results are highly dependent on the structure of loops within the source code.
Disabled at level -Os.
-fno-printf-return-value
sprintf
, snprintf
, vsprintf
, and
vsnprintf
(but not printf
of fprintf
). This
transformation allows GCC to optimize or even eliminate branches based
on the known return value of these functions called with arguments that
are either constant, or whose values are known to be in a range that
makes determining the exact return value possible. For example, when
-fprintf-return-value is in effect, both the branch and the
body of the if
statement (but not the call to snprint
)
can be optimized away when i
is a 32-bit or smaller integer
because the return value is guaranteed to be at most 8.
char buf[9]; if (snprintf (buf, "%08x", i) >= sizeof buf) ...
The -fprintf-return-value option relies on other optimizations
and yields best results with -O2 and above. It works in tandem
with the -Wformat-overflow and -Wformat-truncation
options. The -fprintf-return-value option is enabled by default.
-fno-peephole
-fno-peephole2
-fpeephole is enabled by default.
-fpeephole2 enabled at levels -O2, -O3, -Os.
-fno-guess-branch-probability
GCC uses heuristics to guess branch probabilities if they are
not provided by profiling feedback (-fprofile-arcs). These
heuristics are based on the control flow graph. If some branch probabilities
are specified by __builtin_expect
, then the heuristics are
used to guess branch probabilities for the rest of the control flow graph,
taking the __builtin_expect
info into account. The interactions
between the heuristics and __builtin_expect
can be complex, and in
some cases, it may be useful to disable the heuristics so that the effects
of __builtin_expect
are easier to understand.
It is also possible to specify expected probability of the expression
with __builtin_expect_with_probability
built-in function.
The default is -fguess-branch-probability at levels
-O, -O2, -O3, -Os.
-freorder-blocks
Enabled at levels -O1, -O2, -O3, -Os.
-freorder-blocks-algorithm=
algorithmThe default is `simple' at levels -O1, -Os, and
`stc' at levels -O2, -O3.
-freorder-blocks-and-partition
This optimization is automatically turned off in the presence of exception handling or unwind tables (on targets using setjump/longjump or target specific scheme), for linkonce sections, for functions with a user-defined section attribute and on any architecture that does not support named sections. When -fsplit-stack is used this option is not enabled by default (to avoid linker errors), but may be enabled explicitly (if using a working linker).
Enabled for x86 at levels -O2, -O3, -Os.
-freorder-functions
.text.hot
for most frequently executed functions and
.text.unlikely
for unlikely executed functions. Reordering is done by
the linker so object file format must support named sections and linker must
place them in a reasonable way.
This option isn't effective unless you either provide profile feedback
(see -fprofile-arcs for details) or manually annotate functions with
hot
or cold
attributes (see Common Function Attributes).
Enabled at levels -O2, -O3, -Os.
-fstrict-aliasing
unsigned int
can alias an int
, but not a
void*
or a double
. A character type may alias any other
type.
Pay special attention to code like this:
union a_union { int i; double d; }; int f() { union a_union t; t.d = 3.0; return t.i; }
The practice of reading from a different union member than the one most recently written to (called “type-punning”) is common. Even with -fstrict-aliasing, type-punning is allowed, provided the memory is accessed through the union type. So, the code above works as expected. See Structures unions enumerations and bit-fields implementation. However, this code might not:
int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }
Similarly, access by taking the address, casting the resulting pointer and dereferencing the result has undefined behavior, even if the cast uses a union type, e.g.:
int f() { double d = 3.0; return ((union a_union *) &d)->i; }
The -fstrict-aliasing option is enabled at levels
-O2, -O3, -Os.
-fipa-strict-aliasing
The -fipa-strict-aliasing option is enabled by default and is
effective only in combination with -fstrict-aliasing.
-falign-functions
-falign-functions=
n-falign-functions=
n:
m-falign-functions=
n:
m:
n2-falign-functions=
n:
m:
n2:
m2If m is not specified, it defaults to n.
Examples: -falign-functions=32 aligns functions to the next 32-byte boundary, -falign-functions=24 aligns to the next 32-byte boundary only if this can be done by skipping 23 bytes or less, -falign-functions=32:7 aligns to the next 32-byte boundary only if this can be done by skipping 6 bytes or less.
The second pair of n2:m2 values allows you to specify a secondary alignment: -falign-functions=64:7:32:3 aligns to the next 64-byte boundary if this can be done by skipping 6 bytes or less, otherwise aligns to the next 32-byte boundary if this can be done by skipping 2 bytes or less. If m2 is not specified, it defaults to n2.
Some assemblers only support this flag when n is a power of two; in that case, it is rounded up.
-fno-align-functions and -falign-functions=1 are equivalent and mean that functions are not aligned.
If n is not specified or is zero, use a machine-dependent default. The maximum allowed n option value is 65536.
Enabled at levels -O2, -O3.
-flimit-function-alignment
-falign-labels
-falign-labels=
n-falign-labels=
n:
m-falign-labels=
n:
m:
n2-falign-labels=
n:
m:
n2:
m2Parameters of this option are analogous to the -falign-functions option. -fno-align-labels and -falign-labels=1 are equivalent and mean that labels are not aligned.
If -falign-loops or -falign-jumps are applicable and are greater than this value, then their values are used instead.
If n is not specified or is zero, use a machine-dependent default which is very likely to be `1', meaning no alignment. The maximum allowed n option value is 65536.
Enabled at levels -O2, -O3.
-falign-loops
-falign-loops=
n-falign-loops=
n:
m-falign-loops=
n:
m:
n2-falign-loops=
n:
m:
n2:
m2If -falign-labels is greater than this value, then its value is used instead.
Parameters of this option are analogous to the -falign-functions option. -fno-align-loops and -falign-loops=1 are equivalent and mean that loops are not aligned. The maximum allowed n option value is 65536.
If n is not specified or is zero, use a machine-dependent default.
Enabled at levels -O2, -O3.
-falign-jumps
-falign-jumps=
n-falign-jumps=
n:
m-falign-jumps=
n:
m:
n2-falign-jumps=
n:
m:
n2:
m2If -falign-labels is greater than this value, then its value is used instead.
Parameters of this option are analogous to the -falign-functions option. -fno-align-jumps and -falign-jumps=1 are equivalent and mean that loops are not aligned.
If n is not specified or is zero, use a machine-dependent default. The maximum allowed n option value is 65536.
Enabled at levels -O2, -O3.
-fno-allocation-dce
-fallow-store-data-races
Examples of optimizations enabled by -fallow-store-data-races include hoisting or if-conversions that may cause a value that was already in memory to be re-written with that same value. Such re-writing is safe in a single threaded context but may be unsafe in a multi-threaded context. Note that on some processors, if-conversions may be required in order to enable vectorization.
Enabled at level -Ofast.
-funit-at-a-time
Enabled by default.
-fno-toplevel-reorder
asm
statements. Output them in the same order that they appear in the
input file. When this option is used, unreferenced static variables
are not removed. This option is intended to support existing code
that relies on a particular ordering. For new code, it is better to
use attributes when possible.
-ftoplevel-reorder is the default at -O1 and higher, and
also at -O0 if -fsection-anchors is explicitly requested.
Additionally -fno-toplevel-reorder implies
-fno-section-anchors.
-fweb
Enabled by default with -funroll-loops.
-fwhole-program
main
and those merged by attribute externally_visible
become static functions
and in effect are optimized more aggressively by interprocedural optimizers.
This option should not be used in combination with -flto.
Instead relying on a linker plugin should provide safer and more precise
information.
-flto[=
n]
To use the link-time optimizer, -flto and optimization options should be specified at compile time and during the final link. It is recommended that you compile all the files participating in the same link with the same options and also specify those options at link time. For example:
gcc -c -O2 -flto foo.c gcc -c -O2 -flto bar.c gcc -o myprog -flto -O2 foo.o bar.o
The first two invocations to GCC save a bytecode representation of GIMPLE into special ELF sections inside foo.o and bar.o. The final invocation reads the GIMPLE bytecode from foo.o and bar.o, merges the two files into a single internal image, and compiles the result as usual. Since both foo.o and bar.o are merged into a single image, this causes all the interprocedural analyses and optimizations in GCC to work across the two files as if they were a single one. This means, for example, that the inliner is able to inline functions in bar.o into functions in foo.o and vice-versa.
Another (simpler) way to enable link-time optimization is:
gcc -o myprog -flto -O2 foo.c bar.c
The above generates bytecode for foo.c and bar.c, merges them together into a single GIMPLE representation and optimizes them as usual to produce myprog.
The important thing to keep in mind is that to enable link-time optimizations you need to use the GCC driver to perform the link step. GCC automatically performs link-time optimization if any of the objects involved were compiled with the -flto command-line option. You can always override the automatic decision to do link-time optimization by passing -fno-lto to the link command.
To make whole program optimization effective, it is necessary to make certain whole program assumptions. The compiler needs to know what functions and variables can be accessed by libraries and runtime outside of the link-time optimized unit. When supported by the linker, the linker plugin (see -fuse-linker-plugin) passes information to the compiler about used and externally visible symbols. When the linker plugin is not available, -fwhole-program should be used to allow the compiler to make these assumptions, which leads to more aggressive optimization decisions.
When a file is compiled with -flto without -fuse-linker-plugin, the generated object file is larger than a regular object file because it contains GIMPLE bytecodes and the usual final code (see -ffat-lto-objects). This means that object files with LTO information can be linked as normal object files; if -fno-lto is passed to the linker, no interprocedural optimizations are applied. Note that when -fno-fat-lto-objects is enabled the compile stage is faster but you cannot perform a regular, non-LTO link on them.
When producing the final binary, GCC only applies link-time optimizations to those files that contain bytecode. Therefore, you can mix and match object files and libraries with GIMPLE bytecodes and final object code. GCC automatically selects which files to optimize in LTO mode and which files to link without further processing.
Generally, options specified at link time override those specified at compile time, although in some cases GCC attempts to infer link-time options from the settings used to compile the input files.
If you do not specify an optimization level option -O at link time, then GCC uses the highest optimization level used when compiling the object files. Note that it is generally ineffective to specify an optimization level option only at link time and not at compile time, for two reasons. First, compiling without optimization suppresses compiler passes that gather information needed for effective optimization at link time. Second, some early optimization passes can be performed only at compile time and not at link time.
There are some code generation flags preserved by GCC when generating bytecodes, as they need to be used during the final link. Currently, the following options and their settings are taken from the first object file that explicitly specifies them: -fcommon, -fexceptions, -fnon-call-exceptions, -fgnu-tm and all the -m target flags.
The following options -fPIC, -fpic, -fpie and -fPIE are combined based on the following scheme:
-fPIC + -fpic = -fpic -fPIC + -fno-pic = -fno-pic -fpic/-fPIC + (no option) = (no option) -fPIC + -fPIE = -fPIE -fpic + -fPIE = -fpie -fPIC/-fpic + -fpie = -fpie
Certain ABI-changing flags are required to match in all compilation units, and trying to override this at link time with a conflicting value is ignored. This includes options such as -freg-struct-return and -fpcc-struct-return.
Other options such as -ffp-contract, -fno-strict-overflow, -fwrapv, -fno-trapv or -fno-strict-aliasing are passed through to the link stage and merged conservatively for conflicting translation units. Specifically -fno-strict-overflow, -fwrapv and -fno-trapv take precedence; and for example -ffp-contract=off takes precedence over -ffp-contract=fast. You can override them at link time.
Diagnostic options such as -Wstringop-overflow are passed through to the link stage and their setting matches that of the compile-step at function granularity. Note that this matters only for diagnostics emitted during optimization. Note that code transforms such as inlining can lead to warnings being enabled or disabled for regions if code not consistent with the setting at compile time.
When you need to pass options to the assembler via -Wa or -Xassembler make sure to either compile such translation units with -fno-lto or consistently use the same assembler options on all translation units. You can alternatively also specify assembler options at LTO link time.
To enable debug info generation you need to supply -g at compile time. If any of the input files at link time were built with debug info generation enabled the link will enable debug info generation as well. Any elaborate debug info settings like the dwarf level -gdwarf-5 need to be explicitly repeated at the linker command line and mixing different settings in different translation units is discouraged.
If LTO encounters objects with C linkage declared with incompatible types in separate translation units to be linked together (undefined behavior according to ISO C99 6.2.7), a non-fatal diagnostic may be issued. The behavior is still undefined at run time. Similar diagnostics may be raised for other languages.
Another feature of LTO is that it is possible to apply interprocedural optimizations on files written in different languages:
gcc -c -flto foo.c g++ -c -flto bar.cc gfortran -c -flto baz.f90 g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran
Notice that the final link is done with g++ to get the C++ runtime libraries and -lgfortran is added to get the Fortran runtime libraries. In general, when mixing languages in LTO mode, you should use the same link command options as when mixing languages in a regular (non-LTO) compilation.
If object files containing GIMPLE bytecode are stored in a library archive, say libfoo.a, it is possible to extract and use them in an LTO link if you are using a linker with plugin support. To create static libraries suitable for LTO, use gcc-ar and gcc-ranlib instead of ar and ranlib; to show the symbols of object files with GIMPLE bytecode, use gcc-nm. Those commands require that ar, ranlib and nm have been compiled with plugin support. At link time, use the flag -fuse-linker-plugin to ensure that the library participates in the LTO optimization process:
gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo
With the linker plugin enabled, the linker extracts the needed GIMPLE files from libfoo.a and passes them on to the running GCC to make them part of the aggregated GIMPLE image to be optimized.
If you are not using a linker with plugin support and/or do not enable the linker plugin, then the objects inside libfoo.a are extracted and linked as usual, but they do not participate in the LTO optimization process. In order to make a static library suitable for both LTO optimization and usual linkage, compile its object files with -flto -ffat-lto-objects.
Link-time optimizations do not require the presence of the whole program to operate. If the program does not require any symbols to be exported, it is possible to combine -flto and -fwhole-program to allow the interprocedural optimizers to use more aggressive assumptions which may lead to improved optimization opportunities. Use of -fwhole-program is not needed when linker plugin is active (see -fuse-linker-plugin).
The current implementation of LTO makes no attempt to generate bytecode that is portable between different types of hosts. The bytecode files are versioned and there is a strict version check, so bytecode files generated in one version of GCC do not work with an older or newer version of GCC.
Link-time optimization does not work well with generation of debugging information on systems other than those using a combination of ELF and DWARF.
If you specify the optional n, the optimization and code generation done at link time is executed in parallel using n parallel jobs by utilizing an installed make program. The environment variable MAKE may be used to override the program used.
You can also specify -flto=jobserver to use GNU make's job server mode to determine the number of parallel jobs. This is useful when the Makefile calling GCC is already executing in parallel. You must prepend a `+' to the command recipe in the parent Makefile for this to work. This option likely only works if MAKE is GNU make. Even without the option value, GCC tries to automatically detect a running GNU make's job server.
Use -flto=auto to use GNU make's job server, if available,
or otherwise fall back to autodetection of the number of CPU threads
present in your system.
-flto-partition=
alg-flto-compression-level=
n-fuse-linker-plugin
This option enables the extraction of object files with GIMPLE bytecode out of library archives. This improves the quality of optimization by exposing more code to the link-time optimizer. This information specifies what symbols can be accessed externally (by non-LTO object or during dynamic linking). Resulting code quality improvements on binaries (and shared libraries that use hidden visibility) are similar to -fwhole-program. See -flto for a description of the effect of this flag and how to use it.
This option is enabled by default when LTO support in GCC is enabled
and GCC was configured for use with
a linker supporting plugins (GNU ld 2.21 or newer or gold).
-ffat-lto-objects
-fno-fat-lto-objects improves compilation time over plain LTO, but requires the complete toolchain to be aware of LTO. It requires a linker with linker plugin support for basic functionality. Additionally, nm, ar and ranlib need to support linker plugins to allow a full-featured build environment (capable of building static libraries etc). GCC provides the gcc-ar, gcc-nm, gcc-ranlib wrappers to pass the right options to these tools. With non fat LTO makefiles need to be modified to use them.
Note that modern binutils provide plugin auto-load mechanism. Installing the linker plugin into $libdir/bfd-plugins has the same effect as usage of the command wrappers (gcc-ar, gcc-nm and gcc-ranlib).
The default is -fno-fat-lto-objects on targets with linker plugin
support.
-fcompare-elim
This pass only applies to certain targets that cannot explicitly represent the comparison operation before register allocation is complete.
Enabled at levels -O1, -O2, -O3, -Os.
-fcprop-registers
Enabled at levels -O1, -O2, -O3, -Os.
-fprofile-correction
This option is enabled by -fauto-profile.
-fprofile-partial-training
-fprofile-use
all portions of programs not executed during train
run are optimized agressively for size rather than speed. In some cases it is
not practical to train all possible hot paths in the program. (For
example, program may contain functions specific for a given hardware and
trianing may not cover all hardware configurations program is run on.) With
-fprofile-partial-training
profile feedback will be ignored for all
functions not executed during the train run leading them to be optimized as if
they were compiled without profile feedback. This leads to better performance
when train run is not representative but also leads to significantly bigger
code.
-fprofile-use
-fprofile-use=
path-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-reorder-functions
Before you can use this option, you must first generate profiling information. See Instrumentation Options, for information about the -fprofile-generate option.
By default, GCC emits an error message if the feedback profiles do not match the source code. This error can be turned into a warning by using -Wno-error=coverage-mismatch. Note this may result in poorly optimized code. Additionally, by default, GCC also emits a warning message if the feedback profiles do not exist (see -Wmissing-profile).
If path is specified, GCC looks at the path to find
the profile feedback data files. See -fprofile-dir.
-fauto-profile
-fauto-profile=
path-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-correction
path is the name of a file containing AutoFDO profile information. If omitted, it defaults to fbdata.afdo in the current directory.
Producing an AutoFDO profile data file requires running your program with the perf utility on a supported GNU/Linux target system. For more information, see https://perf.wiki.kernel.org/.
E.g.
perf record -e br_inst_retired:near_taken -b -o perf.data \ -- your_program
Then use the create_gcov tool to convert the raw profile data to a format that can be used by GCC. You must also supply the unstripped binary for your program to this tool. See https://github.com/google/autofdo.
E.g.
create_gcov --binary=your_program.unstripped --profile=perf.data \ --gcov=profile.afdo
The following options control compiler behavior regarding floating-point arithmetic. These options trade off between speed and correctness. All must be specifically enabled.
-ffloat-store
This option prevents undesirable excess precision on machines such as
the 68000 where the floating registers (of the 68881) keep more
precision than a double
is supposed to have. Similarly for the
x86 architecture. For most programs, the excess precision does only
good, but a few programs rely on the precise definition of IEEE floating
point. Use -ffloat-store for such programs, after modifying
them to store all pertinent intermediate computations into variables.
-fexcess-precision=
style-fexcess-precision=standard is not implemented for languages
other than C. On the x86, it has no effect if -mfpmath=sse
or -mfpmath=sse+387 is specified; in the former case, IEEE
semantics apply without excess precision, and in the latter, rounding
is unpredictable.
-ffast-math
This option causes the preprocessor macro __FAST_MATH__
to be defined.
This option is not turned on by any -O option besides
-Ofast since it can result in incorrect output for programs
that depend on an exact implementation of IEEE or ISO rules/specifications
for math functions. It may, however, yield faster code for programs
that do not require the guarantees of these specifications.
-fno-math-errno
errno
after calling math functions that are executed
with a single instruction, e.g., sqrt
. A program that relies on
IEEE exceptions for math error handling may want to use this flag
for speed while maintaining IEEE arithmetic compatibility.
This option is not turned on by any -O option since it can result in incorrect output for programs that depend on an exact implementation of IEEE or ISO rules/specifications for math functions. It may, however, yield faster code for programs that do not require the guarantees of these specifications.
The default is -fmath-errno.
On Darwin systems, the math library never sets errno
. There is
therefore no reason for the compiler to consider the possibility that
it might, and -fno-math-errno is the default.
-funsafe-math-optimizations
This option is not turned on by any -O option since it can result in incorrect output for programs that depend on an exact implementation of IEEE or ISO rules/specifications for math functions. It may, however, yield faster code for programs that do not require the guarantees of these specifications. Enables -fno-signed-zeros, -fno-trapping-math, -fassociative-math and -freciprocal-math.
The default is -fno-unsafe-math-optimizations.
-fassociative-math
(x + 2**52) - 2**52
. May also reorder floating-point comparisons
and thus may not be used when ordered comparisons are required.
This option requires that both -fno-signed-zeros and
-fno-trapping-math be in effect. Moreover, it doesn't make
much sense with -frounding-math. For Fortran the option
is automatically enabled when both -fno-signed-zeros and
-fno-trapping-math are in effect.
The default is -fno-associative-math.
-freciprocal-math
x / y
can be replaced with x * (1/y)
, which is useful if (1/y)
is subject to common subexpression elimination. Note that this loses
precision and increases the number of flops operating on the value.
The default is -fno-reciprocal-math.
-ffinite-math-only
This option is not turned on by any -O option since it can result in incorrect output for programs that depend on an exact implementation of IEEE or ISO rules/specifications for math functions. It may, however, yield faster code for programs that do not require the guarantees of these specifications.
The default is -fno-finite-math-only.
-fno-signed-zeros
The default is -fsigned-zeros.
-fno-trapping-math
This option should never be turned on by any -O option since it can result in incorrect output for programs that depend on an exact implementation of IEEE or ISO rules/specifications for math functions.
The default is -ftrapping-math.
-frounding-math
The default is -fno-rounding-math.
This option is experimental and does not currently guarantee to
disable all GCC optimizations that are affected by rounding mode.
Future versions of GCC may provide finer control of this setting
using C99's FENV_ACCESS
pragma. This command-line option
will be used to specify the default state for FENV_ACCESS
.
-fsignaling-nans
This option causes the preprocessor macro __SUPPORT_SNAN__
to
be defined.
The default is -fno-signaling-nans.
This option is experimental and does not currently guarantee to
disable all GCC optimizations that affect signaling NaN behavior.
-fno-fp-int-builtin-inexact
ceil
, floor
,
round
and trunc
, and their float
and long
double
variants, to generate code that raises the “inexact”
floating-point exception for noninteger arguments. ISO C99 and C11
allow these functions to raise the “inexact” exception, but ISO/IEC
TS 18661-1:2014, the C bindings to IEEE 754-2008, as integrated into
ISO C2X, does not allow these functions to do so.
The default is -ffp-int-builtin-inexact, allowing the exception to be raised, unless C2X or a later C standard is selected. This option does nothing unless -ftrapping-math is in effect.
Even if -fno-fp-int-builtin-inexact is used, if the functions
generate a call to a library function then the “inexact” exception
may be raised if the library implementation does not follow TS 18661.
-fsingle-precision-constant
-fcx-limited-range
NaN
+ I*NaN
, with an attempt to rescue the situation in that case. The
default is -fno-cx-limited-range, but is enabled by
-ffast-math.
This option controls the default setting of the ISO C99
CX_LIMITED_RANGE
pragma. Nevertheless, the option applies to
all languages.
-fcx-fortran-rules
NaN
+ I*NaN
, with an attempt to rescue the situation in that case.
The default is -fno-cx-fortran-rules.
The following options control optimizations that may improve performance, but are not enabled by any -O options. This section includes experimental options that may produce broken code.
-fbranch-probabilities
With -fbranch-probabilities, GCC puts a `REG_BR_PROB' note on each `JUMP_INSN' and `CALL_INSN'. These can be used to improve optimization. Currently, they are only used in one place: in reorg.cc, instead of guessing which path a branch is most likely to take, the `REG_BR_PROB' values are used to exactly determine which path is taken more often.
Enabled by -fprofile-use and -fauto-profile.
-fprofile-values
With -fbranch-probabilities, it reads back the data gathered from profiling values of expressions for usage in optimizations.
Enabled by -fprofile-generate, -fprofile-use, and
-fauto-profile.
-fprofile-reorder-functions
Enabled with -fprofile-use.
-fvpt
With -fbranch-probabilities, it reads back the data gathered and actually performs the optimizations based on them. Currently the optimizations include specialization of division operations using the knowledge about the value of the denominator.
Enabled with -fprofile-use and -fauto-profile.
-frename-registers
Enabled by default with -funroll-loops.
-fschedule-fusion
Enabled at levels -O2, -O3, -Os.
-ftracer
Enabled by -fprofile-use and -fauto-profile.
-funroll-loops
Enabled by -fprofile-use and -fauto-profile.
-funroll-all-loops
-fpeel-loops
Enabled by -O3, -fprofile-use, and -fauto-profile.
-fmove-loop-invariants
-fmove-loop-stores
-fsplit-loops
Enabled by -fprofile-use and -fauto-profile.
-funswitch-loops
Enabled by -fprofile-use and -fauto-profile.
-fversion-loops-for-strides
for (int i = 0; i < n; ++i) x[i * stride] = ...;
becomes:
if (stride == 1) for (int i = 0; i < n; ++i) x[i] = ...; else for (int i = 0; i < n; ++i) x[i * stride] = ...;
This is particularly useful for assumed-shape arrays in Fortran where
(for example) it allows better vectorization assuming contiguous accesses.
This flag is enabled by default at -O3.
It is also enabled by -fprofile-use and -fauto-profile.
-ffunction-sections
-fdata-sections
Use these options on systems where the linker can perform optimizations to improve locality of reference in the instruction space. Most systems using the ELF object format have linkers with such optimizations. On AIX, the linker rearranges sections (CSECTs) based on the call graph. The performance impact varies.
Together with a linker garbage collection (linker --gc-sections option) these options may lead to smaller statically-linked executables (after stripping).
On ELF/DWARF systems these options do not degenerate the quality of the debug information. There could be issues with other object files/debug info formats.
Only use these options when there are significant benefits from doing so. When
you specify these options, the assembler and linker create larger object and
executable files and are also slower. These options affect code generation.
They prevent optimizations by the compiler and assembler using relative
locations inside a translation unit since the locations are unknown until
link time. An example of such an optimization is relaxing calls to short call
instructions.
-fstdarg-opt
-fsection-anchors
For example, the implementation of the following function foo
:
static int a, b, c; int foo (void) { return a + b + c; }
usually calculates the addresses of all three variables, but if you compile it with -fsection-anchors, it accesses the variables from a common anchor point instead. The effect is similar to the following pseudocode (which isn't valid C):
int foo (void) { register int *xr = &x; return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; }
Not all targets support this option.
-fzero-call-used-regs=
choiceThe possible values of choice are the same as for the
zero_call_used_regs
attribute (see Function Attributes).
The default is `skip'.
You can control this behavior for a specific function by using the function
attribute zero_call_used_regs
(see Function Attributes).
--param
name=
valueThe names of specific parameters, and the meaning of the values, are tied to the internals of the compiler, and are subject to change without notice in future releases.
In order to get minimal, maximal and default value of a parameter, one can use --help=param -Q options.
In each case, the value is an integer. The following choices of name are recognized for all targets:
predictable-branch-outcome
max-rtl-if-conversion-insns
max-rtl-if-conversion-predictable-cost
max-crossjump-edges
min-crossjump-insns
max-grow-copy-bb-insns
max-goto-duplication-insns
max-delay-slot-insn-search
max-delay-slot-live-search
max-gcse-memory
kB
that can be allocated in
order to perform the global common subexpression elimination
optimization. If more memory than specified is required, the
optimization is not done.
max-gcse-insertion-ratio
max-pending-list-length
max-modulo-backtrack-attempts
max-inline-functions-called-once-loop-depth
max-inline-functions-called-once-insns
max-inline-insns-single
max-inline-insns-auto
max-inline-insns-small
max-inline-insns-size
uninlined-function-insns
uninlined-function-time
inline-heuristics-hint-percent
uninlined-thunk-insns
uninlined-thunk-time
inline-min-speedup
large-function-insns
large-function-growth
large-unit-insns
lazy-modules
inline-unit-growth
ipa-cp-unit-growth
ipa-cp-large-unit-insns
large-stack-frame
large-stack-frame-growth
max-inline-insns-recursive
max-inline-insns-recursive-auto
--param max-inline-insns-recursive applies to functions
declared inline.
For functions not declared inline, recursive inlining
happens only when -finline-functions (included in -O3) is
enabled; --param max-inline-insns-recursive-auto applies instead.
max-inline-recursive-depth
max-inline-recursive-depth-auto
--param max-inline-recursive-depth applies to functions
declared inline. For functions not declared inline, recursive inlining
happens only when -finline-functions (included in -O3) is
enabled; --param max-inline-recursive-depth-auto applies instead.
min-inline-recursive-probability
When profile feedback is available (see -fprofile-generate) the actual
recursion depth can be guessed from the probability that function recurses
via a given call expression. This parameter limits inlining only to call
expressions whose probability exceeds the given threshold (in percents).
early-inlining-insns
max-early-inliner-iterations
comdat-sharing-probability
modref-max-bases
modref-max-refs
modref-max-accesses
modref-max-tests
modref-max-depth
modref-max-escape-points
modref-max-adjustments
profile-func-internal-id
min-vect-loop-bound
gcse-cost-distance-ratio
gcse-unrestricted-cost
max-hoist-depth
max-tail-merge-comparisons
max-tail-merge-iterations
store-merging-allow-unaligned
max-stores-to-merge
max-store-chains-to-track
max-stores-to-track
max-unrolled-insns
max-average-unrolled-insns
max-unroll-times
max-peeled-insns
max-peel-times
max-peel-branches
max-completely-peeled-insns
max-completely-peel-times
max-completely-peel-loop-nest-depth
max-unswitch-insns
max-unswitch-level
lim-expensive
min-loop-cond-split-prob
iv-consider-all-candidates-bound
iv-max-considered-uses
iv-always-prune-cand-set-bound
avg-loop-niter
dse-max-object-size
dse-max-alias-queries-per-store
scev-max-expr-size
scev-max-expr-complexity
max-tree-if-conversion-phi-args
vect-max-version-for-alignment-checks
vect-max-version-for-alias-checks
vect-max-peeling-for-alignment
max-iterations-to-track
hot-bb-count-fraction
hot-bb-count-ws-permille
hot-bb-frequency-fraction
unlikely-bb-count-fraction
max-predicted-iterations
builtin-expect-probability
builtin-string-cmp-inline-length
align-threshold
align-loop-iterations
tracer-dynamic-coverage
tracer-dynamic-coverage-feedback
The tracer-dynamic-coverage-feedback parameter
is used only when profile
feedback is available. The real profiles (as opposed to statically estimated
ones) are much less balanced allowing the threshold to be larger value.
tracer-max-code-growth
tracer-min-branch-ratio
tracer-min-branch-probability
tracer-min-branch-probability-feedback
Similarly to tracer-dynamic-coverage two parameters are
provided. tracer-min-branch-probability-feedback is used for
compilation with profile feedback and tracer-min-branch-probability
compilation without. The value for compilation with profile feedback
needs to be more conservative (higher) in order to make tracer
effective.
stack-clash-protection-guard-size
stack-clash-protection-probe-interval
max-cse-path-length
max-cse-insns
ggc-min-expand
The default is 30% + 70% * (RAM/1GB) with an upper bound of 100% when
RAM >= 1GB. If getrlimit
is available, the notion of “RAM” is
the smallest of actual RAM and RLIMIT_DATA
or RLIMIT_AS
. If
GCC is not able to calculate RAM on a particular platform, the lower
bound of 30% is used. Setting this parameter and
ggc-min-heapsize to zero causes a full collection to occur at
every opportunity. This is extremely slow, but can be useful for
debugging.
ggc-min-heapsize
The default is the smaller of RAM/8, RLIMIT_RSS, or a limit that
tries to ensure that RLIMIT_DATA or RLIMIT_AS are not exceeded, but
with a lower bound of 4096 (four megabytes) and an upper bound of
131072 (128 megabytes). If GCC is not able to calculate RAM on a
particular platform, the lower bound is used. Setting this parameter
very large effectively disables garbage collection. Setting this
parameter and ggc-min-expand to zero causes a full collection
to occur at every opportunity.
max-reload-search-insns
max-cselib-memory-locations
max-sched-ready-insns
max-sched-region-blocks
max-pipeline-region-blocks
max-sched-region-insns
max-pipeline-region-insns
min-spec-prob
max-sched-extend-regions-iters
max-sched-insn-conflict-delay
sched-spec-prob-cutoff
sched-state-edge-prob-cutoff
sched-mem-true-dep-cost
selsched-max-lookahead
selsched-max-sched-times
selsched-insns-to-rename
sms-min-sc
max-last-value-rtl
max-combine-insns
integer-share-limit
ssp-buffer-size
min-size-for-stack-sharing
max-jump-thread-duplication-stmts
max-fields-for-field-sensitive
prefetch-latency
simultaneous-prefetches
l1-cache-line-size
l1-cache-size
l2-cache-size
prefetch-dynamic-strides
Set to 1 if the prefetch hints should be issued for non-constant
strides. Set to 0 if prefetch hints should be issued only for strides that
are known to be constant and below prefetch-minimum-stride.
prefetch-minimum-stride
This setting is useful for processors that have hardware prefetchers, in which case there may be conflicts between the hardware prefetchers and the software prefetchers. If the hardware prefetchers have a maximum stride they can handle, it should be used here to improve the use of software prefetchers.
A value of -1 means we don't have a threshold and therefore prefetch hints can be issued for any constant stride.
This setting is only useful for strides that are known and constant.
destructive-interference-size
constructive-interference-size
std::hardware_destructive_interference_size
and
std::hardware_constructive_interference_size
. The destructive
interference size is the minimum recommended offset between two
independent concurrently-accessed objects; the constructive
interference size is the maximum recommended size of contiguous memory
accessed together. Typically both will be the size of an L1 cache
line for the target, in bytes. For a generic target covering a range of L1
cache line sizes, typically the constructive interference size will be
the small end of the range and the destructive size will be the large
end.
The destructive interference size is intended to be used for layout, and thus has ABI impact. The default value is not expected to be stable, and on some targets varies with -mtune, so use of this variable in a context where ABI stability is important, such as the public interface of a library, is strongly discouraged; if it is used in that context, users can stabilize the value using this option.
The constructive interference size is less sensitive, as it is typically only used in a `static_assert' to make sure that a type fits within a cache line.
See also -Winterference-size.
loop-interchange-max-num-stmts
loop-interchange-stride-ratio
min-insn-to-prefetch-ratio
prefetch-min-insn-to-mem-ratio
use-canonical-types
switch-conversion-max-branch-ratio
max-partial-antic-length
rpo-vn-max-loop-depth
sccvn-max-alias-queries-per-access
ira-max-loops-num
ira-max-conflict-table-size
ira-loop-reserved-regs
ira-consider-dup-in-all-alts
lra-inheritance-ebb-probability-cutoff
loop-invariant-max-bbs-in-loop
loop-max-datarefs-for-datadeps
max-vartrack-size
max-vartrack-expr-depth
max-debug-marker-count
min-nondebug-insn-uid
ipa-sra-ptr-growth-factor
ipa-sra-max-replacements
sra-max-scalarization-size-Ospeed
sra-max-scalarization-size-Osize
sra-max-propagations
tm-max-aggregate-size
graphite-max-nb-scop-params
loop-block-tile-size
ipa-jump-function-lookups
ipa-cp-value-list-size
ipa-cp-eval-threshold
ipa-cp-max-recursive-depth
ipa-cp-min-recursive-probability
ipa-cp-profile-count-base
ipa-cp-recursive-freq-factor
ipa-cp-recursion-penalty
ipa-cp-single-call-penalty
ipa-max-agg-items
ipa-cp-loop-hint-bonus
ipa-max-loop-predicates
ipa-max-aa-steps
ipa-max-switch-predicate-bounds
ipa-max-param-expr-ops
lto-partitions
lto-min-partition
lto-max-partition
lto-max-streaming-parallelism
cxx-max-namespaces-for-diagnostic-help
sink-frequency-threshold
max-stores-to-sink
case-values-threshold
jump-table-max-growth-ratio-for-size
jump-table-max-growth-ratio-for-speed
tree-reassoc-width
sched-pressure-algorithm
The default choice depends on the target.
max-slsr-cand-scan
asan-globals
asan-stack
asan-instrument-reads
asan-instrument-writes
asan-memintrin
asan-use-after-return
Note: By default the check is disabled at run time. To enable it,
add detect_stack_use_after_return=1
to the environment variable
ASAN_OPTIONS.
asan-instrumentation-with-call-threshold
hwasan-instrument-stack
hwasan-random-frame-tag
hwasan-instrument-allocas
hwasan-instrument-reads
hwasan-instrument-writes
hwasan-instrument-mem-intrinsics
use-after-scope-direct-emission-threshold
tsan-distinguish-volatile
tsan-instrument-func-entry-exit
max-fsm-thread-path-insns
max-fsm-thread-length
threader-debug
parloops-chunk-size
parloops-schedule
parloops-min-per-thread
max-ssa-name-query-depth
max-speculative-devirt-maydefs
max-vrp-switch-assertions
evrp-sparse-threshold
evrp-mode
vrp1-mode
vrp2-mode
ranger-debug
evrp-switch-limit
unroll-jam-min-percent
unroll-jam-max-unroll
max-rtl-if-conversion-unpredictable-cost
max-variable-expansions-in-unroller
partial-inlining-entry-probability
max-tracked-strlens
gcse-after-reload-partial-fraction
gcse-after-reload-critical-fraction
max-loop-header-insns
vect-epilogues-nomask
vect-partial-vector-usage
vect-inner-loop-cost-factor
vect-induction-float
avoid-fma-max-bits
sms-loop-average-count-threshold
sms-dfa-history
graphite-allow-codegen-errors
sms-max-ii-factor
lra-max-considered-reload-pseudos
max-pow-sqrt-depth
max-dse-active-local-stores
asan-instrument-allocas
max-iterations-computation-cost
max-isl-operations
graphite-max-arrays-per-scop
max-vartrack-reverse-op-size
fsm-scale-path-stmts
uninit-control-dep-attempts
fsm-scale-path-blocks
sched-autopref-queue-depth
loop-versioning-max-inner-insns
loop-versioning-max-outer-insns
ssa-name-def-chain-limit
store-merging-max-size
hash-table-verification-limit
max-find-base-term-values
analyzer-max-enodes-per-program-point
analyzer-max-constraints
analyzer-min-snodes-for-call-summary
analyzer-max-enodes-for-full-dump
analyzer-max-recursion-depth
analyzer-max-svalue-depth
analyzer-max-infeasible-edges
gimple-fe-computed-hot-bb-threshold
analyzer-bb-explosion-factor
ranger-logical-depth
relation-block-limit
min-pagesize
openacc-kernels
openacc-privatization
The following choices of name are available on AArch64 targets:
aarch64-sve-compare-costs
Using unpacked vectors includes storing smaller elements in larger
containers and accessing elements with extending loads and truncating
stores.
aarch64-float-recp-precision
aarch64-double-recp-precision
aarch64-autovec-preference
aarch64-loop-vect-issue-rate-niters
aarch64-vect-unroll-limit
The following choices of name are available on i386 and x86_64 targets:
x86-stlf-window-ninsns