本文转自http://eslxf.blog.51cto.com/918801/269490
BPF通过引入静态单赋值(SSA),结合冗余谓词消除和窥孔优化等编译技术,可以有效缩短CFG图的平均路径长度,实现对过滤器性能的优化。
静态单赋值(SSA)的基本概念
静态单赋值(static single assignment,SSA)是一种优化的编译器数据结构,使用SSA 中间表示形式有利于使用更多的编译器优化算法或者提高这些算法的效率。SSA形式要求每个变量只能被赋值一次,因此SSA形式可以有效地把程序中所操作的数值和这些数值存储的位置,这两者分开,这样就可以利用更多的编译器优化方法。如SSA形式能够帮助处理优化常量传播、部分冗余删除、条件常量复制、寄存器分配优化等问题。
优化方法
BPF中涉及虚拟机指令生成的相关优化见图10-4。
![](https://i-blog.csdnimg.cn/blog_migrate/529831066d303b90e29fbd62e970bd83.jpeg)
图10-
4 BPF+
中涉及虚拟机指令生成的相关优化组成
BPF将虚拟机指令生成器分为编译器和优化器2个独立的组成部分。首先编译器将高级语言形式的过滤要求转化为控制流图CFG,再将此控制流图转化为符合SSA中间表示形式的控制流图。最后优化器负责对SSA形式的控制流图进行优化,并生成最终的虚拟机指令。
编译器的输出是具有SSA中间表示形式的控制流图,这样的控制流图中每个节点都是由具备SSA形式的基本块组成,并且此控制流图有一个入口节点,2个终止节点。其中,每个基本块都以布尔判断作为最后一条指令,基本块的走向依赖于这个布尔判断的结果。SSA形式的控制流图有助于利用编译器的优化算法或者提高算法效率,但目前真正的优化工作还没有进行。紧接着的优化器完成对SSA形式的控制流图的优化工作。优化器充分利用SSA中间表示形式的优点,使用冗余谓词消除、窥孔优化等优化方法对SSA形式的控制流图进行优化工作。
冗余谓词消除
冗余谓词消除是用来消除SSA控制流图中冗余的基本块和基本块内部冗余的谓词判断。它依赖以下3种技术的结合完成优化工作:
1)部分冗余删除(partial redundancy elimination),移动控制流图中至少是部分冗余地计算到它们的最优计算点,并完全删除这些冗余计算。
2)谓词断言传播(predicate assertion propagation),对控制流图中的边使用全局数据流分析方法(global data-flow analysis)。它通过对谓词判断在穿越基本块时的修改情况进行分析,获得控制流图中边的断言集合,从而能够改变边的流向,进而旁路冗余的基本块。
3)静态谓词预测(Static Predicate Prediction),它可以使用第2步中边的断言集合信息并结合基本块中谓词判断的信息预测边的流向,旁路冗余的基本块。
在实际的优化过程中,每使用以上的一种技术后,可能会将新的可优化之处带给其它的优化技术。因此,在优化过程中需要结合使用这3种技术,并在优化结束前,不断重复这3种技术查找可优化之处。
窥孔优化
在冗余谓词消除的每次优化循环过程中,可以使用窥孔优化对每个基本块内部的指令进行优化。窥孔优化技术消除冗余取数和不必要的存数,延迟分支调度使流水线更通畅。它检查每个基本块内部的指令代码,用更快更短的序列代替它。引入窥孔优化还可以做到消除不可达代码、消除间接跳转、执行常数传播等优化工作。