0%

gcc 各个编译优化等级下不同的编译优化选项

GCC 优化级别

  • -O<number>
  • -Os
  • -Ofast
  • -Og

-On是 gcc 为了一般人方便而做的设定,根据 n 值大小包含预设标准由低到高的一些优化选项,均为 -fxxx(xxx 为优化项),但注意,即使是最高优化选项 -O3,也不是包含所有的 -f 选项,这只是为大多数人的使用方便而预设的。

通过如下命令查看

$ gcc -Q O2 --help=optimizers

-O -O1

这两个命令的效果是一样的,目的都是在不影响编译速度的前提下,尽量采用一些优化算法降低代码大小和可执行代码的运行速度。并开启如下的优化选项:

-fauto-inc-dec
-fbranch-count-reg
-fcombine-stack-adjustments
-fcompare-elim
-fcprop-registers
-fdce
-fdefer-pop
-fdelayed-branch
-fdse
-fforward-propagate
-fguess-branch-probability
-fif-conversion2
-fif-conversion
-finline-functions-called-once
-fipa-pure-const
-fipa-profile
-fipa-reference
-fmerge-constants
-fmove-loop-invariants
-freorder-blocks
-fshrink-wrap
-fshrink-wrap-separate
-fsplit-wide-types
-fssa-backprop
-fssa-phiopt
-fstore-merging
-ftree-bit-ccp
-ftree-ccp
-ftree-ch
-ftree-coalesce-vars
-ftree-copy-prop
-ftree-dce
-ftree-dominator-opts
-ftree-dse
-ftree-forwprop
-ftree-fre
-ftree-phiprop
-ftree-sink
-ftree-slsr
-ftree-sra
-ftree-pta
-ftree-ter
-funit-at-a-time

-O2

该优化选项会牺牲部分编译速度,除了执行 -O1 所执行的所有优化之外,还会采用几乎所有的目标配置支持的优化算法,用以提高目标代码的运行速度。

-fthread-jumps
-falign-functions  -falign-jumps
-falign-loops  -falign-labels
-fcaller-saves
-fcrossjumping
-fcse-follow-jumps  -fcse-skip-blocks
-fdelete-null-pointer-checks
-fdevirtualize -fdevirtualize-speculatively
-fexpensive-optimizations
-fgcse  -fgcse-lm
-fhoist-adjacent-loads
-finline-small-functions
-findirect-inlining
-fipa-cp
-fipa-cp-alignment
-fipa-bit-cp
-fipa-sra
-fipa-icf
-fisolate-erroneous-paths-dereference
-flra-remat
-foptimize-sibling-calls
-foptimize-strlen
-fpartial-inlining
-fpeephole2
-freorder-blocks-algorithm=stc
-freorder-blocks-and-partition -freorder-functions
-frerun-cse-after-loop
-fsched-interblock  -fsched-spec
-fschedule-insns  -fschedule-insns2
-fstrict-aliasing -fstrict-overflow
-ftree-builtin-call-dce
-ftree-switch-conversion -ftree-tail-merge
-fcode-hoisting
-ftree-pre
-ftree-vrp
-fipa-ra

-O3

该选项除了执行 -O2 所有的优化选项之外,一般都是采取很多向量化算法,提高代码的并行执行程度,利用现代 CPU 中的流水线,Cache 等。

-finline-functions      // 采用一些启发式算法对函数进行内联
-funswitch-loops        // 执行循环 unswitch 变换
-fpredictive-commoning  //
-fgcse-after-reload     // 执行全局的共同子表达式消除
-ftree-loop-vectorize   //
-ftree-loop-distribute-patterns
-fsplit-paths
-ftree-slp-vectorize
-fvect-cost-model
-ftree-partial-pre
-fpeel-loops
-fipa-cp-clone options

这个选项会提高执行代码的大小,会降低目标代码的执行时间。

-Os

这个优化标识和 -O3 有异曲同工之妙,当然两者的目标不一样,-O3 的目标是宁愿增加目标代码的大小,也要拼命的提高运行速度,但是这个选项是在 -O2 的基础之上,尽量的降低目标代码的大小,这对于存储容量很小的设备来说非常重要。为了降低目标代码大小,会禁用下列优化选项,一般就是压缩内存中的对齐空白 (alignment padding)

-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-freorder-blocks
-freorder-blocks-algorithm=stc
-freorder-blocks-and-partition
-fprefetch-loop-arrays

Ref

  1. gcc 优化选项 -O1 -O2 -O3 -Os 优先级,-fomit-frame-pointer
  2. GCC 中 -O1 -O2 -O3 优化的原理是什么?
  3. Options That Control Optimization
  4. GCC编译优化和调试选项