diff options
Diffstat (limited to 'share/doc/gcc-linaro-aarch64-linux-gnu/html/gcc/Optimize-Options.html')
-rw-r--r-- | share/doc/gcc-linaro-aarch64-linux-gnu/html/gcc/Optimize-Options.html | 395 |
1 files changed, 199 insertions, 196 deletions
diff --git a/share/doc/gcc-linaro-aarch64-linux-gnu/html/gcc/Optimize-Options.html b/share/doc/gcc-linaro-aarch64-linux-gnu/html/gcc/Optimize-Options.html index fe813f7..51d63d8 100644 --- a/share/doc/gcc-linaro-aarch64-linux-gnu/html/gcc/Optimize-Options.html +++ b/share/doc/gcc-linaro-aarch64-linux-gnu/html/gcc/Optimize-Options.html @@ -56,7 +56,7 @@ Up: <a rel="up" accesskey="u" href="Invoking-GCC.html#Invoking-GCC">Invokin <h3 class="section">3.10 Options That Control Optimization</h3> -<p><a name="index-optimize-options-701"></a><a name="index-options_002c-optimization-702"></a> +<p><a name="index-optimize-options-702"></a><a name="index-options_002c-optimization-703"></a> These options control various sorts of optimizations. <p>Without any optimization option, the compiler's goal is to reduce the @@ -90,7 +90,7 @@ to find out the exact set of optimizations that are enabled at each level. See <a href="Overall-Options.html#Overall-Options">Overall Options</a>, for examples. <dl> -<dt><code>-O</code><dt><code>-O1</code><dd><a name="index-O-703"></a><a name="index-O1-704"></a>Optimize. Optimizing compilation takes somewhat more time, and a lot +<dt><code>-O</code><dt><code>-O1</code><dd><a name="index-O-704"></a><a name="index-O1-705"></a>Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function. <p>With <samp><span class="option">-O</span></samp>, the compiler tries to reduce code size and execution @@ -132,7 +132,7 @@ compilation time. <p><samp><span class="option">-O</span></samp> also turns on <samp><span class="option">-fomit-frame-pointer</span></samp> on machines where doing so does not interfere with debugging. - <br><dt><code>-O2</code><dd><a name="index-O2-705"></a>Optimize even more. GCC performs nearly all supported optimizations + <br><dt><code>-O2</code><dd><a name="index-O2-706"></a>Optimize even more. GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff. As compared to <samp><span class="option">-O</span></samp>, this option increases both compilation time and the performance of the generated code. @@ -168,16 +168,16 @@ also turns on the following optimization flags: <p>Please note the warning under <samp><span class="option">-fgcse</span></samp> about invoking <samp><span class="option">-O2</span></samp> on programs that use computed gotos. - <br><dt><code>-O3</code><dd><a name="index-O3-706"></a>Optimize yet more. <samp><span class="option">-O3</span></samp> turns on all optimizations specified + <br><dt><code>-O3</code><dd><a name="index-O3-707"></a>Optimize yet more. <samp><span class="option">-O3</span></samp> turns on all optimizations specified by <samp><span class="option">-O2</span></samp> and also turns on the <samp><span class="option">-finline-functions</span></samp>, <samp><span class="option">-funswitch-loops</span></samp>, <samp><span class="option">-fpredictive-commoning</span></samp>, -<samp><span class="option">-fgcse-after-reload</span></samp>, <samp><span class="option">-ftree-vectorize</span></samp> and -<samp><span class="option">-fipa-cp-clone</span></samp> options. +<samp><span class="option">-fgcse-after-reload</span></samp>, <samp><span class="option">-ftree-vectorize</span></samp>, +<samp><span class="option">-ftree-partial-pre</span></samp> and <samp><span class="option">-fipa-cp-clone</span></samp> options. - <br><dt><code>-O0</code><dd><a name="index-O0-707"></a>Reduce compilation time and make debugging produce the expected + <br><dt><code>-O0</code><dd><a name="index-O0-708"></a>Reduce compilation time and make debugging produce the expected results. This is the default. - <br><dt><code>-Os</code><dd><a name="index-Os-708"></a>Optimize for size. <samp><span class="option">-Os</span></samp> enables all <samp><span class="option">-O2</span></samp> optimizations that + <br><dt><code>-Os</code><dd><a name="index-Os-709"></a>Optimize for size. <samp><span class="option">-Os</span></samp> enables all <samp><span class="option">-O2</span></samp> optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size. @@ -186,7 +186,7 @@ optimizations designed to reduce code size. -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version </pre> - <br><dt><code>-Ofast</code><dd><a name="index-Ofast-709"></a>Disregard strict standards compliance. <samp><span class="option">-Ofast</span></samp> enables all + <br><dt><code>-Ofast</code><dd><a name="index-Ofast-710"></a>Disregard strict standards compliance. <samp><span class="option">-Ofast</span></samp> enables all <samp><span class="option">-O3</span></samp> optimizations. It also enables optimizations that are not valid for all standard compliant programs. It turns on <samp><span class="option">-ffast-math</span></samp> and the Fortran-specific @@ -209,20 +209,20 @@ can use the following flags in the rare cases when “fine-tuning” of optimizations to be performed is desired. <dl> -<dt><code>-fno-default-inline</code><dd><a name="index-fno_002ddefault_002dinline-710"></a>Do not make member functions inline by default merely because they are +<dt><code>-fno-default-inline</code><dd><a name="index-fno_002ddefault_002dinline-711"></a>Do not make member functions inline by default merely because they are defined inside the class scope (C++ only). Otherwise, when you specify <samp><span class="option">-O</span></samp><!-- /@w -->, member functions defined inside class scope are compiled inline by default; i.e., you don't need to add ‘<samp><span class="samp">inline</span></samp>’ in front of the member function name. - <br><dt><code>-fno-defer-pop</code><dd><a name="index-fno_002ddefer_002dpop-711"></a>Always pop the arguments to each function call as soon as that function + <br><dt><code>-fno-defer-pop</code><dd><a name="index-fno_002ddefer_002dpop-712"></a>Always pop the arguments to each function call as soon as that function returns. For machines that must pop arguments after a function call, the compiler normally lets arguments accumulate on the stack for several function calls and pops them all at once. <p>Disabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fforward-propagate</code><dd><a name="index-fforward_002dpropagate-712"></a>Perform a forward propagation pass on RTL. The pass tries to combine two + <br><dt><code>-fforward-propagate</code><dd><a name="index-fforward_002dpropagate-713"></a>Perform a forward propagation pass on RTL. The pass tries to combine two instructions and checks if the result can be simplified. If loop unrolling is active, two passes are performed and the second is scheduled after loop unrolling. @@ -230,7 +230,7 @@ loop unrolling. <p>This option is enabled by default at optimization levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-ffp-contract=</code><var>style</var><dd><a name="index-ffp_002dcontract-713"></a><samp><span class="option">-ffp-contract=off</span></samp> disables floating-point expression contraction. + <br><dt><code>-ffp-contract=</code><var>style</var><dd><a name="index-ffp_002dcontract-714"></a><samp><span class="option">-ffp-contract=off</span></samp> disables floating-point expression contraction. <samp><span class="option">-ffp-contract=fast</span></samp> enables floating-point expression contraction such as forming of fused multiply-add operations if the target has native support for them. @@ -240,7 +240,7 @@ and treated equal to <samp><span class="option">-ffp-contract=off</span></samp>. <p>The default is <samp><span class="option">-ffp-contract=fast</span></samp>. - <br><dt><code>-fomit-frame-pointer</code><dd><a name="index-fomit_002dframe_002dpointer-714"></a>Don't keep the frame pointer in a register for functions that + <br><dt><code>-fomit-frame-pointer</code><dd><a name="index-fomit_002dframe_002dpointer-715"></a>Don't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restore frame pointers; it also makes an extra register available in many functions. <strong>It also makes debugging impossible on @@ -260,18 +260,18 @@ size) for 32-bit Linux x86 and 32-bit Darwin x86 targets has been changed to <p>Enabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-foptimize-sibling-calls</code><dd><a name="index-foptimize_002dsibling_002dcalls-715"></a>Optimize sibling and tail recursive calls. + <br><dt><code>-foptimize-sibling-calls</code><dd><a name="index-foptimize_002dsibling_002dcalls-716"></a>Optimize sibling and tail recursive calls. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fno-inline</code><dd><a name="index-fno_002dinline-716"></a>Do not expand any functions inline apart from those marked with + <br><dt><code>-fno-inline</code><dd><a name="index-fno_002dinline-717"></a>Do not expand any functions inline apart from those marked with the <code>always_inline</code> attribute. This is the default when not optimizing. <p>Single functions can be exempted from inlining by marking them with the <code>noinline</code> attribute. - <br><dt><code>-finline-small-functions</code><dd><a name="index-finline_002dsmall_002dfunctions-717"></a>Integrate functions into their callers when their body is smaller than expected + <br><dt><code>-finline-small-functions</code><dd><a name="index-finline_002dsmall_002dfunctions-718"></a>Integrate functions into their callers when their body is smaller than expected function call code (so overall size of program gets smaller). The compiler heuristically decides which functions are simple enough to be worth integrating in this way. This inlining applies to all functions, even those not declared @@ -279,14 +279,14 @@ inline. <p>Enabled at level <samp><span class="option">-O2</span></samp>. - <br><dt><code>-findirect-inlining</code><dd><a name="index-findirect_002dinlining-718"></a>Inline also indirect calls that are discovered to be known at compile + <br><dt><code>-findirect-inlining</code><dd><a name="index-findirect_002dinlining-719"></a>Inline also indirect calls that are discovered to be known at compile time thanks to previous inlining. This option has any effect only when inlining itself is turned on by the <samp><span class="option">-finline-functions</span></samp> or <samp><span class="option">-finline-small-functions</span></samp> options. <p>Enabled at level <samp><span class="option">-O2</span></samp>. - <br><dt><code>-finline-functions</code><dd><a name="index-finline_002dfunctions-719"></a>Consider all functions for inlining, even if they are not declared inline. + <br><dt><code>-finline-functions</code><dd><a name="index-finline_002dfunctions-720"></a>Consider all functions for inlining, even if they are not declared inline. The compiler heuristically decides which functions are worth integrating in this way. @@ -296,14 +296,14 @@ assembler code in its own right. <p>Enabled at level <samp><span class="option">-O3</span></samp>. - <br><dt><code>-finline-functions-called-once</code><dd><a name="index-finline_002dfunctions_002dcalled_002donce-720"></a>Consider all <code>static</code> functions called once for inlining into their + <br><dt><code>-finline-functions-called-once</code><dd><a name="index-finline_002dfunctions_002dcalled_002donce-721"></a>Consider all <code>static</code> functions called once for inlining into their caller even if they are not marked <code>inline</code>. If a call to a given function is integrated, then the function is not output as assembler code in its own right. <p>Enabled at levels <samp><span class="option">-O1</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp> and <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fearly-inlining</code><dd><a name="index-fearly_002dinlining-721"></a>Inline functions marked by <code>always_inline</code> and functions whose body seems + <br><dt><code>-fearly-inlining</code><dd><a name="index-fearly_002dinlining-722"></a>Inline functions marked by <code>always_inline</code> and functions whose body seems smaller than the function call overhead early before doing <samp><span class="option">-fprofile-generate</span></samp> instrumentation and real inlining pass. Doing so makes profiling significantly cheaper and usually inlining faster on programs @@ -311,13 +311,13 @@ having large chains of nested wrapper functions. <p>Enabled by default. - <br><dt><code>-fipa-sra</code><dd><a name="index-fipa_002dsra-722"></a>Perform interprocedural scalar replacement of aggregates, removal of + <br><dt><code>-fipa-sra</code><dd><a name="index-fipa_002dsra-723"></a>Perform interprocedural scalar replacement of aggregates, removal of unused parameters and replacement of parameters passed by reference by parameters passed by value. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp> and <samp><span class="option">-Os</span></samp>. - <br><dt><code>-finline-limit=</code><var>n</var><dd><a name="index-finline_002dlimit-723"></a>By default, GCC limits the size of functions that can be inlined. This flag + <br><dt><code>-finline-limit=</code><var>n</var><dd><a name="index-finline_002dlimit-724"></a>By default, GCC limits the size of functions that can be inlined. This flag allows coarse control of this limit. <var>n</var> is the size of functions that can be inlined in number of pseudo instructions. @@ -342,24 +342,24 @@ 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. - <br><dt><code>-fno-keep-inline-dllexport</code><dd><a name="index-g_t_002dfno_002dkeep_002dinline_002ddllexport-724"></a>This is a more fine-grained version of <samp><span class="option">-fkeep-inline-functions</span></samp>, + <br><dt><code>-fno-keep-inline-dllexport</code><dd><a name="index-g_t_002dfno_002dkeep_002dinline_002ddllexport-725"></a>This is a more fine-grained version of <samp><span class="option">-fkeep-inline-functions</span></samp>, which applies only to functions that are declared using the <code>dllexport</code> attribute or declspec (See <a href="Function-Attributes.html#Function-Attributes">Declaring Attributes of Functions</a>.) - <br><dt><code>-fkeep-inline-functions</code><dd><a name="index-fkeep_002dinline_002dfunctions-725"></a>In C, emit <code>static</code> functions that are declared <code>inline</code> + <br><dt><code>-fkeep-inline-functions</code><dd><a name="index-fkeep_002dinline_002dfunctions-726"></a>In C, emit <code>static</code> functions that are declared <code>inline</code> into the object file, even if the function has been inlined into all of its callers. This switch does not affect functions using the <code>extern inline</code> extension in GNU C90. In C++, emit any and all inline functions into the object file. - <br><dt><code>-fkeep-static-consts</code><dd><a name="index-fkeep_002dstatic_002dconsts-726"></a>Emit variables declared <code>static const</code> when optimization isn't turned + <br><dt><code>-fkeep-static-consts</code><dd><a name="index-fkeep_002dstatic_002dconsts-727"></a>Emit variables declared <code>static const</code> when optimization isn't turned on, even if the variables aren't referenced. <p>GCC enables this option by default. If you want to force the compiler to check if the variable was referenced, regardless of whether or not optimization is turned on, use the <samp><span class="option">-fno-keep-static-consts</span></samp> option. - <br><dt><code>-fmerge-constants</code><dd><a name="index-fmerge_002dconstants-727"></a>Attempt to merge identical constants (string constants and floating-point + <br><dt><code>-fmerge-constants</code><dd><a name="index-fmerge_002dconstants-728"></a>Attempt to merge identical constants (string constants and floating-point constants) across compilation units. <p>This option is the default for optimized compilation if the assembler and @@ -368,7 +368,7 @@ behavior. <p>Enabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fmerge-all-constants</code><dd><a name="index-fmerge_002dall_002dconstants-728"></a>Attempt to merge identical constants and identical variables. + <br><dt><code>-fmerge-all-constants</code><dd><a name="index-fmerge_002dall_002dconstants-729"></a>Attempt to merge identical constants and identical variables. <p>This option implies <samp><span class="option">-fmerge-constants</span></samp>. In addition to <samp><span class="option">-fmerge-constants</span></samp> this considers e.g. even constant initialized @@ -378,17 +378,17 @@ instances of the same variable in recursive calls, to have distinct locations, so using this option will result in non-conforming behavior. - <br><dt><code>-fmodulo-sched</code><dd><a name="index-fmodulo_002dsched-729"></a>Perform swing modulo scheduling immediately before the first scheduling + <br><dt><code>-fmodulo-sched</code><dd><a name="index-fmodulo_002dsched-730"></a>Perform swing modulo scheduling immediately before the first scheduling pass. This pass looks at innermost loops and reorders their instructions by overlapping different iterations. - <br><dt><code>-fmodulo-sched-allow-regmoves</code><dd><a name="index-fmodulo_002dsched_002dallow_002dregmoves-730"></a>Perform more aggressive SMS based modulo scheduling with register moves + <br><dt><code>-fmodulo-sched-allow-regmoves</code><dd><a name="index-fmodulo_002dsched_002dallow_002dregmoves-731"></a>Perform more aggressive SMS based modulo scheduling with register moves allowed. By setting this flag certain anti-dependences edges will be deleted which will trigger the generation of reg-moves based on the life-range analysis. This option is effective only with <samp><span class="option">-fmodulo-sched</span></samp> enabled. - <br><dt><code>-fno-branch-count-reg</code><dd><a name="index-fno_002dbranch_002dcount_002dreg-731"></a>Do not use “decrement and branch” instructions on a count register, + <br><dt><code>-fno-branch-count-reg</code><dd><a name="index-fno_002dbranch_002dcount_002dreg-732"></a>Do not use “decrement and branch” instructions on a count register, but instead generate a sequence of instructions that decrement a register, compare it against zero, then branch based upon the result. This option is only meaningful on architectures that support such @@ -396,7 +396,7 @@ instructions, which include x86, PowerPC, IA-64 and S/390. <p>The default is <samp><span class="option">-fbranch-count-reg</span></samp>. - <br><dt><code>-fno-function-cse</code><dd><a name="index-fno_002dfunction_002dcse-732"></a>Do not put function addresses in registers; make each instruction that + <br><dt><code>-fno-function-cse</code><dd><a name="index-fno_002dfunction_002dcse-733"></a>Do not put function addresses in registers; make each instruction that calls a constant function contain the function's address explicitly. <p>This option results in less efficient code, but some strange hacks @@ -405,7 +405,7 @@ performed when this option is not used. <p>The default is <samp><span class="option">-ffunction-cse</span></samp> - <br><dt><code>-fno-zero-initialized-in-bss</code><dd><a name="index-fno_002dzero_002dinitialized_002din_002dbss-733"></a>If the target supports a BSS section, GCC by default puts variables that + <br><dt><code>-fno-zero-initialized-in-bss</code><dd><a name="index-fno_002dzero_002dinitialized_002din_002dbss-734"></a>If the target supports a BSS section, GCC by default puts variables that are initialized to zero into BSS. This can save space in the resulting code. @@ -416,7 +416,7 @@ assumptions based on that. <p>The default is <samp><span class="option">-fzero-initialized-in-bss</span></samp>. - <br><dt><code>-fmudflap -fmudflapth -fmudflapir</code><dd><a name="index-fmudflap-734"></a><a name="index-fmudflapth-735"></a><a name="index-fmudflapir-736"></a><a name="index-bounds-checking-737"></a><a name="index-mudflap-738"></a>For front-ends that support it (C and C++), instrument all risky + <br><dt><code>-fmudflap -fmudflapth -fmudflapir</code><dd><a name="index-fmudflap-735"></a><a name="index-fmudflapth-736"></a><a name="index-fmudflapir-737"></a><a name="index-bounds-checking-738"></a><a name="index-mudflap-739"></a>For front-ends that support it (C and C++), instrument all risky pointer/array dereferencing operations, some standard library string/heap functions, and some other associated constructs with range/validity tests. Modules so instrumented should be immune to @@ -436,7 +436,7 @@ instrumentation (and therefore faster execution) and still provides some protection against outright memory corrupting writes, but allows erroneously read data to propagate within a program. - <br><dt><code>-fthread-jumps</code><dd><a name="index-fthread_002djumps-739"></a>Perform optimizations where we check to see if a jump branches to a + <br><dt><code>-fthread-jumps</code><dd><a name="index-fthread_002djumps-740"></a>Perform optimizations where we check to see if a jump branches to a location where another comparison subsumed by the first is found. If so, the first branch is redirected to either the destination of the second branch or a point immediately following it, depending on whether @@ -444,7 +444,7 @@ the condition is known to be true or false. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fsplit-wide-types</code><dd><a name="index-fsplit_002dwide_002dtypes-740"></a>When using a type that occupies multiple registers, such as <code>long + <br><dt><code>-fsplit-wide-types</code><dd><a name="index-fsplit_002dwide_002dtypes-741"></a>When using a type that occupies multiple registers, such as <code>long long</code> 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. @@ -452,7 +452,7 @@ but may make debugging more difficult. <p>Enabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fcse-follow-jumps</code><dd><a name="index-fcse_002dfollow_002djumps-741"></a>In common subexpression elimination (CSE), scan through jump instructions + <br><dt><code>-fcse-follow-jumps</code><dd><a name="index-fcse_002dfollow_002djumps-742"></a>In common subexpression elimination (CSE), scan through jump instructions when the target of the jump is not reached by any other path. For example, when CSE encounters an <code>if</code> statement with an <code>else</code> clause, CSE will follow the jump when the condition @@ -460,7 +460,7 @@ tested is false. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fcse-skip-blocks</code><dd><a name="index-fcse_002dskip_002dblocks-742"></a>This is similar to <samp><span class="option">-fcse-follow-jumps</span></samp>, but causes CSE to + <br><dt><code>-fcse-skip-blocks</code><dd><a name="index-fcse_002dskip_002dblocks-743"></a>This is similar to <samp><span class="option">-fcse-follow-jumps</span></samp>, but causes CSE to follow jumps that conditionally skip over blocks. When CSE encounters a simple <code>if</code> statement with no else clause, <samp><span class="option">-fcse-skip-blocks</span></samp> causes CSE to follow the jump around the @@ -468,12 +468,12 @@ body of the <code>if</code>. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-frerun-cse-after-loop</code><dd><a name="index-frerun_002dcse_002dafter_002dloop-743"></a>Re-run common subexpression elimination after loop optimizations has been + <br><dt><code>-frerun-cse-after-loop</code><dd><a name="index-frerun_002dcse_002dafter_002dloop-744"></a>Re-run common subexpression elimination after loop optimizations has been performed. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fgcse</code><dd><a name="index-fgcse-744"></a>Perform a global common subexpression elimination pass. + <br><dt><code>-fgcse</code><dd><a name="index-fgcse-745"></a>Perform a global common subexpression elimination pass. This pass also performs global constant and copy propagation. <p><em>Note:</em> When compiling a program using computed gotos, a GCC @@ -483,14 +483,14 @@ the global common subexpression elimination pass by adding <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fgcse-lm</code><dd><a name="index-fgcse_002dlm-745"></a>When <samp><span class="option">-fgcse-lm</span></samp> is enabled, global common subexpression elimination will + <br><dt><code>-fgcse-lm</code><dd><a name="index-fgcse_002dlm-746"></a>When <samp><span class="option">-fgcse-lm</span></samp> is enabled, global common subexpression elimination will attempt to move loads that are only killed by stores into themselves. This allows a loop containing a load/store sequence to be changed to a load outside the loop, and a copy/store within the loop. <p>Enabled by default when gcse is enabled. - <br><dt><code>-fgcse-sm</code><dd><a name="index-fgcse_002dsm-746"></a>When <samp><span class="option">-fgcse-sm</span></samp> is enabled, a store motion pass is run after + <br><dt><code>-fgcse-sm</code><dd><a name="index-fgcse_002dsm-747"></a>When <samp><span class="option">-fgcse-sm</span></samp> is enabled, a store motion pass is run after global common subexpression elimination. This pass will attempt to move stores out of loops. When used in conjunction with <samp><span class="option">-fgcse-lm</span></samp>, loops containing a load/store sequence can be changed to a load before @@ -498,52 +498,52 @@ the loop and a store after the loop. <p>Not enabled at any optimization level. - <br><dt><code>-fgcse-las</code><dd><a name="index-fgcse_002dlas-747"></a>When <samp><span class="option">-fgcse-las</span></samp> is enabled, the global common subexpression + <br><dt><code>-fgcse-las</code><dd><a name="index-fgcse_002dlas-748"></a>When <samp><span class="option">-fgcse-las</span></samp> is enabled, the global common subexpression elimination pass eliminates redundant loads that come after stores to the same memory location (both partial and full redundancies). <p>Not enabled at any optimization level. - <br><dt><code>-fgcse-after-reload</code><dd><a name="index-fgcse_002dafter_002dreload-748"></a>When <samp><span class="option">-fgcse-after-reload</span></samp> is enabled, a redundant load elimination + <br><dt><code>-fgcse-after-reload</code><dd><a name="index-fgcse_002dafter_002dreload-749"></a>When <samp><span class="option">-fgcse-after-reload</span></samp> is enabled, a redundant load elimination pass is performed after reload. The purpose of this pass is to cleanup redundant spilling. - <br><dt><code>-funsafe-loop-optimizations</code><dd><a name="index-funsafe_002dloop_002doptimizations-749"></a>If given, the loop optimizer will assume that loop indices do not + <br><dt><code>-funsafe-loop-optimizations</code><dd><a name="index-funsafe_002dloop_002doptimizations-750"></a>If given, the loop optimizer will assume that loop indices do not overflow, and that the loops with nontrivial exit condition are not infinite. This enables a wider range of loop optimizations even if the loop optimizer itself cannot prove that these assumptions are valid. Using <samp><span class="option">-Wunsafe-loop-optimizations</span></samp>, the compiler will warn you if it finds this kind of loop. - <br><dt><code>-fcrossjumping</code><dd><a name="index-fcrossjumping-750"></a>Perform cross-jumping transformation. This transformation unifies equivalent code and save code size. The + <br><dt><code>-fcrossjumping</code><dd><a name="index-fcrossjumping-751"></a>Perform cross-jumping transformation. This transformation unifies equivalent code and save code size. The resulting code may or may not perform better than without cross-jumping. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fauto-inc-dec</code><dd><a name="index-fauto_002dinc_002ddec-751"></a>Combine increments or decrements of addresses with memory accesses. + <br><dt><code>-fauto-inc-dec</code><dd><a name="index-fauto_002dinc_002ddec-752"></a>Combine increments or decrements of addresses with memory accesses. This pass is always skipped on architectures that do not have instructions to support this. Enabled by default at <samp><span class="option">-O</span></samp> and higher on architectures that support this. - <br><dt><code>-fdce</code><dd><a name="index-fdce-752"></a>Perform dead code elimination (DCE) on RTL. + <br><dt><code>-fdce</code><dd><a name="index-fdce-753"></a>Perform dead code elimination (DCE) on RTL. Enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-fdse</code><dd><a name="index-fdse-753"></a>Perform dead store elimination (DSE) on RTL. + <br><dt><code>-fdse</code><dd><a name="index-fdse-754"></a>Perform dead store elimination (DSE) on RTL. Enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-fif-conversion</code><dd><a name="index-fif_002dconversion-754"></a>Attempt to transform conditional jumps into branch-less equivalents. This + <br><dt><code>-fif-conversion</code><dd><a name="index-fif_002dconversion-755"></a>Attempt to transform conditional jumps into branch-less equivalents. This include use of conditional moves, min, max, set flags and abs instructions, and some tricks doable by standard arithmetics. The use of conditional execution on chips where it is available is controlled by <code>if-conversion2</code>. <p>Enabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fif-conversion2</code><dd><a name="index-fif_002dconversion2-755"></a>Use conditional execution (where available) to transform conditional jumps into + <br><dt><code>-fif-conversion2</code><dd><a name="index-fif_002dconversion2-756"></a>Use conditional execution (where available) to transform conditional jumps into branch-less equivalents. <p>Enabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fdelete-null-pointer-checks</code><dd><a name="index-fdelete_002dnull_002dpointer_002dchecks-756"></a>Assume that programs cannot safely dereference null pointers, and that + <br><dt><code>-fdelete-null-pointer-checks</code><dd><a name="index-fdelete_002dnull_002dpointer_002dchecks-757"></a>Assume that programs cannot safely dereference null pointers, and that no code or data element resides there. This enables simple constant folding optimizations at all optimization levels. In addition, other optimization passes in GCC use this flag to control global dataflow @@ -560,23 +560,23 @@ Otherwise it is enabled at all levels: <samp><span class="option">-O0</span></sa <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. Passes that use the information are enabled independently at different optimization levels. - <br><dt><code>-fdevirtualize</code><dd><a name="index-fdevirtualize-757"></a>Attempt to convert calls to virtual functions to direct calls. This + <br><dt><code>-fdevirtualize</code><dd><a name="index-fdevirtualize-758"></a>Attempt to convert calls to virtual functions to direct calls. This is done both within a procedure and interprocedurally as part of indirect inlining (<code>-findirect-inlining</code>) and interprocedural constant propagation (<samp><span class="option">-fipa-cp</span></samp>). Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fexpensive-optimizations</code><dd><a name="index-fexpensive_002doptimizations-758"></a>Perform a number of minor optimizations that are relatively expensive. + <br><dt><code>-fexpensive-optimizations</code><dd><a name="index-fexpensive_002doptimizations-759"></a>Perform a number of minor optimizations that are relatively expensive. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-free</code><dd><a name="index-free-759"></a>Attempt to remove redundant extension instructions. This is especially + <br><dt><code>-free</code><dd><a name="index-free-760"></a>Attempt to remove redundant extension instructions. This is especially helpful for the x86-64 architecture which implicitly zero-extends in 64-bit registers after writing to their lower 32-bit half. <p>Enabled for x86 at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>. - <br><dt><code>-foptimize-register-move</code><dt><code>-fregmove</code><dd><a name="index-foptimize_002dregister_002dmove-760"></a><a name="index-fregmove-761"></a>Attempt to reassign register numbers in move instructions and as + <br><dt><code>-foptimize-register-move</code><dt><code>-fregmove</code><dd><a name="index-foptimize_002dregister_002dmove-761"></a><a name="index-fregmove-762"></a>Attempt to reassign register numbers in move instructions and as operands of other simple instructions in order to maximize the amount of register tying. This is especially helpful on machines with two-operand instructions. @@ -613,33 +613,33 @@ This typically results in the smallest code size, and is enabled by default for </dl> - <br><dt><code>-fira-loop-pressure</code><dd><a name="index-fira_002dloop_002dpressure-762"></a>Use IRA to evaluate register pressure in loops for decisions to move + <br><dt><code>-fira-loop-pressure</code><dd><a name="index-fira_002dloop_002dpressure-763"></a>Use IRA to evaluate register pressure in loops for decisions to move loop invariants. This option usually results in generation of faster and smaller code on machines with large register files (>= 32 registers), but it can slow the compiler down. <p>This option is enabled at level <samp><span class="option">-O3</span></samp> for some targets. - <br><dt><code>-fno-ira-share-save-slots</code><dd><a name="index-fno_002dira_002dshare_002dsave_002dslots-763"></a>Disable sharing of stack slots used for saving call-used hard + <br><dt><code>-fno-ira-share-save-slots</code><dd><a name="index-fno_002dira_002dshare_002dsave_002dslots-764"></a>Disable sharing of stack slots used for saving call-used hard registers living through a call. Each hard register gets a separate stack slot, and as a result function stack frames are larger. - <br><dt><code>-fno-ira-share-spill-slots</code><dd><a name="index-fno_002dira_002dshare_002dspill_002dslots-764"></a>Disable sharing of stack slots allocated for pseudo-registers. Each + <br><dt><code>-fno-ira-share-spill-slots</code><dd><a name="index-fno_002dira_002dshare_002dspill_002dslots-765"></a>Disable sharing of stack slots allocated for pseudo-registers. Each pseudo-register that does not get a hard register gets a separate stack slot, and as a result function stack frames are larger. - <br><dt><code>-fira-verbose=</code><var>n</var><dd><a name="index-fira_002dverbose-765"></a>Control the verbosity of the dump file for the integrated register allocator. + <br><dt><code>-fira-verbose=</code><var>n</var><dd><a name="index-fira_002dverbose-766"></a>Control the verbosity of the dump file for the integrated register allocator. The default value is 5. If the value <var>n</var> is greater or equal to 10, the dump output is sent to stderr using the same format as <var>n</var> minus 10. - <br><dt><code>-fdelayed-branch</code><dd><a name="index-fdelayed_002dbranch-766"></a>If supported for the target machine, attempt to reorder instructions + <br><dt><code>-fdelayed-branch</code><dd><a name="index-fdelayed_002dbranch-767"></a>If supported for the target machine, attempt to reorder instructions to exploit instruction slots available after delayed branch instructions. <p>Enabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fschedule-insns</code><dd><a name="index-fschedule_002dinsns-767"></a>If supported for the target machine, attempt to reorder instructions to + <br><dt><code>-fschedule-insns</code><dd><a name="index-fschedule_002dinsns-768"></a>If supported for the target machine, attempt to reorder instructions to eliminate execution stalls due to required data being unavailable. This helps machines that have slow floating point or memory load instructions by allowing other instructions to be issued until the result of the load @@ -647,22 +647,22 @@ or floating-point instruction is required. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>. - <br><dt><code>-fschedule-insns2</code><dd><a name="index-fschedule_002dinsns2-768"></a>Similar to <samp><span class="option">-fschedule-insns</span></samp>, but requests an additional pass of + <br><dt><code>-fschedule-insns2</code><dd><a name="index-fschedule_002dinsns2-769"></a>Similar to <samp><span class="option">-fschedule-insns</span></samp>, but requests an additional pass of instruction scheduling after register allocation has been done. This is especially useful on machines with a relatively small number of registers and where memory load instructions take more than one cycle. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fno-sched-interblock</code><dd><a name="index-fno_002dsched_002dinterblock-769"></a>Don't schedule instructions across basic blocks. This is normally + <br><dt><code>-fno-sched-interblock</code><dd><a name="index-fno_002dsched_002dinterblock-770"></a>Don't schedule instructions across basic blocks. This is normally enabled by default when scheduling before register allocation, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fno-sched-spec</code><dd><a name="index-fno_002dsched_002dspec-770"></a>Don't allow speculative motion of non-load instructions. This is normally + <br><dt><code>-fno-sched-spec</code><dd><a name="index-fno_002dsched_002dspec-771"></a>Don't allow speculative motion of non-load instructions. This is normally enabled by default when scheduling before register allocation, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-pressure</code><dd><a name="index-fsched_002dpressure-771"></a>Enable register pressure sensitive insn scheduling before the register + <br><dt><code>-fsched-pressure</code><dd><a name="index-fsched_002dpressure-772"></a>Enable register pressure sensitive insn scheduling before the register allocation. This only makes sense when scheduling before register allocation is enabled, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. Usage of this option can improve the @@ -670,15 +670,15 @@ generated code and decrease its size by preventing register pressure increase above the number of available hard registers and as a consequence register spills in the register allocation. - <br><dt><code>-fsched-spec-load</code><dd><a name="index-fsched_002dspec_002dload-772"></a>Allow speculative motion of some load instructions. This only makes + <br><dt><code>-fsched-spec-load</code><dd><a name="index-fsched_002dspec_002dload-773"></a>Allow speculative motion of some load instructions. This only makes sense when scheduling before register allocation, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-spec-load-dangerous</code><dd><a name="index-fsched_002dspec_002dload_002ddangerous-773"></a>Allow speculative motion of more load instructions. This only makes + <br><dt><code>-fsched-spec-load-dangerous</code><dd><a name="index-fsched_002dspec_002dload_002ddangerous-774"></a>Allow speculative motion of more load instructions. This only makes sense when scheduling before register allocation, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-stalled-insns</code><dt><code>-fsched-stalled-insns=</code><var>n</var><dd><a name="index-fsched_002dstalled_002dinsns-774"></a>Define how many insns (if any) can be moved prematurely from the queue + <br><dt><code>-fsched-stalled-insns</code><dt><code>-fsched-stalled-insns=</code><var>n</var><dd><a name="index-fsched_002dstalled_002dinsns-775"></a>Define how many insns (if any) can be moved prematurely from the queue of stalled insns into the ready list, during the second scheduling pass. <samp><span class="option">-fno-sched-stalled-insns</span></samp> means that no insns will be moved prematurely, <samp><span class="option">-fsched-stalled-insns=0</span></samp> means there is no limit @@ -686,7 +686,7 @@ on how many queued insns can be moved prematurely. <samp><span class="option">-fsched-stalled-insns</span></samp> without a value is equivalent to <samp><span class="option">-fsched-stalled-insns=1</span></samp>. - <br><dt><code>-fsched-stalled-insns-dep</code><dt><code>-fsched-stalled-insns-dep=</code><var>n</var><dd><a name="index-fsched_002dstalled_002dinsns_002ddep-775"></a>Define how many insn groups (cycles) will be examined for a dependency + <br><dt><code>-fsched-stalled-insns-dep</code><dt><code>-fsched-stalled-insns-dep=</code><var>n</var><dd><a name="index-fsched_002dstalled_002dinsns_002ddep-776"></a>Define how many insn groups (cycles) will be examined for a dependency on a stalled insn that is candidate for premature removal from the queue of stalled insns. This has an effect only during the second scheduling pass, and only if <samp><span class="option">-fsched-stalled-insns</span></samp> is used. @@ -695,7 +695,7 @@ and only if <samp><span class="option">-fsched-stalled-insns</span></samp> is us <samp><span class="option">-fsched-stalled-insns-dep</span></samp> without a value is equivalent to <samp><span class="option">-fsched-stalled-insns-dep=1</span></samp>. - <br><dt><code>-fsched2-use-superblocks</code><dd><a name="index-fsched2_002duse_002dsuperblocks-776"></a>When scheduling after register allocation, do use superblock scheduling + <br><dt><code>-fsched2-use-superblocks</code><dd><a name="index-fsched2_002duse_002dsuperblocks-777"></a>When scheduling after register allocation, do use superblock scheduling algorithm. Superblock scheduling allows motion across basic block boundaries resulting on faster schedules. This option is experimental, as not all machine descriptions used by GCC model the CPU closely enough to avoid unreliable @@ -704,62 +704,62 @@ results from the algorithm. <p>This only makes sense when scheduling after register allocation, i.e. with <samp><span class="option">-fschedule-insns2</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-group-heuristic</code><dd><a name="index-fsched_002dgroup_002dheuristic-777"></a>Enable the group heuristic in the scheduler. This heuristic favors + <br><dt><code>-fsched-group-heuristic</code><dd><a name="index-fsched_002dgroup_002dheuristic-778"></a>Enable the group heuristic in the scheduler. This heuristic favors the instruction that belongs to a schedule group. This is enabled by default when scheduling is enabled, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or <samp><span class="option">-fschedule-insns2</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-critical-path-heuristic</code><dd><a name="index-fsched_002dcritical_002dpath_002dheuristic-778"></a>Enable the critical-path heuristic in the scheduler. This heuristic favors + <br><dt><code>-fsched-critical-path-heuristic</code><dd><a name="index-fsched_002dcritical_002dpath_002dheuristic-779"></a>Enable the critical-path heuristic in the scheduler. This heuristic favors instructions on the critical path. This is enabled by default when scheduling is enabled, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or <samp><span class="option">-fschedule-insns2</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-spec-insn-heuristic</code><dd><a name="index-fsched_002dspec_002dinsn_002dheuristic-779"></a>Enable the speculative instruction heuristic in the scheduler. This + <br><dt><code>-fsched-spec-insn-heuristic</code><dd><a name="index-fsched_002dspec_002dinsn_002dheuristic-780"></a>Enable the speculative instruction heuristic in the scheduler. This heuristic favors speculative instructions with greater dependency weakness. This is enabled by default when scheduling is enabled, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or <samp><span class="option">-fschedule-insns2</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-rank-heuristic</code><dd><a name="index-fsched_002drank_002dheuristic-780"></a>Enable the rank heuristic in the scheduler. This heuristic favors + <br><dt><code>-fsched-rank-heuristic</code><dd><a name="index-fsched_002drank_002dheuristic-781"></a>Enable the rank heuristic in the scheduler. This heuristic favors the instruction belonging to a basic block with greater size or frequency. This is enabled by default when scheduling is enabled, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or <samp><span class="option">-fschedule-insns2</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-last-insn-heuristic</code><dd><a name="index-fsched_002dlast_002dinsn_002dheuristic-781"></a>Enable the last-instruction heuristic in the scheduler. This heuristic + <br><dt><code>-fsched-last-insn-heuristic</code><dd><a name="index-fsched_002dlast_002dinsn_002dheuristic-782"></a>Enable the last-instruction heuristic in the scheduler. This heuristic favors the instruction that is less dependent on the last instruction scheduled. This is enabled by default when scheduling is enabled, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or <samp><span class="option">-fschedule-insns2</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-fsched-dep-count-heuristic</code><dd><a name="index-fsched_002ddep_002dcount_002dheuristic-782"></a>Enable the dependent-count heuristic in the scheduler. This heuristic + <br><dt><code>-fsched-dep-count-heuristic</code><dd><a name="index-fsched_002ddep_002dcount_002dheuristic-783"></a>Enable the dependent-count heuristic in the scheduler. This heuristic favors the instruction that has more instructions depending on it. This is enabled by default when scheduling is enabled, i.e. with <samp><span class="option">-fschedule-insns</span></samp> or <samp><span class="option">-fschedule-insns2</span></samp> or at <samp><span class="option">-O2</span></samp> or higher. - <br><dt><code>-freschedule-modulo-scheduled-loops</code><dd><a name="index-freschedule_002dmodulo_002dscheduled_002dloops-783"></a>The modulo scheduling comes before the traditional scheduling, if a loop + <br><dt><code>-freschedule-modulo-scheduled-loops</code><dd><a name="index-freschedule_002dmodulo_002dscheduled_002dloops-784"></a>The modulo scheduling comes before the traditional scheduling, if a loop was modulo scheduled we may want to prevent the later scheduling passes from changing its schedule, we use this option to control that. - <br><dt><code>-fselective-scheduling</code><dd><a name="index-fselective_002dscheduling-784"></a>Schedule instructions using selective scheduling algorithm. Selective + <br><dt><code>-fselective-scheduling</code><dd><a name="index-fselective_002dscheduling-785"></a>Schedule instructions using selective scheduling algorithm. Selective scheduling runs instead of the first scheduler pass. - <br><dt><code>-fselective-scheduling2</code><dd><a name="index-fselective_002dscheduling2-785"></a>Schedule instructions using selective scheduling algorithm. Selective + <br><dt><code>-fselective-scheduling2</code><dd><a name="index-fselective_002dscheduling2-786"></a>Schedule instructions using selective scheduling algorithm. Selective scheduling runs instead of the second scheduler pass. - <br><dt><code>-fsel-sched-pipelining</code><dd><a name="index-fsel_002dsched_002dpipelining-786"></a>Enable software pipelining of innermost loops during selective scheduling. + <br><dt><code>-fsel-sched-pipelining</code><dd><a name="index-fsel_002dsched_002dpipelining-787"></a>Enable software pipelining of innermost loops during selective scheduling. This option has no effect until one of <samp><span class="option">-fselective-scheduling</span></samp> or <samp><span class="option">-fselective-scheduling2</span></samp> is turned on. - <br><dt><code>-fsel-sched-pipelining-outer-loops</code><dd><a name="index-fsel_002dsched_002dpipelining_002douter_002dloops-787"></a>When pipelining loops during selective scheduling, also pipeline outer loops. + <br><dt><code>-fsel-sched-pipelining-outer-loops</code><dd><a name="index-fsel_002dsched_002dpipelining_002douter_002dloops-788"></a>When pipelining loops during selective scheduling, also pipeline outer loops. This option has no effect until <samp><span class="option">-fsel-sched-pipelining</span></samp> is turned on. - <br><dt><code>-fshrink-wrap</code><dd><a name="index-fshrink_002dwrap-788"></a>Emit function prologues only before parts of the function that need it, + <br><dt><code>-fshrink-wrap</code><dd><a name="index-fshrink_002dwrap-789"></a>Emit function prologues only before parts of the function that need it, rather than at the top of the function. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-fcaller-saves</code><dd><a name="index-fcaller_002dsaves-789"></a>Enable values to be allocated in registers that will be clobbered by + <br><dt><code>-fcaller-saves</code><dd><a name="index-fcaller_002dsaves-790"></a>Enable values to be allocated in registers that will be clobbered by function calls, by emitting extra instructions to save and restore the registers around such calls. Such allocation is done only when it seems to result in better code than would otherwise be produced. @@ -769,65 +769,68 @@ those which have no call-preserved registers to use instead. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fcombine-stack-adjustments</code><dd><a name="index-fcombine_002dstack_002dadjustments-790"></a>Tracks stack adjustments (pushes and pops) and stack memory references + <br><dt><code>-fcombine-stack-adjustments</code><dd><a name="index-fcombine_002dstack_002dadjustments-791"></a>Tracks stack adjustments (pushes and pops) and stack memory references and then tries to find ways to combine them. <p>Enabled by default at <samp><span class="option">-O1</span></samp> and higher. - <br><dt><code>-fconserve-stack</code><dd><a name="index-fconserve_002dstack-791"></a>Attempt to minimize stack usage. The compiler will attempt to use less + <br><dt><code>-fconserve-stack</code><dd><a name="index-fconserve_002dstack-792"></a>Attempt to minimize stack usage. The compiler will attempt to use less stack space, even if that makes the program slower. This option implies setting the <samp><span class="option">large-stack-frame</span></samp> parameter to 100 and the <samp><span class="option">large-stack-frame-growth</span></samp> parameter to 400. - <br><dt><code>-ftree-reassoc</code><dd><a name="index-ftree_002dreassoc-792"></a>Perform reassociation on trees. This flag is enabled by default + <br><dt><code>-ftree-reassoc</code><dd><a name="index-ftree_002dreassoc-793"></a>Perform reassociation on trees. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-pre</code><dd><a name="index-ftree_002dpre-793"></a>Perform partial redundancy elimination (PRE) on trees. This flag is + <br><dt><code>-ftree-pre</code><dd><a name="index-ftree_002dpre-794"></a>Perform partial redundancy elimination (PRE) on trees. This flag is enabled by default at <samp><span class="option">-O2</span></samp> and <samp><span class="option">-O3</span></samp>. - <br><dt><code>-ftree-forwprop</code><dd><a name="index-ftree_002dforwprop-794"></a>Perform forward propagation on trees. This flag is enabled by default + <br><dt><code>-ftree-partial-pre</code><dd><a name="index-ftree_002dpartial_002dpre-795"></a>Make partial redundancy elimination (PRE) more aggressive. This flag is +enabled by default at <samp><span class="option">-O3</span></samp>. + + <br><dt><code>-ftree-forwprop</code><dd><a name="index-ftree_002dforwprop-796"></a>Perform forward propagation on trees. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-fre</code><dd><a name="index-ftree_002dfre-795"></a>Perform full redundancy elimination (FRE) on trees. The difference + <br><dt><code>-ftree-fre</code><dd><a name="index-ftree_002dfre-797"></a>Perform full redundancy elimination (FRE) on trees. The difference between FRE and PRE is that FRE only considers expressions that are computed on all paths leading to the redundant computation. This analysis is faster than PRE, though it exposes fewer redundancies. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-phiprop</code><dd><a name="index-ftree_002dphiprop-796"></a>Perform hoisting of loads from conditional pointers on trees. This + <br><dt><code>-ftree-phiprop</code><dd><a name="index-ftree_002dphiprop-798"></a>Perform hoisting of loads from conditional pointers on trees. This pass is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-copy-prop</code><dd><a name="index-ftree_002dcopy_002dprop-797"></a>Perform copy propagation on trees. This pass eliminates unnecessary + <br><dt><code>-ftree-copy-prop</code><dd><a name="index-ftree_002dcopy_002dprop-799"></a>Perform copy propagation on trees. This pass eliminates unnecessary copy operations. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-fipa-pure-const</code><dd><a name="index-fipa_002dpure_002dconst-798"></a>Discover which functions are pure or constant. + <br><dt><code>-fipa-pure-const</code><dd><a name="index-fipa_002dpure_002dconst-800"></a>Discover which functions are pure or constant. Enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-fipa-reference</code><dd><a name="index-fipa_002dreference-799"></a>Discover which static variables do not escape cannot escape the + <br><dt><code>-fipa-reference</code><dd><a name="index-fipa_002dreference-801"></a>Discover which static variables do not escape cannot escape the compilation unit. Enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-fipa-pta</code><dd><a name="index-fipa_002dpta-800"></a>Perform interprocedural pointer analysis and interprocedural modification + <br><dt><code>-fipa-pta</code><dd><a name="index-fipa_002dpta-802"></a>Perform interprocedural pointer analysis and interprocedural modification and reference analysis. This option can cause excessive memory and compile-time usage on large compilation units. It is not enabled by default at any optimization level. - <br><dt><code>-fipa-profile</code><dd><a name="index-fipa_002dprofile-801"></a>Perform interprocedural profile propagation. The functions called only from + <br><dt><code>-fipa-profile</code><dd><a name="index-fipa_002dprofile-803"></a>Perform interprocedural profile propagation. The functions called only from cold functions are marked as cold. Also functions executed once (such as <code>cold</code>, <code>noreturn</code>, 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 <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-fipa-cp</code><dd><a name="index-fipa_002dcp-802"></a>Perform interprocedural constant propagation. + <br><dt><code>-fipa-cp</code><dd><a name="index-fipa_002dcp-804"></a>Perform interprocedural constant propagation. This optimization analyzes the program to determine when values passed to functions are constants and then optimizes accordingly. This optimization can substantially increase performance if the application has constants passed to functions. This flag is enabled by default at <samp><span class="option">-O2</span></samp>, <samp><span class="option">-Os</span></samp> and <samp><span class="option">-O3</span></samp>. - <br><dt><code>-fipa-cp-clone</code><dd><a name="index-fipa_002dcp_002dclone-803"></a>Perform function cloning to make interprocedural constant propagation stronger. + <br><dt><code>-fipa-cp-clone</code><dd><a name="index-fipa_002dcp_002dclone-805"></a>Perform function cloning to make interprocedural constant propagation stronger. When enabled, interprocedural constant propagation will perform function cloning when externally visible function can be called with constant arguments. Because this optimization can create multiple copies of functions, @@ -835,7 +838,7 @@ it may significantly increase code size (see <samp><span class="option">--param ipcp-unit-growth=</span><var>value</var></samp>). This flag is enabled by default at <samp><span class="option">-O3</span></samp>. - <br><dt><code>-fipa-matrix-reorg</code><dd><a name="index-fipa_002dmatrix_002dreorg-804"></a>Perform matrix flattening and transposing. + <br><dt><code>-fipa-matrix-reorg</code><dd><a name="index-fipa_002dmatrix_002dreorg-806"></a>Perform matrix flattening and transposing. Matrix flattening tries to replace an m-dimensional matrix with its equivalent n-dimensional matrix, where n < m. This reduces the level of indirection needed for accessing the elements @@ -845,15 +848,15 @@ improve cache locality. Both optimizations need the <samp><span class="option">-fwhole-program</span></samp> flag. Transposing is enabled only if profiling information is available. - <br><dt><code>-ftree-sink</code><dd><a name="index-ftree_002dsink-805"></a>Perform forward store motion on trees. This flag is + <br><dt><code>-ftree-sink</code><dd><a name="index-ftree_002dsink-807"></a>Perform forward store motion on trees. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-bit-ccp</code><dd><a name="index-ftree_002dbit_002dccp-806"></a>Perform sparse conditional bit constant propagation on trees and propagate + <br><dt><code>-ftree-bit-ccp</code><dd><a name="index-ftree_002dbit_002dccp-808"></a>Perform sparse conditional bit constant propagation on trees and propagate pointer alignment information. This pass only operates on local scalar variables and is enabled by default at <samp><span class="option">-O</span></samp> and higher. It requires that <samp><span class="option">-ftree-ccp</span></samp> is enabled. - <br><dt><code>-ftree-ccp</code><dd><a name="index-ftree_002dccp-807"></a>Perform sparse conditional constant propagation (CCP) on trees. This + <br><dt><code>-ftree-ccp</code><dd><a name="index-ftree_002dccp-809"></a>Perform sparse conditional constant propagation (CCP) on trees. This pass only operates on local scalar variables and is enabled by default at <samp><span class="option">-O</span></samp> and higher. @@ -868,39 +871,39 @@ in this pass can be limited using <samp><span class="option">max-tail-merge-comparisons</span></samp> parameter and <samp><span class="option">max-tail-merge-iterations</span></samp> parameter. - <br><dt><code>-ftree-dce</code><dd><a name="index-ftree_002ddce-808"></a>Perform dead code elimination (DCE) on trees. This flag is enabled by + <br><dt><code>-ftree-dce</code><dd><a name="index-ftree_002ddce-810"></a>Perform dead code elimination (DCE) on trees. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-builtin-call-dce</code><dd><a name="index-ftree_002dbuiltin_002dcall_002ddce-809"></a>Perform conditional dead code elimination (DCE) for calls to builtin functions + <br><dt><code>-ftree-builtin-call-dce</code><dd><a name="index-ftree_002dbuiltin_002dcall_002ddce-811"></a>Perform conditional dead code elimination (DCE) for calls to builtin functions that may set <code>errno</code> but are otherwise side-effect free. This flag is enabled by default at <samp><span class="option">-O2</span></samp> and higher if <samp><span class="option">-Os</span></samp> is not also specified. - <br><dt><code>-ftree-dominator-opts</code><dd><a name="index-ftree_002ddominator_002dopts-810"></a>Perform a variety of simple scalar cleanups (constant/copy + <br><dt><code>-ftree-dominator-opts</code><dd><a name="index-ftree_002ddominator_002dopts-812"></a>Perform a variety of simple scalar cleanups (constant/copy propagation, redundancy elimination, range propagation and expression simplification) based on a dominator tree traversal. This also performs jump threading (to reduce jumps to jumps). This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-dse</code><dd><a name="index-ftree_002ddse-811"></a>Perform dead store elimination (DSE) on trees. A dead store is a store into + <br><dt><code>-ftree-dse</code><dd><a name="index-ftree_002ddse-813"></a>Perform dead store elimination (DSE) on trees. A dead store is a store into a memory location that is later overwritten by another store without any intervening loads. In this case the earlier store can be deleted. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-ch</code><dd><a name="index-ftree_002dch-812"></a>Perform loop header copying on trees. This is beneficial since it increases + <br><dt><code>-ftree-ch</code><dd><a name="index-ftree_002dch-814"></a>Perform loop header copying on trees. This is beneficial since it increases effectiveness of code motion optimizations. It also saves one jump. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. It is not enabled for <samp><span class="option">-Os</span></samp>, since it usually increases code size. - <br><dt><code>-ftree-loop-optimize</code><dd><a name="index-ftree_002dloop_002doptimize-813"></a>Perform loop optimizations on trees. This flag is enabled by default + <br><dt><code>-ftree-loop-optimize</code><dd><a name="index-ftree_002dloop_002doptimize-815"></a>Perform loop optimizations on trees. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-loop-linear</code><dd><a name="index-ftree_002dloop_002dlinear-814"></a>Perform loop interchange transformations on tree. Same as + <br><dt><code>-ftree-loop-linear</code><dd><a name="index-ftree_002dloop_002dlinear-816"></a>Perform loop interchange transformations on tree. Same as <samp><span class="option">-floop-interchange</span></samp>. To use this code transformation, GCC has to be configured with <samp><span class="option">--with-ppl</span></samp> and <samp><span class="option">--with-cloog</span></samp> to enable the Graphite loop transformation infrastructure. - <br><dt><code>-floop-interchange</code><dd><a name="index-floop_002dinterchange-815"></a>Perform loop interchange transformations on loops. Interchanging two + <br><dt><code>-floop-interchange</code><dd><a name="index-floop_002dinterchange-817"></a>Perform loop interchange transformations on loops. Interchanging two nested loops switches the inner and outer loops. For example, given a loop like: <pre class="smallexample"> DO J = 1, M @@ -925,7 +928,7 @@ Fortran. To use this code transformation, GCC has to be configured with <samp><span class="option">--with-ppl</span></samp> and <samp><span class="option">--with-cloog</span></samp> to enable the Graphite loop transformation infrastructure. - <br><dt><code>-floop-strip-mine</code><dd><a name="index-floop_002dstrip_002dmine-816"></a>Perform loop strip mining transformations on loops. Strip mining + <br><dt><code>-floop-strip-mine</code><dd><a name="index-floop_002dstrip_002dmine-818"></a>Perform loop strip mining transformations on loops. Strip mining splits a loop into two nested loops. The outer loop has strides equal to the strip size and the inner loop has strides of the original loop within a strip. The strip length can be changed @@ -947,7 +950,7 @@ not limited to Fortran. To use this code transformation, GCC has to be configured with <samp><span class="option">--with-ppl</span></samp> and <samp><span class="option">--with-cloog</span></samp> to enable the Graphite loop transformation infrastructure. - <br><dt><code>-floop-block</code><dd><a name="index-floop_002dblock-817"></a>Perform loop blocking transformations on loops. Blocking strip mines + <br><dt><code>-floop-block</code><dd><a name="index-floop_002dblock-819"></a>Perform loop blocking transformations on loops. Blocking strip mines each loop in the loop nest such that the memory accesses of the element loops fit inside caches. The strip length can be changed using the <samp><span class="option">loop-block-tile-size</span></samp> parameter. For example, given @@ -977,14 +980,14 @@ code transformation, GCC has to be configured with <samp><span class="option">-- and <samp><span class="option">--with-cloog</span></samp> to enable the Graphite loop transformation infrastructure. - <br><dt><code>-fgraphite-identity</code><dd><a name="index-fgraphite_002didentity-818"></a>Enable the identity transformation for graphite. For every SCoP we generate + <br><dt><code>-fgraphite-identity</code><dd><a name="index-fgraphite_002didentity-820"></a>Enable the identity transformation for graphite. For every SCoP we generate the polyhedral representation and transform it back to gimple. Using <samp><span class="option">-fgraphite-identity</span></samp> we can check the costs or benefits of the GIMPLE -> GRAPHITE -> GIMPLE transformation. Some minimal optimizations are also performed by the code generator CLooG, like index splitting and dead code elimination in loops. - <br><dt><code>-floop-flatten</code><dd><a name="index-floop_002dflatten-819"></a>Removes the loop nesting structure: transforms the loop nest into a + <br><dt><code>-floop-flatten</code><dd><a name="index-floop_002dflatten-821"></a>Removes the loop nesting structure: transforms the loop nest into a single loop. This transformation can be useful as an enablement transform for vectorization and parallelization. This feature is experimental. @@ -992,12 +995,12 @@ To use this code transformation, GCC has to be configured with <samp><span class="option">--with-ppl</span></samp> and <samp><span class="option">--with-cloog</span></samp> to enable the Graphite loop transformation infrastructure. - <br><dt><code>-floop-parallelize-all</code><dd><a name="index-floop_002dparallelize_002dall-820"></a>Use the Graphite data dependence analysis to identify loops that can + <br><dt><code>-floop-parallelize-all</code><dd><a name="index-floop_002dparallelize_002dall-822"></a>Use the Graphite data dependence analysis to identify loops that can be parallelized. Parallelize all the loops that can be analyzed to not contain loop carried dependences without checking that it is profitable to parallelize the loops. - <br><dt><code>-fcheck-data-deps</code><dd><a name="index-fcheck_002ddata_002ddeps-821"></a>Compare the results of several data dependence analyzers. This option + <br><dt><code>-fcheck-data-deps</code><dd><a name="index-fcheck_002ddata_002ddeps-823"></a>Compare the results of several data dependence analyzers. This option is used for debugging the data dependence analyzers. <br><dt><code>-ftree-loop-if-convert</code><dd>Attempt to transform conditional jumps in the innermost loops to @@ -1056,22 +1059,22 @@ memset zero. For example, the loop </pre> <p>and the initialization loop is transformed into a call to memset zero. - <br><dt><code>-ftree-loop-im</code><dd><a name="index-ftree_002dloop_002dim-822"></a>Perform loop invariant motion on trees. This pass moves only invariants that + <br><dt><code>-ftree-loop-im</code><dd><a name="index-ftree_002dloop_002dim-824"></a>Perform loop invariant motion on trees. This pass moves only invariants that would be hard to handle at RTL level (function calls, operations that expand to nontrivial sequences of insns). With <samp><span class="option">-funswitch-loops</span></samp> it also moves operands of conditions that are invariant out of the loop, so that we can use just trivial invariantness analysis in loop unswitching. The pass also includes store motion. - <br><dt><code>-ftree-loop-ivcanon</code><dd><a name="index-ftree_002dloop_002divcanon-823"></a>Create a canonical counter for number of iterations in loops for which + <br><dt><code>-ftree-loop-ivcanon</code><dd><a name="index-ftree_002dloop_002divcanon-825"></a>Create a canonical counter for number of iterations in loops for which determining number of iterations requires complicated analysis. Later optimizations then may determine the number easily. Useful especially in connection with unrolling. - <br><dt><code>-fivopts</code><dd><a name="index-fivopts-824"></a>Perform induction variable optimizations (strength reduction, induction + <br><dt><code>-fivopts</code><dd><a name="index-fivopts-826"></a>Perform induction variable optimizations (strength reduction, induction variable merging and induction variable elimination) on trees. - <br><dt><code>-ftree-parallelize-loops=n</code><dd><a name="index-ftree_002dparallelize_002dloops-825"></a>Parallelize loops, i.e., split their iteration space to run in n threads. + <br><dt><code>-ftree-parallelize-loops=n</code><dd><a name="index-ftree_002dparallelize_002dloops-827"></a>Parallelize loops, i.e., split their iteration space to run in n threads. This is only possible for loops whose iterations are independent and can be arbitrarily reordered. The optimization is only profitable on multiprocessor machines, for loops that are CPU-intensive, @@ -1079,40 +1082,40 @@ rather than constrained e.g. by memory bandwidth. This option implies <samp><span class="option">-pthread</span></samp>, and thus is only supported on targets that have support for <samp><span class="option">-pthread</span></samp>. - <br><dt><code>-ftree-pta</code><dd><a name="index-ftree_002dpta-826"></a>Perform function-local points-to analysis on trees. This flag is + <br><dt><code>-ftree-pta</code><dd><a name="index-ftree_002dpta-828"></a>Perform function-local points-to analysis on trees. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-sra</code><dd><a name="index-ftree_002dsra-827"></a>Perform scalar replacement of aggregates. This pass replaces structure + <br><dt><code>-ftree-sra</code><dd><a name="index-ftree_002dsra-829"></a>Perform scalar replacement of aggregates. This pass replaces structure references with scalars to prevent committing structures to memory too early. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-copyrename</code><dd><a name="index-ftree_002dcopyrename-828"></a>Perform copy renaming on trees. This pass attempts to rename compiler + <br><dt><code>-ftree-copyrename</code><dd><a name="index-ftree_002dcopyrename-830"></a>Perform copy renaming on trees. This pass attempts to rename compiler temporaries to other variables at copy locations, usually resulting in variable names which more closely resemble the original variables. This flag is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-ter</code><dd><a name="index-ftree_002dter-829"></a>Perform temporary expression replacement during the SSA->normal phase. Single + <br><dt><code>-ftree-ter</code><dd><a name="index-ftree_002dter-831"></a>Perform temporary expression replacement during the SSA->normal phase. Single use/single def temporaries are replaced at their use location with their defining expression. This results in non-GIMPLE code, but gives the expanders much more complex trees to work on resulting in better RTL generation. This is enabled by default at <samp><span class="option">-O</span></samp> and higher. - <br><dt><code>-ftree-vectorize</code><dd><a name="index-ftree_002dvectorize-830"></a>Perform loop vectorization on trees. This flag is enabled by default at + <br><dt><code>-ftree-vectorize</code><dd><a name="index-ftree_002dvectorize-832"></a>Perform loop vectorization on trees. This flag is enabled by default at <samp><span class="option">-O3</span></samp>. - <br><dt><code>-ftree-slp-vectorize</code><dd><a name="index-ftree_002dslp_002dvectorize-831"></a>Perform basic block vectorization on trees. This flag is enabled by default at + <br><dt><code>-ftree-slp-vectorize</code><dd><a name="index-ftree_002dslp_002dvectorize-833"></a>Perform basic block vectorization on trees. This flag is enabled by default at <samp><span class="option">-O3</span></samp> and when <samp><span class="option">-ftree-vectorize</span></samp> is enabled. - <br><dt><code>-ftree-vect-loop-version</code><dd><a name="index-ftree_002dvect_002dloop_002dversion-832"></a>Perform loop versioning when doing loop vectorization on trees. When a loop + <br><dt><code>-ftree-vect-loop-version</code><dd><a name="index-ftree_002dvect_002dloop_002dversion-834"></a>Perform loop versioning when doing loop vectorization on trees. When a loop appears to be vectorizable except that data alignment or data dependence cannot be determined at compile time, then vectorized and non-vectorized versions of the loop are generated along with run-time checks for alignment or dependence to control which version is executed. This option is enabled by default except at level <samp><span class="option">-Os</span></samp> where it is disabled. - <br><dt><code>-fvect-cost-model</code><dd><a name="index-fvect_002dcost_002dmodel-833"></a>Enable cost model for vectorization. + <br><dt><code>-fvect-cost-model</code><dd><a name="index-fvect_002dcost_002dmodel-835"></a>Enable cost model for vectorization. - <br><dt><code>-ftree-vrp</code><dd><a name="index-ftree_002dvrp-834"></a>Perform Value Range Propagation on trees. This is similar to the + <br><dt><code>-ftree-vrp</code><dd><a name="index-ftree_002dvrp-836"></a>Perform Value Range Propagation on trees. This is similar to the constant propagation pass, but instead of values, ranges of values are propagated. This allows the optimizers to remove unnecessary range checks like array bound checks and null pointer checks. This is @@ -1120,21 +1123,21 @@ enabled by default at <samp><span class="option">-O2</span></samp> and higher. elimination is only done if <samp><span class="option">-fdelete-null-pointer-checks</span></samp> is enabled. - <br><dt><code>-ftracer</code><dd><a name="index-ftracer-835"></a>Perform tail duplication to enlarge superblock size. This transformation + <br><dt><code>-ftracer</code><dd><a name="index-ftracer-837"></a>Perform tail duplication to enlarge superblock size. This transformation simplifies the control flow of the function allowing other optimizations to do better job. - <br><dt><code>-funroll-loops</code><dd><a name="index-funroll_002dloops-836"></a>Unroll loops whose number of iterations can be determined at compile + <br><dt><code>-funroll-loops</code><dd><a name="index-funroll_002dloops-838"></a>Unroll loops whose number of iterations can be determined at compile time or upon entry to the loop. <samp><span class="option">-funroll-loops</span></samp> implies <samp><span class="option">-frerun-cse-after-loop</span></samp>. This option makes code larger, and may or may not make it run faster. - <br><dt><code>-funroll-all-loops</code><dd><a name="index-funroll_002dall_002dloops-837"></a>Unroll all loops, even if their number of iterations is uncertain when + <br><dt><code>-funroll-all-loops</code><dd><a name="index-funroll_002dall_002dloops-839"></a>Unroll all loops, even if their number of iterations is uncertain when the loop is entered. This usually makes programs run more slowly. <samp><span class="option">-funroll-all-loops</span></samp> implies the same options as <samp><span class="option">-funroll-loops</span></samp>, - <br><dt><code>-fsplit-ivs-in-unroller</code><dd><a name="index-fsplit_002divs_002din_002dunroller-838"></a>Enables expressing of values of induction variables in later iterations + <br><dt><code>-fsplit-ivs-in-unroller</code><dd><a name="index-fsplit_002divs_002din_002dunroller-840"></a>Enables expressing of values of induction variables in later iterations of the unrolled loop using the value in the first iteration. This breaks long dependency chains, thus improving efficiency of the scheduling passes. @@ -1145,22 +1148,22 @@ on some of the architectures due to restrictions in the CSE pass. <p>This optimization is enabled by default. - <br><dt><code>-fvariable-expansion-in-unroller</code><dd><a name="index-fvariable_002dexpansion_002din_002dunroller-839"></a>With this option, the compiler will create multiple copies of some + <br><dt><code>-fvariable-expansion-in-unroller</code><dd><a name="index-fvariable_002dexpansion_002din_002dunroller-841"></a>With this option, the compiler will create multiple copies of some local variables when unrolling a loop which can result in superior code. - <br><dt><code>-fpartial-inlining</code><dd><a name="index-fpartial_002dinlining-840"></a>Inline parts of functions. This option has any effect only + <br><dt><code>-fpartial-inlining</code><dd><a name="index-fpartial_002dinlining-842"></a>Inline parts of functions. This option has any effect only when inlining itself is turned on by the <samp><span class="option">-finline-functions</span></samp> or <samp><span class="option">-finline-small-functions</span></samp> options. <p>Enabled at level <samp><span class="option">-O2</span></samp>. - <br><dt><code>-fpredictive-commoning</code><dd><a name="index-fpredictive_002dcommoning-841"></a>Perform predictive commoning optimization, i.e., reusing computations + <br><dt><code>-fpredictive-commoning</code><dd><a name="index-fpredictive_002dcommoning-843"></a>Perform predictive commoning optimization, i.e., reusing computations (especially memory loads and stores) performed in previous iterations of loops. <p>This option is enabled at level <samp><span class="option">-O3</span></samp>. - <br><dt><code>-fprefetch-loop-arrays</code><dd><a name="index-fprefetch_002dloop_002darrays-842"></a>If supported by the target machine, generate instructions to prefetch + <br><dt><code>-fprefetch-loop-arrays</code><dd><a name="index-fprefetch_002dloop_002darrays-844"></a>If supported by the target machine, generate instructions to prefetch memory to improve the performance of loops that access large arrays. <p>This option may generate better or worse code; results are highly @@ -1168,7 +1171,7 @@ dependent on the structure of loops within the source code. <p>Disabled at level <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fno-peephole</code><dt><code>-fno-peephole2</code><dd><a name="index-fno_002dpeephole-843"></a><a name="index-fno_002dpeephole2-844"></a>Disable any machine-specific peephole optimizations. The difference + <br><dt><code>-fno-peephole</code><dt><code>-fno-peephole2</code><dd><a name="index-fno_002dpeephole-845"></a><a name="index-fno_002dpeephole2-846"></a>Disable any machine-specific peephole optimizations. The difference between <samp><span class="option">-fno-peephole</span></samp> and <samp><span class="option">-fno-peephole2</span></samp> is in how they are implemented in the compiler; some targets use one, some use the other, a few use both. @@ -1176,7 +1179,7 @@ other, a few use both. <p><samp><span class="option">-fpeephole</span></samp> is enabled by default. <samp><span class="option">-fpeephole2</span></samp> enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fno-guess-branch-probability</code><dd><a name="index-fno_002dguess_002dbranch_002dprobability-845"></a>Do not guess branch probabilities using heuristics. + <br><dt><code>-fno-guess-branch-probability</code><dd><a name="index-fno_002dguess_002dbranch_002dprobability-847"></a>Do not guess branch probabilities using heuristics. <p>GCC will use heuristics to guess branch probabilities if they are not provided by profiling feedback (<samp><span class="option">-fprofile-arcs</span></samp>). These @@ -1191,12 +1194,12 @@ of ‘<samp><span class="samp">__builtin_expect</span></samp>’ are eas <p>The default is <samp><span class="option">-fguess-branch-probability</span></samp> at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-freorder-blocks</code><dd><a name="index-freorder_002dblocks-846"></a>Reorder basic blocks in the compiled function in order to reduce number of + <br><dt><code>-freorder-blocks</code><dd><a name="index-freorder_002dblocks-848"></a>Reorder basic blocks in the compiled function in order to reduce number of taken branches and improve code locality. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>. - <br><dt><code>-freorder-blocks-and-partition</code><dd><a name="index-freorder_002dblocks_002dand_002dpartition-847"></a>In addition to reordering basic blocks in the compiled function, in order + <br><dt><code>-freorder-blocks-and-partition</code><dd><a name="index-freorder_002dblocks_002dand_002dpartition-849"></a>In addition to reordering basic blocks in the compiled function, in order to reduce number of taken branches, partitions hot and cold basic blocks into separate sections of the assembly and .o files, to improve paging and cache locality performance. @@ -1206,7 +1209,7 @@ exception handling, for linkonce sections, for functions with a user-defined section attribute and on any architecture that does not support named sections. - <br><dt><code>-freorder-functions</code><dd><a name="index-freorder_002dfunctions-848"></a>Reorder functions in the object file in order to + <br><dt><code>-freorder-functions</code><dd><a name="index-freorder_002dfunctions-850"></a>Reorder functions in the object file in order to improve code locality. This is implemented by using special subsections <code>.text.hot</code> for most frequently executed functions and <code>.text.unlikely</code> for unlikely executed functions. Reordering is done by @@ -1218,7 +1221,7 @@ place them in a reasonable way. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fstrict-aliasing</code><dd><a name="index-fstrict_002daliasing-849"></a>Allow the compiler to assume the strictest aliasing rules applicable to + <br><dt><code>-fstrict-aliasing</code><dd><a name="index-fstrict_002daliasing-851"></a>Allow the compiler to assume the strictest aliasing rules applicable to the language being compiled. For C (and C++), this activates optimizations based on the type of expressions. In particular, an object of one type is assumed never to reside at the same address as an @@ -1263,7 +1266,7 @@ uses a union type, e.g.: <p>The <samp><span class="option">-fstrict-aliasing</span></samp> option is enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fstrict-overflow</code><dd><a name="index-fstrict_002doverflow-850"></a>Allow the compiler to assume strict signed overflow rules, depending + <br><dt><code>-fstrict-overflow</code><dd><a name="index-fstrict_002doverflow-852"></a>Allow the compiler to assume strict signed overflow rules, depending on the language being compiled. For C (and C++) this means that overflow when doing arithmetic with signed numbers is undefined, which means that the compiler may assume that it will not happen. This @@ -1296,7 +1299,7 @@ arithmetic on constants, the overflowed value can still be used with <p>The <samp><span class="option">-fstrict-overflow</span></samp> option is enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-falign-functions</code><dt><code>-falign-functions=</code><var>n</var><dd><a name="index-falign_002dfunctions-851"></a>Align the start of functions to the next power-of-two greater than + <br><dt><code>-falign-functions</code><dt><code>-falign-functions=</code><var>n</var><dd><a name="index-falign_002dfunctions-853"></a>Align the start of functions to the next power-of-two greater than <var>n</var>, skipping up to <var>n</var> bytes. For instance, <samp><span class="option">-falign-functions=32</span></samp> aligns functions to the next 32-byte boundary, but <samp><span class="option">-falign-functions=24</span></samp> would align to the next @@ -1312,7 +1315,7 @@ in that case, it is rounded up. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>. - <br><dt><code>-falign-labels</code><dt><code>-falign-labels=</code><var>n</var><dd><a name="index-falign_002dlabels-852"></a>Align all branch targets to a power-of-two boundary, skipping up to + <br><dt><code>-falign-labels</code><dt><code>-falign-labels=</code><var>n</var><dd><a name="index-falign_002dlabels-854"></a>Align all branch targets to a power-of-two boundary, skipping up to <var>n</var> bytes like <samp><span class="option">-falign-functions</span></samp>. This option can easily make code slower, because it must insert dummy operations for when the branch target is reached in the usual flow of the code. @@ -1328,7 +1331,7 @@ which is very likely to be ‘<samp><span class="samp">1</span></samp>&rsquo <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>. - <br><dt><code>-falign-loops</code><dt><code>-falign-loops=</code><var>n</var><dd><a name="index-falign_002dloops-853"></a>Align loops to a power-of-two boundary, skipping up to <var>n</var> bytes + <br><dt><code>-falign-loops</code><dt><code>-falign-loops=</code><var>n</var><dd><a name="index-falign_002dloops-855"></a>Align loops to a power-of-two boundary, skipping up to <var>n</var> bytes like <samp><span class="option">-falign-functions</span></samp>. The hope is that the loop will be executed many times, which will make up for any execution of the dummy operations. @@ -1340,7 +1343,7 @@ equivalent and mean that loops will not be aligned. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>. - <br><dt><code>-falign-jumps</code><dt><code>-falign-jumps=</code><var>n</var><dd><a name="index-falign_002djumps-854"></a>Align branch targets to a power-of-two boundary, for branch targets + <br><dt><code>-falign-jumps</code><dt><code>-falign-jumps=</code><var>n</var><dd><a name="index-falign_002djumps-856"></a>Align branch targets to a power-of-two boundary, for branch targets where the targets can only be reached by jumping, skipping up to <var>n</var> bytes like <samp><span class="option">-falign-functions</span></samp>. In this case, no dummy operations need be executed. @@ -1352,13 +1355,13 @@ equivalent and mean that loops will not be aligned. <p>Enabled at levels <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>. - <br><dt><code>-funit-at-a-time</code><dd><a name="index-funit_002dat_002da_002dtime-855"></a>This option is left for compatibility reasons. <samp><span class="option">-funit-at-a-time</span></samp> + <br><dt><code>-funit-at-a-time</code><dd><a name="index-funit_002dat_002da_002dtime-857"></a>This option is left for compatibility reasons. <samp><span class="option">-funit-at-a-time</span></samp> has no effect, while <samp><span class="option">-fno-unit-at-a-time</span></samp> implies <samp><span class="option">-fno-toplevel-reorder</span></samp> and <samp><span class="option">-fno-section-anchors</span></samp>. <p>Enabled by default. - <br><dt><code>-fno-toplevel-reorder</code><dd><a name="index-fno_002dtoplevel_002dreorder-856"></a>Do not reorder top-level functions, variables, and <code>asm</code> + <br><dt><code>-fno-toplevel-reorder</code><dd><a name="index-fno_002dtoplevel_002dreorder-858"></a>Do not reorder top-level functions, variables, and <code>asm</code> statements. Output them in the same order that they appear in the input file. When this option is used, unreferenced static variables will not be removed. This option is intended to support existing code @@ -1369,7 +1372,7 @@ use attributes. <samp><span class="option">-fno-section-anchors</span></samp>, which is otherwise enabled at <samp><span class="option">-O0</span></samp> on some targets. - <br><dt><code>-fweb</code><dd><a name="index-fweb-857"></a>Constructs webs as commonly used for register allocation purposes and assign + <br><dt><code>-fweb</code><dd><a name="index-fweb-859"></a>Constructs webs as commonly used for register allocation purposes and assign each web individual pseudo register. This allows the register allocation pass to operate on pseudos directly, but also strengthens several other optimization passes, such as CSE, loop optimizer and trivial dead code remover. It can, @@ -1378,7 +1381,7 @@ however, make debugging impossible, since variables will no longer stay in a <p>Enabled by default with <samp><span class="option">-funroll-loops</span></samp>. - <br><dt><code>-fwhole-program</code><dd><a name="index-fwhole_002dprogram-858"></a>Assume that the current compilation unit represents the whole program being + <br><dt><code>-fwhole-program</code><dd><a name="index-fwhole_002dprogram-860"></a>Assume that the current compilation unit represents the whole program being compiled. All public functions and variables with the exception of <code>main</code> and those merged by attribute <code>externally_visible</code> become static functions and in effect are optimized more aggressively by interprocedural optimizers. If <samp><span class="command">gold</span></samp> is used as the linker plugin, <code>externally_visible</code> attributes are automatically added to functions (not variable yet due to a current <samp><span class="command">gold</span></samp> issue) that are accessed outside of LTO objects according to resolution file produced by <samp><span class="command">gold</span></samp>. For other linkers that cannot generate resolution file, explicit <code>externally_visible</code> attributes are still necessary. @@ -1391,7 +1394,7 @@ itself. <p>This option implies <samp><span class="option">-fwhole-file</span></samp> for Fortran programs. - <br><dt><code>-flto[=</code><var>n</var><code>]</code><dd><a name="index-flto-859"></a>This option runs the standard link-time optimizer. When invoked + <br><dt><code>-flto[=</code><var>n</var><code>]</code><dd><a name="index-flto-861"></a>This option runs the standard link-time optimizer. When invoked with source code, it generates GIMPLE (one of GCC's internal representations) and writes it to special ELF sections in the object file. When the object files are linked together, all the function @@ -1551,7 +1554,7 @@ GNU make. <p>This option is disabled by default - <br><dt><code>-flto-partition=</code><var>alg</var><dd><a name="index-flto_002dpartition-860"></a>Specify the partitioning algorithm used by the link-time optimizer. + <br><dt><code>-flto-partition=</code><var>alg</var><dd><a name="index-flto_002dpartition-862"></a>Specify the partitioning algorithm used by the link-time optimizer. The value is either <code>1to1</code> to specify a partitioning mirroring the original source files or <code>balanced</code> to specify partitioning into equally sized chunks (whenever possible). Specifying <code>none</code> @@ -1589,7 +1592,7 @@ use it. and GCC was configured for use with a linker supporting plugins (GNU ld 2.21 or newer or gold). - <br><dt><code>-ffat-lto-objects</code><dd><a name="index-ffat_002dlto_002dobjects-861"></a>Fat LTO objects are object files that contain both the intermediate language + <br><dt><code>-ffat-lto-objects</code><dd><a name="index-ffat_002dlto_002dobjects-863"></a>Fat LTO objects are object files that contain both the intermediate language and the object code. This makes them usable for both LTO linking and normal linking. This option is effective only when compiling with <samp><span class="option">-flto</span></samp> and is ignored at link time. @@ -1604,7 +1607,7 @@ need to support linker plugins to allow a full-featured build environment change in future releases when linker plugin enabled environments become more common. - <br><dt><code>-fcompare-elim</code><dd><a name="index-fcompare_002delim-862"></a>After register allocation and post-register allocation instruction splitting, + <br><dt><code>-fcompare-elim</code><dd><a name="index-fcompare_002delim-864"></a>After register allocation and post-register allocation instruction splitting, identify arithmetic instructions that compute processor flags similar to a comparison operation based on that arithmetic. If possible, eliminate the explicit comparison operation. @@ -1614,18 +1617,18 @@ the comparison operation before register allocation is complete. <p>Enabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fcprop-registers</code><dd><a name="index-fcprop_002dregisters-863"></a>After register allocation and post-register allocation instruction splitting, + <br><dt><code>-fcprop-registers</code><dd><a name="index-fcprop_002dregisters-865"></a>After register allocation and post-register allocation instruction splitting, we perform a copy-propagation pass to try to reduce scheduling dependencies and occasionally eliminate the copy. <p>Enabled at levels <samp><span class="option">-O</span></samp>, <samp><span class="option">-O2</span></samp>, <samp><span class="option">-O3</span></samp>, <samp><span class="option">-Os</span></samp>. - <br><dt><code>-fprofile-correction</code><dd><a name="index-fprofile_002dcorrection-864"></a>Profiles collected using an instrumented binary for multi-threaded programs may + <br><dt><code>-fprofile-correction</code><dd><a name="index-fprofile_002dcorrection-866"></a>Profiles collected using an instrumented binary for multi-threaded programs may be inconsistent due to missed counter updates. When this option is specified, GCC will use heuristics to correct or smooth out such inconsistencies. By default, GCC will emit an error message when an inconsistent profile is detected. - <br><dt><code>-fprofile-dir=</code><var>path</var><dd><a name="index-fprofile_002ddir-865"></a> + <br><dt><code>-fprofile-dir=</code><var>path</var><dd><a name="index-fprofile_002ddir-867"></a> Set the directory to search for the profile data files in to <var>path</var>. This option affects only the profile data generated by <samp><span class="option">-fprofile-generate</span></samp>, <samp><span class="option">-ftest-coverage</span></samp>, <samp><span class="option">-fprofile-arcs</span></samp> @@ -1634,7 +1637,7 @@ and its related options. Both absolute and relative paths can be used. By default, GCC will use the current directory as <var>path</var>, thus the profile data file will appear in the same directory as the object file. - <br><dt><code>-fprofile-generate</code><dt><code>-fprofile-generate=</code><var>path</var><dd><a name="index-fprofile_002dgenerate-866"></a> + <br><dt><code>-fprofile-generate</code><dt><code>-fprofile-generate=</code><var>path</var><dd><a name="index-fprofile_002dgenerate-868"></a> Enable options usually used for instrumenting application to produce profile useful for later recompilation with profile feedback based optimization. You must use <samp><span class="option">-fprofile-generate</span></samp> both when @@ -1645,7 +1648,7 @@ compiling and when linking your program. <p>If <var>path</var> is specified, GCC will look at the <var>path</var> to find the profile feedback data files. See <samp><span class="option">-fprofile-dir</span></samp>. - <br><dt><code>-fprofile-use</code><dt><code>-fprofile-use=</code><var>path</var><dd><a name="index-fprofile_002duse-867"></a>Enable profile feedback directed optimizations, and optimizations + <br><dt><code>-fprofile-use</code><dt><code>-fprofile-use=</code><var>path</var><dd><a name="index-fprofile_002duse-869"></a>Enable profile feedback directed optimizations, and optimizations generally profitable only with profile feedback available. <p>The following options are enabled: <code>-fbranch-probabilities</code>, <code>-fvpt</code>, @@ -1665,11 +1668,11 @@ arithmetic. These options trade off between speed and correctness. All must be specifically enabled. <dl> -<dt><code>-ffloat-store</code><dd><a name="index-ffloat_002dstore-868"></a>Do not store floating-point variables in registers, and inhibit other +<dt><code>-ffloat-store</code><dd><a name="index-ffloat_002dstore-870"></a>Do not store floating-point variables in registers, and inhibit other options that might change whether a floating-point value is taken from a register or memory. - <p><a name="index-floating_002dpoint-precision-869"></a>This option prevents undesirable excess precision on machines such as + <p><a name="index-floating_002dpoint-precision-871"></a>This option prevents undesirable excess precision on machines such as the 68000 where the floating registers (of the 68881) keep more precision than a <code>double</code> is supposed to have. Similarly for the x86 architecture. For most programs, the excess precision does only @@ -1677,7 +1680,7 @@ good, but a few programs rely on the precise definition of IEEE floating point. Use <samp><span class="option">-ffloat-store</span></samp> for such programs, after modifying them to store all pertinent intermediate computations into variables. - <br><dt><code>-fexcess-precision=</code><var>style</var><dd><a name="index-fexcess_002dprecision-870"></a>This option allows further control over excess precision on machines + <br><dt><code>-fexcess-precision=</code><var>style</var><dd><a name="index-fexcess_002dprecision-872"></a>This option allows further control over excess precision on machines where floating-point registers have more precision than the IEEE <code>float</code> and <code>double</code> types and the processor does not support operations rounding to those types. By default, @@ -1692,7 +1695,7 @@ semantic types (whereas <samp><span class="option">-ffloat-store</span></samp> o assignments). This option is enabled by default for C if a strict conformance option such as <samp><span class="option">-std=c99</span></samp> is used. - <p><a name="index-mfpmath-871"></a><samp><span class="option">-fexcess-precision=standard</span></samp> is not implemented for languages + <p><a name="index-mfpmath-873"></a><samp><span class="option">-fexcess-precision=standard</span></samp> is not implemented for languages other than C, and has no effect if <samp><span class="option">-funsafe-math-optimizations</span></samp> or <samp><span class="option">-ffast-math</span></samp> is specified. On the x86, it also has no effect if <samp><span class="option">-mfpmath=sse</span></samp> @@ -1700,7 +1703,7 @@ or <samp><span class="option">-mfpmath=sse+387</span></samp> is specified; in th semantics apply without excess precision, and in the latter, rounding is unpredictable. - <br><dt><code>-ffast-math</code><dd><a name="index-ffast_002dmath-872"></a>Sets <samp><span class="option">-fno-math-errno</span></samp>, <samp><span class="option">-funsafe-math-optimizations</span></samp>, + <br><dt><code>-ffast-math</code><dd><a name="index-ffast_002dmath-874"></a>Sets <samp><span class="option">-fno-math-errno</span></samp>, <samp><span class="option">-funsafe-math-optimizations</span></samp>, <samp><span class="option">-ffinite-math-only</span></samp>, <samp><span class="option">-fno-rounding-math</span></samp>, <samp><span class="option">-fno-signaling-nans</span></samp> and <samp><span class="option">-fcx-limited-range</span></samp>. @@ -1712,7 +1715,7 @@ 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. - <br><dt><code>-fno-math-errno</code><dd><a name="index-fno_002dmath_002derrno-873"></a>Do not set ERRNO after calling math functions that are executed + <br><dt><code>-fno-math-errno</code><dd><a name="index-fno_002dmath_002derrno-875"></a>Do not set 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. @@ -1729,7 +1732,7 @@ that do not require the guarantees of these specifications. therefore no reason for the compiler to consider the possibility that it might, and <samp><span class="option">-fno-math-errno</span></samp> is the default. - <br><dt><code>-funsafe-math-optimizations</code><dd><a name="index-funsafe_002dmath_002doptimizations-874"></a> + <br><dt><code>-funsafe-math-optimizations</code><dd><a name="index-funsafe_002dmath_002doptimizations-876"></a> Allow optimizations for floating-point arithmetic that (a) assume that arguments and results are valid and (b) may violate IEEE or ANSI standards. When used at link-time, it may include libraries @@ -1746,7 +1749,7 @@ Enables <samp><span class="option">-fno-signed-zeros</span></samp>, <samp><span <p>The default is <samp><span class="option">-fno-unsafe-math-optimizations</span></samp>. - <br><dt><code>-fassociative-math</code><dd><a name="index-fassociative_002dmath-875"></a> + <br><dt><code>-fassociative-math</code><dd><a name="index-fassociative_002dmath-877"></a> Allow re-association of operands in series of floating-point operations. This violates the ISO C and C++ language standard by possibly changing computation result. NOTE: re-ordering may change the sign of zero as @@ -1762,7 +1765,7 @@ is automatically enabled when both <samp><span class="option">-fno-signed-zeros< <p>The default is <samp><span class="option">-fno-associative-math</span></samp>. - <br><dt><code>-freciprocal-math</code><dd><a name="index-freciprocal_002dmath-876"></a> + <br><dt><code>-freciprocal-math</code><dd><a name="index-freciprocal_002dmath-878"></a> Allow the reciprocal of a value to be used instead of dividing by the value if this enables optimizations. For example <code>x / y</code> can be replaced with <code>x * (1/y)</code>, which is useful if <code>(1/y)</code> @@ -1771,7 +1774,7 @@ precision and increases the number of flops operating on the value. <p>The default is <samp><span class="option">-fno-reciprocal-math</span></samp>. - <br><dt><code>-ffinite-math-only</code><dd><a name="index-ffinite_002dmath_002donly-877"></a>Allow optimizations for floating-point arithmetic that assume + <br><dt><code>-ffinite-math-only</code><dd><a name="index-ffinite_002dmath_002donly-879"></a>Allow optimizations for floating-point arithmetic that assume that arguments and results are not NaNs or +-Infs. <p>This option is not turned on by any <samp><span class="option">-O</span></samp> option since @@ -1782,7 +1785,7 @@ that do not require the guarantees of these specifications. <p>The default is <samp><span class="option">-fno-finite-math-only</span></samp>. - <br><dt><code>-fno-signed-zeros</code><dd><a name="index-fno_002dsigned_002dzeros-878"></a>Allow optimizations for floating-point arithmetic that ignore the + <br><dt><code>-fno-signed-zeros</code><dd><a name="index-fno_002dsigned_002dzeros-880"></a>Allow optimizations for floating-point arithmetic that ignore the signedness of zero. IEEE arithmetic specifies the behavior of distinct +0.0 and −0.0 values, which then prohibits simplification of expressions such as x+0.0 or 0.0*x (even with <samp><span class="option">-ffinite-math-only</span></samp>). @@ -1790,7 +1793,7 @@ This option implies that the sign of a zero result isn't significant. <p>The default is <samp><span class="option">-fsigned-zeros</span></samp>. - <br><dt><code>-fno-trapping-math</code><dd><a name="index-fno_002dtrapping_002dmath-879"></a>Compile code assuming that floating-point operations cannot generate + <br><dt><code>-fno-trapping-math</code><dd><a name="index-fno_002dtrapping_002dmath-881"></a>Compile code assuming that floating-point operations cannot generate user-visible traps. These traps include division by zero, overflow, underflow, inexact result and invalid operation. This option requires that <samp><span class="option">-fno-signaling-nans</span></samp> be in effect. Setting this option may @@ -1803,7 +1806,7 @@ math functions. <p>The default is <samp><span class="option">-ftrapping-math</span></samp>. - <br><dt><code>-frounding-math</code><dd><a name="index-frounding_002dmath-880"></a>Disable transformations and optimizations that assume default floating-point + <br><dt><code>-frounding-math</code><dd><a name="index-frounding_002dmath-882"></a>Disable transformations and optimizations that assume default floating-point rounding behavior. This is round-to-zero for all floating point to integer conversions, and round-to-nearest for all other arithmetic truncations. This option should be specified for programs that change @@ -1821,7 +1824,7 @@ Future versions of GCC may provide finer control of this setting using C99's <code>FENV_ACCESS</code> pragma. This command-line option will be used to specify the default state for <code>FENV_ACCESS</code>. - <br><dt><code>-fsignaling-nans</code><dd><a name="index-fsignaling_002dnans-881"></a>Compile code assuming that IEEE signaling NaNs may generate user-visible + <br><dt><code>-fsignaling-nans</code><dd><a name="index-fsignaling_002dnans-883"></a>Compile code assuming that IEEE signaling NaNs may generate user-visible traps during floating-point operations. Setting this option disables optimizations that may change the number of exceptions visible with signaling NaNs. This option implies <samp><span class="option">-ftrapping-math</span></samp>. @@ -1834,10 +1837,10 @@ be defined. <p>This option is experimental and does not currently guarantee to disable all GCC optimizations that affect signaling NaN behavior. - <br><dt><code>-fsingle-precision-constant</code><dd><a name="index-fsingle_002dprecision_002dconstant-882"></a>Treat floating-point constants as single precision instead of + <br><dt><code>-fsingle-precision-constant</code><dd><a name="index-fsingle_002dprecision_002dconstant-884"></a>Treat floating-point constants as single precision instead of implicitly converting them to double-precision constants. - <br><dt><code>-fcx-limited-range</code><dd><a name="index-fcx_002dlimited_002drange-883"></a>When enabled, this option states that a range reduction step is not + <br><dt><code>-fcx-limited-range</code><dd><a name="index-fcx_002dlimited_002drange-885"></a>When enabled, this option states that a range reduction step is not needed when performing complex division. Also, there is no checking whether the result of a complex multiplication or division is <code>NaN + I*NaN</code>, with an attempt to rescue the situation in that case. The @@ -1848,7 +1851,7 @@ default is <samp><span class="option">-fno-cx-limited-range</span></samp>, but i <code>CX_LIMITED_RANGE</code> pragma. Nevertheless, the option applies to all languages. - <br><dt><code>-fcx-fortran-rules</code><dd><a name="index-fcx_002dfortran_002drules-884"></a>Complex multiplication and division follow Fortran rules. Range + <br><dt><code>-fcx-fortran-rules</code><dd><a name="index-fcx_002dfortran_002drules-886"></a>Complex multiplication and division follow Fortran rules. Range reduction is done as part of complex division, but there is no checking whether the result of a complex multiplication or division is <code>NaN + I*NaN</code>, with an attempt to rescue the situation in that case. @@ -1862,7 +1865,7 @@ performance, but are not enabled by any <samp><span class="option">-O</span></sa section includes experimental options that may produce broken code. <dl> -<dt><code>-fbranch-probabilities</code><dd><a name="index-fbranch_002dprobabilities-885"></a>After running a program compiled with <samp><span class="option">-fprofile-arcs</span></samp> +<dt><code>-fbranch-probabilities</code><dd><a name="index-fbranch_002dprobabilities-887"></a>After running a program compiled with <samp><span class="option">-fprofile-arcs</span></samp> (see <a href="Debugging-Options.html#Debugging-Options">Options for Debugging Your Program or <samp><span class="command">gcc</span></samp></a>), you can compile it a second time using <samp><span class="option">-fbranch-probabilities</span></samp>, to improve optimizations based on the number of times each branch was taken. When the program @@ -1879,7 +1882,7 @@ used in one place: in <samp><span class="file">reorg.c</span></samp>, instead of branch is most likely to take, the ‘<samp><span class="samp">REG_BR_PROB</span></samp>’ values are used to exactly determine which path is taken more often. - <br><dt><code>-fprofile-values</code><dd><a name="index-fprofile_002dvalues-886"></a>If combined with <samp><span class="option">-fprofile-arcs</span></samp>, it adds code so that some + <br><dt><code>-fprofile-values</code><dd><a name="index-fprofile_002dvalues-888"></a>If combined with <samp><span class="option">-fprofile-arcs</span></samp>, it adds code so that some data about values of expressions in the program is gathered. <p>With <samp><span class="option">-fbranch-probabilities</span></samp>, it reads back the data gathered @@ -1887,7 +1890,7 @@ from profiling values of expressions for usage in optimizations. <p>Enabled with <samp><span class="option">-fprofile-generate</span></samp> and <samp><span class="option">-fprofile-use</span></samp>. - <br><dt><code>-fvpt</code><dd><a name="index-fvpt-887"></a>If combined with <samp><span class="option">-fprofile-arcs</span></samp>, it instructs the compiler to add + <br><dt><code>-fvpt</code><dd><a name="index-fvpt-889"></a>If combined with <samp><span class="option">-fprofile-arcs</span></samp>, it instructs the compiler to add a code to gather information about values of expressions. <p>With <samp><span class="option">-fbranch-probabilities</span></samp>, it reads back the data gathered @@ -1895,7 +1898,7 @@ and actually performs the optimizations based on them. Currently the optimizations include specialization of division operation using the knowledge about the value of the denominator. - <br><dt><code>-frename-registers</code><dd><a name="index-frename_002dregisters-888"></a>Attempt to avoid false dependencies in scheduled code by making use + <br><dt><code>-frename-registers</code><dd><a name="index-frename_002dregisters-890"></a>Attempt to avoid false dependencies in scheduled code by making use of registers left over after register allocation. This optimization will most benefit processors with lots of registers. Depending on the debug information format adopted by the target, however, it can @@ -1904,13 +1907,13 @@ a “home register”. <p>Enabled by default with <samp><span class="option">-funroll-loops</span></samp> and <samp><span class="option">-fpeel-loops</span></samp>. - <br><dt><code>-ftracer</code><dd><a name="index-ftracer-889"></a>Perform tail duplication to enlarge superblock size. This transformation + <br><dt><code>-ftracer</code><dd><a name="index-ftracer-891"></a>Perform tail duplication to enlarge superblock size. This transformation simplifies the control flow of the function allowing other optimizations to do better job. <p>Enabled with <samp><span class="option">-fprofile-use</span></samp>. - <br><dt><code>-funroll-loops</code><dd><a name="index-funroll_002dloops-890"></a>Unroll loops whose number of iterations can be determined at compile time or + <br><dt><code>-funroll-loops</code><dd><a name="index-funroll_002dloops-892"></a>Unroll loops whose number of iterations can be determined at compile time or upon entry to the loop. <samp><span class="option">-funroll-loops</span></samp> implies <samp><span class="option">-frerun-cse-after-loop</span></samp>, <samp><span class="option">-fweb</span></samp> and <samp><span class="option">-frename-registers</span></samp>. It also turns on complete loop peeling (i.e. complete removal of loops with @@ -1919,24 +1922,24 @@ or may not make it run faster. <p>Enabled with <samp><span class="option">-fprofile-use</span></samp>. - <br><dt><code>-funroll-all-loops</code><dd><a name="index-funroll_002dall_002dloops-891"></a>Unroll all loops, even if their number of iterations is uncertain when + <br><dt><code>-funroll-all-loops</code><dd><a name="index-funroll_002dall_002dloops-893"></a>Unroll all loops, even if their number of iterations is uncertain when the loop is entered. This usually makes programs run more slowly. <samp><span class="option">-funroll-all-loops</span></samp> implies the same options as <samp><span class="option">-funroll-loops</span></samp>. - <br><dt><code>-fpeel-loops</code><dd><a name="index-fpeel_002dloops-892"></a>Peels loops for which there is enough information that they do not + <br><dt><code>-fpeel-loops</code><dd><a name="index-fpeel_002dloops-894"></a>Peels loops for which there is enough information that they do not roll much (from profile feedback). It also turns on complete loop peeling (i.e. complete removal of loops with small constant number of iterations). <p>Enabled with <samp><span class="option">-fprofile-use</span></samp>. - <br><dt><code>-fmove-loop-invariants</code><dd><a name="index-fmove_002dloop_002dinvariants-893"></a>Enables the loop invariant motion pass in the RTL loop optimizer. Enabled + <br><dt><code>-fmove-loop-invariants</code><dd><a name="index-fmove_002dloop_002dinvariants-895"></a>Enables the loop invariant motion pass in the RTL loop optimizer. Enabled at level <samp><span class="option">-O1</span></samp> - <br><dt><code>-funswitch-loops</code><dd><a name="index-funswitch_002dloops-894"></a>Move branches with loop invariant conditions out of the loop, with duplicates + <br><dt><code>-funswitch-loops</code><dd><a name="index-funswitch_002dloops-896"></a>Move branches with loop invariant conditions out of the loop, with duplicates of the loop on both branches (modified according to result of the condition). - <br><dt><code>-ffunction-sections</code><dt><code>-fdata-sections</code><dd><a name="index-ffunction_002dsections-895"></a><a name="index-fdata_002dsections-896"></a>Place each function or data item into its own section in the output + <br><dt><code>-ffunction-sections</code><dt><code>-fdata-sections</code><dd><a name="index-ffunction_002dsections-897"></a><a name="index-fdata_002dsections-898"></a>Place each function or data item into its own section in the output file if the target supports arbitrary sections. The name of the function or the name of the data item determines the section's name in the output file. @@ -1954,28 +1957,28 @@ You will not be able to use <code>gprof</code> on all systems if you specify this option and you may have problems with debugging if you specify both this option and <samp><span class="option">-g</span></samp>. - <br><dt><code>-fbranch-target-load-optimize</code><dd><a name="index-fbranch_002dtarget_002dload_002doptimize-897"></a>Perform branch target register load optimization before prologue / epilogue + <br><dt><code>-fbranch-target-load-optimize</code><dd><a name="index-fbranch_002dtarget_002dload_002doptimize-899"></a>Perform branch target register load optimization before prologue / epilogue threading. The use of target registers can typically be exposed only during reload, thus hoisting loads out of loops and doing inter-block scheduling needs a separate optimization pass. - <br><dt><code>-fbranch-target-load-optimize2</code><dd><a name="index-fbranch_002dtarget_002dload_002doptimize2-898"></a>Perform branch target register load optimization after prologue / epilogue + <br><dt><code>-fbranch-target-load-optimize2</code><dd><a name="index-fbranch_002dtarget_002dload_002doptimize2-900"></a>Perform branch target register load optimization after prologue / epilogue threading. - <br><dt><code>-fbtr-bb-exclusive</code><dd><a name="index-fbtr_002dbb_002dexclusive-899"></a>When performing branch target register load optimization, don't reuse + <br><dt><code>-fbtr-bb-exclusive</code><dd><a name="index-fbtr_002dbb_002dexclusive-901"></a>When performing branch target register load optimization, don't reuse branch target registers in within any basic block. - <br><dt><code>-fstack-protector</code><dd><a name="index-fstack_002dprotector-900"></a>Emit extra code to check for buffer overflows, such as stack smashing + <br><dt><code>-fstack-protector</code><dd><a name="index-fstack_002dprotector-902"></a>Emit extra code to check for buffer overflows, such as stack smashing attacks. This is done by adding a guard variable to functions with vulnerable objects. This includes functions that call alloca, and functions with buffers larger than 8 bytes. The guards are initialized when a function is entered and then checked when the function exits. If a guard check fails, an error message is printed and the program exits. - <br><dt><code>-fstack-protector-all</code><dd><a name="index-fstack_002dprotector_002dall-901"></a>Like <samp><span class="option">-fstack-protector</span></samp> except that all functions are protected. + <br><dt><code>-fstack-protector-all</code><dd><a name="index-fstack_002dprotector_002dall-903"></a>Like <samp><span class="option">-fstack-protector</span></samp> except that all functions are protected. - <br><dt><code>-fsection-anchors</code><dd><a name="index-fsection_002danchors-902"></a>Try to reduce the number of symbolic address calculations by using + <br><dt><code>-fsection-anchors</code><dd><a name="index-fsection_002danchors-904"></a>Try to reduce the number of symbolic address calculations by using shared “anchor” symbols to address nearby objects. This transformation can help to reduce the number of GOT entries and GOT accesses on some targets. @@ -1998,7 +2001,7 @@ following pseudocode (which isn't valid C): </pre> <p>Not all targets support this option. - <br><dt><code>--param </code><var>name</var><code>=</code><var>value</var><dd><a name="index-param-903"></a>In some places, GCC uses various constants to control the amount of + <br><dt><code>--param </code><var>name</var><code>=</code><var>value</var><dd><a name="index-param-905"></a>In some places, GCC uses various constants to control the amount of optimization that is done. For example, GCC will not inline functions that contain more than a certain number of instructions. You can control some of these constants on the command line using the |