循环优化技术详解
1. 可归约流图与支配节点
在程序的控制流图中,由于程序员可以任意安排函数,函数式程序的尾调用结构产生的流图有时是不可归约的。可归约流图具有很多优点,许多数据流分析在可归约流图上能非常高效地完成。与使用定点迭代(“持续执行赋值操作直到没有变化”)不同,我们可以确定计算赋值的顺序,并提前计算出需要进行多少次赋值,也就是说,永远不需要检查是否有变化。
每个控制流图都必须有一个没有前驱的起始节点 (s_0),程序(或过程)的执行假定从这里开始。如果从 (s_0) 到节点 (n) 的每条有向边路径都必须经过节点 (d),则称节点 (d) 支配节点 (n),并且每个节点都支配自身。
下面是寻找支配节点的算法:
设 (D[n]) 是支配节点 (n) 的节点集合,则有:
- (D[s_0] = {s_0})
- 对于 (n \neq s_0),(D[n] = {n} \cup \left(\bigcap_{p\in pred[n]} D[p]\right))
这些联立方程通常可以通过迭代求解,将每个方程视为赋值语句。不过,在这种情况下,对于 (n \neq s_0) 的每个集合 (D[n]) 必须初始化为包含图中的所有节点,因为每个赋值 (D[n] \leftarrow {n} \cup \cdots) 会使 (D[n]) 变小(或不变),而不是变大。该算法可以通过按准拓扑顺序对集合赋值进行排序来提高效率,即根据图的深度优先搜索(算法 17.5)。
在连通图中,如果 (d) 支配 (n),且 (e) 支配 (n),那么要么 (d) 支配 (e),要么 (e) 支配 (d)。这意味着每个节点 (n) 最多有一
超级会员免费看
订阅专栏 解锁全文
8万+

被折叠的 条评论
为什么被折叠?



