/*
* O1 的描述如下:
*/
优化对于一个大型函数来说,优化编译需要更多的时间和更多的内存。使用-O,编译器试图减少代码大小和执行时间,
而不执行任何占用大量编译时间的优化。
-fauto-inc-dec
将地址的递增或递减与内存访问相结合。对于没有支持此操作的指令的体系结构,总是跳过此过程。
在支持此功能的体系结构上,默认情况下在-O1及更高版本启用。
-fbranch-count-reg
该过程扫描在计数寄存器上使用"递减和分支"指令的机会,而不是递减寄存器的指令序列,将其与零进行比较,
然后根据结果进行分支。此选项仅在支持此类指令的体系结构上有意义,这些指令包括x86、PowerPC、IA-64和S/390。
请注意,-fno-branch-count-reg 选项不会从其他优化过程引入的生成指令流中删除减量和分支指令。
默认值是-O1及更高的-fbranch-count-reg,-Og除外。-fno-branch-count-reg, 禁用优化过程
-fcombine-stack-adjustments
跟踪堆栈调整(推送和弹出)和堆栈内存引用,然后尝试找到组合它们的方法。
默认情况下,在-O1及更高版本时启用。
-fcompare-elim
在寄存器分配和寄存器后分配指令拆分之后,识别计算处理器标志的算术指令,类似于基于该算术的比较运算。
如果可能,请取消显式比较操作。
此过程仅适用于在寄存器分配完成之前无法显式表示比较操作的某些目标。
在-O1、-O2、-O3和-Os级别启用。
-fcprop-registers
在寄存器分配和寄存器分配后指令拆分之后,执行复制传播传递,以尝试减少调度依赖性,偶尔消除复制。
在-O1、-O2、-O3和-Os级别启用。
-fdce
在RTL上执行死代码消除(DCE)。默认情况下,在-O1及更高版本时启用。
-fdefer-pop
对于必须在函数调用后弹出参数的机器,请始终在每个函数返回后立即弹出参数。在-O1及更高级别,-fdefer-pop是默认设置;
这允许编译器在堆栈上为几个函数调用积累参数,并一次弹出所有参数。
-fdelayed-branch
如果目标计算机支持,请尝试对指令进行重新排序,以利用延迟分支指令之后可用的指令槽。
在-O1、-O2、-O3、-Os级别启用,但在-Og级别不启用。
-fdse
在RTL上执行死存储消除(DSE)。默认情况下,在-O1及更高版本时启用。
-fforward-propagate
在RTL上执行前向传播传递。该过程尝试将两个指令组合起来,并检查结果是否可以简化。
如果循环展开处于活动状态,则执行两次循环,并在循环展开后安排第二次循环。
默认情况下,此选项在优化级别-O1、-O2、-O3和-Os时启用。
-fguess-branch-probability
GCC使用启发式方法来猜测分支概率,如果它们不是通过分析反馈提供的(-fprofile-arcs)。这些启发式方法是基于控制流图的。
如果__builtin_expect指定了一些分支概率,则在考虑__builtine_expect信息的情况下,
使用启发式方法来猜测控制流图其余部分的分支概率。启发式和__builtin_expect之间的交互可能很复杂,
在某些情况下,禁用启发式可能很有用,这样__builtin _expect的效果更容易理解。
也可以使用__builtin_expect_with_propability内置函数指定表达式的预期概率。
默认值为-fguess分支概率,级别为-O、-O2、-O3、-Os。 -fno-guess-branch-probability,不要使用启发式方法猜测分支概率。
-fif-conversion
尝试将条件跳转转换为无分支的等效跳转。这包括使用条件移动、最小、最大、设置标志和abs指令,
以及一些标准算法可以实现的技巧。在可用的芯片上使用条件执行是由-ff--conversion2控制的。
在-O1、-O2、-O3、-Os级别启用,但不使用-Og。
-fif-conversion2
使用条件执行(如果可用)将条件跳转转换为无分支等效项。
在-O1、-O2、-O3、-Os级别启用,但不使用-Og。
-finline-functions-called-once
考虑所有被调用一次以内联到其调用方的静态函数,即使它们没有被标记为内联。
如果对给定函数的调用是集成的,那么该函数本身就不会作为汇编代码输出。
在-O1、-O2、-O3和-Os级别启用,但不在-Og级别启用。
-fipa-modref
进行过程间模式/参考分析。这种优化分析了函数(被修改或引用的内存位置)的副作用,并实现了跨函数调用边界的更好优化。
默认情况下,此标志在-O1及更高级别时启用。
-fipa-profile
进行过程间剖面传播。仅从冷函数调用的函数被标记为冷函数。
还标识了一次执行的函数(如cold、noreturn、静态构造函数或析构函数)。
然后,对执行一次的冷函数和函数的无循环部分进行尺寸优化。
默认情况下,在-O1及更高版本时启用。
-fipa-pure-const
发现哪些函数是纯函数或常量函数。默认情况下,在-O1及更高版本时启用。
-fipa-reference
发现哪些静态变量不会脱离编译单元。默认情况下,在-O1及更高版本时启用。
-fipa-reference-addressable
发现只读、只读和不可寻址的静态变量。默认情况下,在-O1及更高版本时启用。
-fmerge-constants
尝试跨编译单元合并相同的常量(字符串常量和浮点常量)。
如果汇编程序和链接器支持此选项,则此选项是优化编译的默认选项。请使用-fno merge常量来禁止此行为。
在-O1、-O2、-O3和-Os级别启用。
-fmove-loop-invariants
在RTL循环优化器中启用循环不变运动过程。在-O1及更高级别启用,-Og除外。
-fmove-loop-stores
在GIMPLE循环优化器中启用循环存储运动过程。这会将不变存储移动到循环结束后,以换取在迭代过程中在寄存器中携带存储的值。
请注意,要使此选项具有效果,还必须启用ftree循环im。在-O1及更高级别启用,-Og除外。
-fomit-frame-pointer
在不需要框架指针的函数中省略框架指针。这避免了保存、设置和恢复帧指针的指令;在许多目标上,它还提供了一个额外的寄存器。
在某些目标上,此标志无效,因为标准调用序列始终使用帧指针,因此不能省略它。
请注意,-fno省略帧指针并不能保证在所有函数中都使用帧指针。一些目标总是在叶函数中省略帧指针。
默认情况下,在-O1及更高版本时启用。
-freorder-blocks
重新排列已编译函数中的基本块,以减少执行分支的数量并提高代码的局部性。
在-O1、-O2、-O3和-Os级别启用。
-fshrink-wrap
只在函数的需要部分之前发出函数序言,而不是在函数的顶部。默认情况下,此标志在-O及更高级别时启用。
-fshrink-wrap-separate
分别收缩包装序言和尾声的单独部分,以便这些部分只在需要时执行。
默认情况下,此选项处于启用状态,但除非同时启用-fshrink wrap并且目标支持此选项,否则此选项无效。
-fsplit-wide-types
当使用占用多个寄存器的类型时,例如在32位系统上使用long-long,请将寄存器拆分并独立分配。
这通常会为这些类型生成更好的代码,但可能会使调试更加困难。
在-O1、-O2、-O3和-Os级别启用。
-fssa-backprop
向定义链上游传播有关值使用的信息,以简化定义。例如,如果值的符号无关紧要,则此过程将取消符号操作。
默认情况下,该标志在-O1及更高级别时启用。
-fssa-phiopt
在SSA PHI节点上执行模式匹配以优化条件代码。默认情况下,此过程在-O1及更高版本(-Og除外)下启用。
-ftree-bit-ccp
在树上执行稀疏条件位常量传播,并传播指针对齐信息。此过程仅对局部标量变量进行操作,
默认情况下在-O1及更高版本(-Og除外)启用。它要求启用-ftree ccp。
-ftree-ccp
在树上执行稀疏条件常数传播(CCP)。此过程仅对局部标量变量进行操作,并且默认情况下在-O1及更高级别时启用。
-ftree-ch
在树上执行循环标头复制。这是有益的,因为它提高了代码运动优化的有效性。它还节省了一跳。
默认情况下,此标志在-O1及更高级别时启用。它没有为-Os启用,因为它通常会增加代码大小。
-ftree-coalesce-vars
在将程序从SSA表示转换出来的同时,尝试通过合并不同用户定义变量的版本来减少复制,而不仅仅是编译器临时变量。
这可能会严重限制调试使用-fno-var跟踪分配编译的优化程序的能力。
在否定形式中,此标志阻止用户变量的SSA合并。
如果启用了优化,则默认情况下会启用此选项,而在其他情况下,它几乎不会执行任何操作。
-ftree-copy-prop
在树上执行复制传播。此过程消除了不必要的复制操作。默认情况下,此标志在-O1及更高级别时启用。
-ftree-dce
对树执行死代码消除(DCE)。默认情况下,此标志在-O1及更高级别时启用。
-ftree-dominator-opts
基于支配树遍历执行各种简单的标量清理(常量/副本传播、冗余消除、范围传播和表达式简化)。
这也执行跳转线程(将跳转减少为跳转)。
默认情况下,此标志在-O1及更高级别时启用。
-ftree-dse
对树执行死存储消除(DSE)。死存储是指存储到一个内存位置,然后被另一个存储覆盖,而没有任何中间加载。
在这种情况下,可以删除以前的存储。默认情况下,此标志在-O1及更高级别时启用。
-ftree-forwprop
在树上执行正向传播。默认情况下,此标志在-O1及更高级别时启用。
-ftree-fre
对树执行完全冗余消除(FRE)。FRE和PRE之间的区别在于,FRE只考虑在导致冗余计算的所有路径上计算的表达式。
这种分析比PRE更快,尽管它暴露的冗余更少。默认情况下,此标志在-O1及更高级别时启用。
-ftree-phiprop
从树上的条件指针执行负载吊装。默认情况下,此过程在-O1及更高级别时启用。
-ftree-pta
对树执行函数局部点分析。默认情况下,除-Og外,此标志在-O1及更高级别时启用。
-ftree-scev-cprop
执行最终值替换。如果一个变量在循环中被修改,使得其退出循环时的值可以仅使用其初始值和循环迭代次数来确定,
那么只要计算足够便宜,就可以用这种计算来代替最终值的使用。
这减少了数据依赖性,并且可以允许进一步简化。默认情况下,在-O1及更高版本时启用。
-ftree-sink
在树上执行前向存储运动。默认情况下,此标志在-O1及更高级别时启用。
-ftree-slsr
对树木进行直线强度折减。这可以识别涉及乘法的相关表达式,并在可能的情况下用成本较低的计算来替换它们。
默认情况下,此选项在-O1及更高版本下启用。
-ftree-sra
执行总数的标量替换。此过程将结构引用替换为标量,以防止过早地将结构提交到内存。
默认情况下,除-Og外,此标志在-O1及更高级别时启用。
-ftree-ter
在SSA->正常阶段执行临时表达式替换。单次使用/单次定义临时变量在其使用位置被其定义表达式替换。
这导致了非GIMPLE代码,但为扩展器提供了更复杂的树,从而产生了更好的RTL生成。
默认情况下,此选项在-O1及更高版本下启用。
-funit-at-a-time
出于兼容性原因,保留了此选项-funit-at-a-time没有任何效果,而-fno-unit-at-a-time意味着-fno顶层重新排序和-fno部分锚点。
默认情况下启用。