1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > gcc-4.8.5 优化选项

gcc-4.8.5 优化选项

时间:2022-06-17 11:55:28

相关推荐

gcc-4.8.5 优化选项

名词解释:

RTL:real time language

__builtin_expect:这个指令的作用是允许程序员将最有可能执行的分支告诉编译器。这个指令的写法为:__builtin_expect(EXP, N)。意思是:EXP==N的概率很大。参考

死存储(Dead Store):A dead store is a store into a memory location that is later overwritten by another store without any intervening loads. 死存储区是指存储到某个内存位置的存储区,该存储区随后会被另一个存储区覆盖,其间没有任何加载。

FREfull redundancy elimination

PREpartial redundancy elimination

CSE:common subexpression elimination

-O0

-O1

-fauto-inc-dec:将地址的递增或递减与内存访问相结合。

-fcompare-elim:在寄存器分配和后寄存器分配指令拆分之后,识别计算处理器标记为类似于基于该算法的比较操作的算术指令。如果可能,消除显式比较操作。

-fcprop-registers:在进行寄存器分配和后寄存器分配指令拆分后,执行复制传播传递,以尽量减少调度依赖关系,并偶尔消除复制。

-fdce:在RTL上执行死代码消除(DCE)。

-fdefer-pop:该选项决定编译器是否总是在函数返回时立即向每个函数调用弹出参数。对于必须在函数调用后弹出参数的处理器,编译器通常让多个函数调用的参数在堆栈中累积,然后一次弹出所有参数。

-fdelayed-branch:如果目标机器支持,尝试重新排序指令,以利用延迟转移指令后可用的指令槽。

-fdse:在RTL上执行死存储消除(DSE)。

-fguess-branch-probability:使用启发式猜测分支概率。GCC使用启发式来猜测分支概率,如果它们不是由分析反馈(-fprofile-arcs)提供的。这些启发式算法基于控制流图。如果某些分支概率由’ __builtin_expect ‘指定,则使用启发式算法来猜测控制流图其余部分的分支概率,同时考虑’ __builtin_expect ’ 信息。启发式和’ __builtin_expect ‘之间的交互可能很复杂,在某些情况下,禁用启发式可能很有用,这样’ __builtin_expect '的效果更容易理解。

-fif-conversion2:使用条件执行(在可能的情况下)将条件跳转转换为不需要分支的等价操作。

-fif-conversion:尝试将条件跳转转换为不需要分支的等价物。这包括使用条件移动、min、max、set flags和abs指令,以及一些标准算术可行的技巧。条件执行在芯片上的使用是由if- converversion2控制的。

-fipa-pure-const:发现哪些函数是纯函数(参考)或常量函数。

-fipa-profile:执行过程间 profile 传播。仅从cold函数调用的函数被标记为cold。同时也标识了只执行一次的函数(如cold、noreturn、静态构造函数或析构函数)。然后对冷函数和循环次数较少的函数进行大小优化。

-fipa-reference:发现哪些静态变量没有逃出编译单元。

-fmerge-constants:尝试跨编译单元合并相同的常量(字符串常量和浮点常量)。

-fsplit-wide-types:当使用占用多个寄存器的类型时,例如32 bit的long long,将寄存器分开并独立分配它们。这通常会为这些类型生成更好的代码,但可能会使调试更加困难。

-ftree-bit-ccp:对树进行稀疏条件比特常数传播,传播指针对齐信息。此传递只对局部标量变量进行操作,

-ftree-builtin-call-dce: 对可能设置errno但没有副作用的内置函数调用执行条件死代码消除(DCE)。

-ftree-ccp:在树上执行稀疏条件常数传播(CCP)。此传递只作用于局部标量变量。

-ftree-ch:对树执行循环头复制。这是有益的,因为它提高了代码移动优化的有效性。它还节省了一次跳跃。

-ftree-copyrename:对树执行复制重命名。这种方式会将编译器临时变量重命名为复制位置的其他变量,通常会导致变量的名称更接近于原始变量。

-ftree-dce:在树上执行死代码消除(DCE)。

-ftree-dominator-opts:根据支配树遍历执行各种简单标量清理(常量/复制传播、冗余消除、范围传播和表达式简化)。这也会执行跳转线程(将跳转减少为跳转)。

-ftree-dse:在树上执行死存储消除(DSE)。死存储区是指存储到某个内存位置的存储区,该存储区随后会被另一个存储区覆盖,其间没有任何加载。在这种情况下,可以删除先前的存储。

-ftree-forwprop:在树上执行正向传播。

-ftree-fre:在树上执行完全冗余消除(FRE)。FRE和PRE的区别在于,FRE只考虑在导致冗余计算的所有路径上计算的表达式。这种分析比PRE更快,尽管它暴露的冗余更少。

-ftree-phiprop:执行从树上的条件指针提升负载。

-ftree-slsr:对树木进行直线强度降低。它识别出涉及乘法的相关表达式,并在可能的情况下用较低成本的计算替换它们。

-ftree-sra:对集合进行标量置换。此传递将结构引用替换为标量,以防止过早地将结构提交到内存。

-ftree-pta:对树执行函数局部点到分析。

-ftree-ter:在SSA->正常阶段进行临时表达式替换。Single use/ Single def临时表在它们的使用位置被它们的定义表达式替换。这将产生非gimple代码,但为扩展器提供了更复杂的树,从而产生更好的RTL。

-funit-at-a-time:出于兼容性考虑,保留了该选项。-fun -at-a-time不起作用,而-fno-unit-at-a-time意味着-fno-top -reorder和-fno-section-anchors。

-O2

-fthread-jumps:执行优化,检查跳转是否跳转到第一个跳转所包含的另一个比较的位置。如果是,则根据已知条件是真还是假,将第一个分支重定向到第二个分支的目的地或紧跟着它的点。

-falign-functions:将函数的开始对齐到下一个大于n的2的幂,跳跃到n个字节。

-falign-jumps:将分支目标对齐到2的幂边界,对于只能通过跳跃(跳跃到n个字节,如-falign-functions)来达到目标的分支目标。

-falign-loops:将循环对齐到2的幂次边界,跳跃到n个字节,如-falign-functions。如果循环被多次执行,这就弥补了任何虚拟操作的执行。

-falign-labels:将所有分支目标对齐到2的幂边界,跳跃到n个字节,如-falign-functions。这个选项很容易使代码变慢,因为它必须为在通常的代码流中到达分支目标时插入虚拟操作。

-fcaller-saves:通过发出额外的指令来保存和恢复这些调用周围的寄存器,允许将值分配给被函数调用破坏的寄存器。只有当这样做能够产生更好的代码时,才会进行这样的分配。

-fcrossjumping:执行cross-jumping转换。这种转换统一了等价的代码并节省了代码大小。得到的代码可能比没有交叉跳转的代码执行得更好,也可能不更好。

-fcse-follow-jumps:在公共子表达式消除(CSE)中,当跳转的目标没有被任何其他路径到达时,扫描跳转指令。例如,当CSE遇到带有else子句的if语句时,当测试的条件为false时,CSE跟随跳转。

-fcse-skip-blocks:这类似于-fcse-follow- hops,但是使CSE跟随有条件地跳过块的跳转。当CSE遇到没有else子句的简单if语句时,-fcse-skip-blocks将使CSE跟随if语句体的跳转。

-fdelete-null-pointer-checks:假设程序不能安全地对空指针进行解引用,并且没有代码或数据元素驻留在那里。这允许在所有优化级别上进行简单的常数折叠优化。此外,GCC中的其他优化通道使用这个标志来控制全局数据流分析,从而消除对空指针的无用检查;它们假设如果一个指针在它已经被解引用之后被检查,它就不能为空。

-fdevirtualize:尝试将对虚函数的调用转换为直接调用。这在过程内部和过程间作为间接内联(-findirect-内联)和过程间常量传播(-fipa-cp)的一部分进行。

-fexpensive-optimizations执行一些相对昂贵的小优化.

-fgcse:执行全局公共子表达式消除传递。此传递还执行全局常量和复制传播。注意:当使用GCC扩展计算goto编译程序时,如果你通过在命令行中添加-fno-gcse来禁用全局公共子表达式消除传递,你可能会获得更好的运行时性能。

-fgcse-lm:当启用-fgcse-lm时,全局公共子表达式消除尝试将仅被store杀死的加载移动到自身。这允许将包含load/store序列的循环更改为循环外部的load,以及循环内部的copy/store。

-fhoist-adjacent-loads:推测地从if-then-else的两个分支提升负载,如果负载来自同一结构中相邻的位置,并且目标体系结构有一个条件移动指令。

-finline-small-functions:当函数体比预期的函数调用代码小时,将函数集成到调用者中(这样程序的整体大小就会变小)。编译器启发式地决定哪些函数足够简单,值得以这种方式集成。这种内联适用于所有函数,甚至那些未声明为内联的函数。

-findirect-inlining:间接调用内联,由于以前的内联,在编译时被发现是已知的。只有当内联本身被-finline-functions或-finline-small-functions选项打开时,这个选项才会有效果。

-fipa-sra:执行过程间的标量替换聚合,删除未使用的参数,并将通过引用传递的参数替换为通过值传递的参数。

-foptimize-sibling-calls:优化 sibling recursive calls 和tail recursive calls。

-fpartial-inlining:函数的部分内联。只有当内联本身被-finline-functions或-finline-small-functions选项打开时,这个选项才会有效果。

-fpeephole2:允许machine-specific peephole optimizations。

-fregmove:尝试在move指令和其他简单指令的操作数中重新分配寄存器号,以便最大限度地增加寄存器绑定的数量。这在使用双操作数指令的机器上特别有用。

-freorder-blocks:在已编译函数中重新排序基本块,以减少执行分支的数量并改善代码局部性。

-freorder-functions:在目标文件中重新排序函数,以改善代码的局部性。这是通过使用特殊的subsections .text实现的。hot用于最频繁执行的函数和。text。不太可能执行的函数。重新排序是由链接器完成的,因此对象文件格式必须支持命名节,链接器必须以合理的方式放置它们。此外,配置文件反馈必须可用,以使这一选择有效。

-frerun-cse-after-loop:执行循环优化后,重新运行公共子表达式消除。

-fsched-interblock:跨基本块安排指令

-fsched-spec:允许非加载指令的投机动作。在注册表分配之前进行调度时,这通常是默认启用的,

-fschedule-insns:如果目标机器支持,请尝试重新排列指令,以消除由于所需数据不可用而导致的执行停顿。这有助于那些具有慢浮点或内存加载指令的机器,允许在需要加载或浮点指令的结果之前发出其他指令。

-fschedule-insns2:类似于-fschedule-insns,但是请求在完成寄存器分配后进行额外的指令调度。这在寄存器数量相对较少且内存加载指令需要超过一个周期的机器上特别有用。

-fstrict-aliasing:允许编译器假定适用于所编译语言的最严格的别名规则。

-fstrict-overflow:允许编译器假设严格的符号溢出规则,这取决于所编译的语言。

-ftree-switch-conversion:在从标量数组到初始化的开关中执行简单初始化转换。

-ftree-tail-merge:寻找相同的代码序列。找到后,用跳转到另一个的方式替换其中一个。这种优化被称为尾部合并或交叉跳跃。

-ftree-pre:对树执行部分冗余消除(PRE)。

-ftree-vrp:在树上执行值范围传播。这类似于常量传播通道,但传播的不是值,而是值的范围。这允许优化器删除不必要的范围检查,如数组绑定检查和空指针检查。

-O3

-finline-functions:考虑所有内联函数,即使它们不是内联声明的。编译器启发式地决定哪些函数值得以这种方式集成。 如果集成了对给定函数的所有调用,并且该函数声明为静态的,那么该函数通常不会以其本身的汇编代码的形式输出。

-funswitch-loops:将具有循环不变条件的分支移出循环,在两个分支上使用循环的副本(根据条件的结果修改)。

-fpredictive-commoning:执行预测性的公共优化,即重用在之前循环迭代中执行的计算(特别是内存负载和存储)。

-fgcse-after-reload:当启用-fgcse-after-reload时,重新加载后会执行一个冗余的负载消除通道。此传递的目的是清理多余的溢出。

-ftree-vectorize:对树执行循环矢量化。

-fvect-cost-model:启用成本模型进行矢量化。

-ftree-partial-pre:使部分冗余消除(PRE)更加积极。

-fipa-cp-clone options

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。