19.1 Optimization Feature Summary
Each big O optimization is equal to specific options. Lists of
currently-supported optimization options are show below. “No” versions of options may be
available, for example -fdefer-pop and
-fno-defer-pop.
These features are subject to change.
| Enabled/Disabled | f<option> | O1 enabled | O2 enabled | O3 enabled | Os enabled | |
|---|---|---|---|---|---|---|
| O1 optimization | ||||||
| defer pop | Enabled | fdefer-pop | Yes | Yes | Yes | Yes |
| guess branch probability | Enabled | fguess-branch-probability | Yes | Yes | Yes | Yes |
| cprop registers | Enabled | fcprop-registers | Yes | Yes | Yes | Yes |
| forward propogate | Enabled | fforward-propagate | Yes | Yes | Yes | Yes |
| if conversion | Enabled | fif-conversion | Yes | Yes | Yes | Yes |
| if conversion2 | Enabled | fif-conversion2 | Yes | Yes | Yes | Yes |
| ipa pure const | Enabled | fipa-pure-const | Yes | Yes | Yes | Yes |
| ipa reference | Enabled | fipa-reference | Yes | Yes | Yes | Yes |
| ipa profile | Enabled | fipa-profile | Yes | Yes | Yes | Yes |
| merge constants | Enabled | fmerge-constants | Yes | Yes | Yes | Yes |
| reorder blocks | Enabled | freorder-blocks | Yes | Yes | Yes | Yes |
| shrink wrap | Enabled | fshrink-wrap | Yes | Yes | Yes | Yes |
| split wide types | Enabled, Disabled for Os, O1 | fsplit-wide-types | No (XC32 disables) | Yes | Yes | No (XC32 disables) |
| tree ccp | Enabled | ftree-ccp | Yes | Yes | Yes | Yes |
| tree bit ccp | Enabled | ftree-bit-ccp | Yes | Yes | Yes | Yes |
| tree coalesce vars | Enabled | ftree-coalesce-vars | Yes | Yes | Yes | Yes |
| tree dce | Enabled | ftree-dce | Yes | Yes | Yes | Yes |
| tree dominator opts | Enabled | ftree-dominator-opts | Yes | Yes | Yes | Yes |
| tree dse | Enabled | ftree-dse | Yes | Yes | Yes | Yes |
| tree ter | Enabled | ftree-ter | Yes | Yes | Yes | Yes |
| tree sra | Enabled | ftree-sra | Yes | Yes | Yes | Yes |
| tree fre | Enabled | ftree-fre | Yes | Yes | Yes | Yes |
| tree copy prop | Enabled | ftree-copy-prop | Yes | Yes | Yes | Yes |
| tree sink | Enabled | ftree-sink | Yes | Yes | Yes | Yes |
| tree ch | Enabled | ftree-ch | Yes | Yes | Yes | Yes |
| combine stack adjustments | Enabled | fcombine-stack-adjustments | Yes | Yes | Yes | Yes |
| compare elim | Enabled | fcompare-elim | Yes | Yes | Yes | Yes |
| tree slsr | Enabled | ftree-slsr | Yes | Yes | Yes | Yes |
| branch count reg | Enabled | fbranch-count-reg | Yes | Yes | Yes | Yes |
| move loop invariants | Enabled, Disabled for Os | fmove-loop-invariants | Yes | Yes | Yes | No (XC32 disables) |
| tree pta | Enabled | ftree-pta | Yes | Yes | Yes | Yes |
| ssa phiopt | Enabled | fssa-phiopt | Yes | Yes | Yes | Yes |
| tree builtin call dce | Enabled | ftree-builtin-call-dce | Yes | Yes | Yes | Yes |
| omit frame pointer | Enabled | fomit-frame-pointer | Yes | Yes | Yes | Yes |
| O2 optimization | ||||||
| inline small functions | Enabled, Disabled for Os, O1 | finline-small-functions | No | Yes | Yes | No (XC32 disables) |
| indirect inlining | Enabled, Disabled for Os, O1 | findirect-inlining | No | Yes | Yes | No (XC32 disables) |
| partial inlining | Enabled | fpartial-inlining | No | Yes | Yes | Yes |
| thread jumps | Enabled | fthread-jumps | No | Yes | Yes | Yes |
| crossjumping | Enabled | fcrossjumping | No | Yes | Yes | Yes |
| optimize sibling calls | Enabled | foptimize-sibling-calls | No | Yes | Yes | Yes |
| cse follow jumps | Enabled | fcse-follow-jumps | No | Yes | Yes | Yes |
| gcse | Enabled | fgcse | No | Yes | Yes | Yes |
| expensive optimizations | Enabled | fexpensive-optimizations | No | Yes | Yes | Yes |
| rerun cse after loop | Enabled | frerun-cse-after-loop | No | Yes | Yes | Yes |
| caller saves | Enabled | fcaller-saves | No | Yes | Yes | Yes |
| peephole2 | Enabled | fpeephole2 | No | Yes | Yes | Yes |
| schedule insns | Disabled, except -merrata | fschedule-insns | No (XC32 disables) | No (XC32 disables) | No (XC32 disables) | No (XC32 disables) |
| schedule insns2 | Disabled, except -merrata | fschedule-insns2 | No (XC32 disables) | No (XC32 disables) | No (XC32 disables) | No (XC32 disables) |
| strict aliasing | Enabled | fstrict-aliasing | No | Yes | Yes | Yes |
| reorder blocks algorithm | Enabled, Disabled for Os (by default in gcc) | freorder-blocks-algorithm= | No | Yes | Yes | No |
| reorder functions | Enabled | freorder-functions | No | Yes | Yes | Yes |
| tree vrp | Enabled | ftree-vrp | No | Yes | Yes | Yes |
| code hoisting | Enabled | fcode-hoisting | No | Yes | Yes | Yes |
| tree pre | Enabled | ftree-pre | No | Yes | Yes | Yes |
| tree switch conversion | Enabled, Disabled for Os, O1 | ftree-switch-conversion | No | Yes | Yes | No (XC32 disables) |
| ipa cp | Enabled | fipa-cp | No | Yes | Yes | Yes |
| ipa bit cp | Enabled | fipa-bit-cp | No | Yes | Yes | Yes |
| ipa vrp | Enabled | fipa-vrp | No | Yes | Yes | Yes |
| devirtualize | Enabled | fdevirtualize | No | Yes | Yes | Yes |
| devirtualize speculatively | Enabled | fdevirtualize-speculatively | No | Yes | Yes | Yes |
| ipa sra | Enabled | fipa-sra | No | Yes | Yes | Yes |
| align loops | Enabled | falign-loops | No | Yes | Yes | Yes |
| align jumps | Enabled | falign-jumps | No | Yes | Yes | Yes |
| align labels | Enabled | falign-labels | No | Yes | Yes | Yes |
| align functions | Enabled | falign-functions | No | Yes | Yes | Yes |
| tree tail merge | Enabled | ftree-tail-merge | No | Yes | Yes | Yes |
| vect cost model | Enabled | fvect-cost-model | No | Yes | Yes | Yes |
| optimize strlen | Enabled, Disabled for Os (by default in gcc) | foptimize-strlen | No | Yes | Yes | No |
| hoist adjacent loads | Enabled | fhoist-adjacent-loads | No | Yes | Yes | Yes |
| ipa icf | Enabled | fipa-icf | No | Yes | Yes | Yes |
| isolate erroneous paths dereference | Enabled | fisolate-erroneous-paths-dereference | No | Yes | Yes | Yes |
| ipa ra | Enabled | fipa-ra | No | Yes | Yes | Yes |
| lra remat | Enabled | flra-remat | No | Yes | Yes | Yes |
| store merging | Enabled | fstore-merging | No | Yes | Yes | Yes |
| O3 optimization | ||||||
| tree loop distribute patterns | Enabled | ftree-loop-distribute-patterns | No | No | Yes | Yes |
| predictive commoning | Enabled | fpredictive-commoning | No | No | Yes | No |
| split paths | Enabled | fsplit-paths | No | No | Yes | No |
| inline functions | Enabled, Disabled for Os, O1 | finline-functions | No | No | Yes | No |
| inline functions called once | Enabled, Disabled for Os, O1 | finline-functions-called-once | No | No | Yes | No |
| split loops | Enabled | fsplit-loops | No | No | Yes | No |
| unswitch loops | Enabled | funswitch-loops | No | No | Yes | No |
| loop unroll and jam | Enabled | floop-unroll-and-jam | No | No | Yes | No |
| gcse after reload | Enabled | fgcse-after-reload | No | No | Yes | No |
| tree loop vectorize | Disabled | ftree-loop-vectorize | No | No | No | No |
| tree slp vectorize | Disabled | ftree-slp-vectorize | No | No | No | No |
| vect cost model | Enabled | fvect-cost-model | No | No | Yes | No |
| ipa cp clone | Enabled | fipa-cp-clone | No | No | Yes | No |
| tree partial pre | Enabled | ftree-partial-pre | No | No | Yes | No |
| peel loops | Enabled | fpeel-loops | No | No | Yes | No |
