关于Dataflow Analysis中不同节点遍历顺序的Iterative Solver结果相等的证明

以下以may analysis为例,must analysis基本同理,区别主要在于是$\sqsupseteq$还是$\sqsubseteq$。

注意

以下谈到的所有$F$,首先要满足是safe的,包括transfer function设计合理并且每一轮中每个node都需要(至少)被visit过一次。 注意这一点的意义在于你可以说我有一个$F$,transfer function或者每轮遍历内容为空,那么bottom就是它的最小不动点,但这显然不是我们想要的。

记号

代表整个程序状态的完全格$L$,完全格的信息不仅有所有OUT, 还有所有IN;每一轮对$L$的映射记为$F: L \rightarrow L$。 分别代表两个不同轮内遍历顺序的$F_1$, $F_2$。

对于visit到一个node时发生的事情,有以下步骤:merge所有前驱的out到in,然后OUT = transfer(IN)。

由于merge函数具有可交换性,所以visit到一个node时merge的顺序对于遍历完一个node之后的结果无影响。(也可以认为遍历一个node是一个原子操作)

所以任意取一个每一次merge动作和transfer动作也可以看成是一个原子操作$f: L \rightarrow L$。

所以一个有k个前驱的node $i$被visit的动作的形式化写法可以写成下面形式(记visit前的程序状态格为$L_o$, visit之后为$L_r$):

$L_r = f_{transfer_i} \circ f_{merge_{i,k}} \circ … \circ f_{merge_{i,1}} (L_o)$,复合函数记为$L_r = f_{node_i} (L_o)$

其中的$f_{transfer_i}$代表transfer,$f_{merge_{i,j}}$代表前驱j的OUT merge到当前node的IN中。

记号部分整理完毕,现在开始正式的证明。

Iterative Solver最小不动点相等的证明

在iterative solver中,一轮迭代分解为对node以某个顺序遍历,所以对于一个有n个node的CFG的第$i$轮遍历,可以写成

$L_{i} = f_{node_n} \circ … \circ f_{node_1} (L_{i-1})$,$F$即为复合函数$f_{node_n} \circ … \circ f_{node_1}$, $L_{i} = F(L_{i-1})$

整理一下,$F = f_{node_n} \circ … \circ f_{node_1}$ $= (f_{transfer_n} \circ f_{merge_{n,k}} \circ … \circ f_{merge_{n,1}}) \circ … \circ (f_{transfer_1} \circ f_{merge_{1,k}} \circ … \circ f_{merge_{1,1}})$ $= f_{transfer_n} \circ f_{merge_{n,k}} \circ … \circ f_{merge_{n,1}} \circ … \circ f_{transfer_1} \circ f_{merge_{1,k}} \circ … \circ f_{merge_{1,1}}$

首先,上面出现的每一个映射,无论是$F$还是某个原子函数$f$,都是在$L$上的单调函数。

对于$F_1$的任一不动点$p_1$,有$p_1 = F_1(p_1) = f_{transfer_n} \circ f_{merge_{n,k}} \circ … \circ f_{merge_{n,1}} \circ … \circ f_{transfer_1} \circ f_{merge_{1,k}} \circ … \circ f_{merge_{1,1}}(p_1)$,

根据原子函数的单调性可得,$p_1$ apply每一个原子函数$f$的结果都是$p_1$。

对于另一个顺序遍历的函数$F_2$,他也是由$F_1$中的原子函数$f$以不同顺序构成,即

$F_2 = f_s \circ … \circ f_1$,

原子函数存在一个一一映射:

${f_1, …, f_s} \rightarrow \cup_{i \in {1, …, n}} ({f_{transfer_i}} \cup {f_{merge_{i, k}}, …, f_{merge_{i, 1}}})$

下面的记法与上面等价:

${f_1, …, f_s} \rightarrow \cup_{i \in {1, …, n}} ({f_{transfer_i}} \cup (\cup_{k \in 节点i的前驱节点的标号集合} {f_{merge_{i, k}}}))$

所以$p_1 = F_2(p_1)$,$p_1$是$F_2$的不动点。

同理,$F_2$的任意一个不动点$p_2$是$F_1$的不动点。

所以两个$F$的不动点集合相等,二者有同一个最小不动点。

Q.E.D.

WorkList Solver与Iterative Solver最小不动点相等的证明

TODO.

暂时还没时间细想,但是可能是可以证明对于一个类似Iterative Solver,但每一轮中遍历顺序不同的Solver,只要是到达不动点,那么这个不动点就是所有Iterative Solver的不动点。 然后证明WorkList Solver由于相当于去掉了上述Solver的遍历序列中对$L$没有影响的$f_{node_i}$而得到的遍历序列,从而最后结果也是最小不动点。

对WorkList算法的可能优化

TODO.


关于Dataflow Analysis中不同节点遍历顺序的Iterative Solver结果相等的证明
http://example.com/2022/11/15/Iterative-Solver-proof/
作者
Bluesbreaker45
发布于
2022年11月15日
许可协议