冗余标签消除
· Redundant branch elimination
冗余分支清除,所以可能出现由于对变量和分支的共同优化,导致某些条件分支明明成立却始终不会进入,一个大坑。
· Code hoisting
代码提升,很难理解的名字,其实就是它字面意思,就是把某些代码(变量定义)提到作用域的顶部去,可笑的是定义的顺序不变。也就是说,你定义了全局变量a=1,然后在某个函数里输出a,在下面定义局部变量a=2,最后输出的结果是乱码或者0,这取决于局部变量的默认初始化的值。在函数里真正被输出的,不是全局变量的a,而是局部变量的a,但是这个a只做了定义,初始化还在原位置。
· Peephole optimization
窥孔优化,通俗点说是局部优化,编译器对部分编译的代码,结合目标CPU的指令特点,做一些认为可以提高性能的优化。
· Some register content analysis and optimization
寄存器内容分析与优化
· Static clustering
静态聚类。将在同一模块内定义的静态变量和全局变量布置成使得在相同函数中访问的变量彼此紧密地存储。这使得编译器可以为多个访问使用相同的基指针。
· Common subexpression elimination
公共子表达式消去,在编程中会有很多地方使用相似的表达式,比如:
a=b+c+d;
e=b+c+f;
这个时候可以优化成这样:
tem=b+c;
a=tem+d;
e=tem+f;
4.High
最高程度的优化。具备以上所有的优化之外,还有:
· Instruction scheduling
指令调度,编译器根据自己的指令调度器去重新安排指令,使得处理器运行时出现的资源冲突情况更少,从而减少资源冲突引起的卡顿情况。
· Cross jumping
交叉跳跃
· Advanced register content analysis and optimization
高级寄存器内容分析与优化
· Loop unrolling
循环展开。有一些小的循环体,在编译时就能确定其循环次数,编译器会启发式得试探是否将这个循环体复制展开,展开循环体能减少程序的迭代次数,从而加快程序的运行速度,但会增加代码的大小。
编译器会从速度和代码大小之间去找一个平衡点,优化速度和优化代码大小那个配置就会影响这个优化。
· Function inlining
函数内联
如果一个比较小的函数在编译时已经能确定其准确的定义了,编译器会决定将其内联到调用者的内部,这样就会减小函数调用的开销。
· Code motion
代码移动。对循环不变的表达式和公共子表达式进行移动,避免其被再次评估。这个优化会减小程序代码体积,加快执行速度。
· Type-based alias analysis