概述
Reaching Definitions Analysis 是一种数据流分析技术,用于确定程序中某个变量定义对程序中其他点的可见性
Transfer Function:OUT[B] = genB U (IN[B] - killB)
OUT[B]: 这是分析中某基本块(或指令)B的输出集,表示从该基本块出发,哪些定义可以到达后续的基本块
genB: 这是由基本块B生成的定义集合。它包含了在B中直接为某个变量生成的所有定义
IN[B]: 这是进入基本块B的输入集,表示在执行到B之前,哪些定义是活跃的
killB: 这是在基本块B中被“杀死”的定义集合。如果一个定义在B中被另一个不同的定义覆盖了,那么它就被认为是被杀死了
转移函数 OUT[B] = genB U (IN[B] - killB) 的意思是:
-
- 首先,考虑在基本块B生成的所有新定义(genB)
-
- 然后,考虑所有进入基本块B的定义(IN[B])
-
- 从这些进入的定义中,移除在B中被杀死(覆盖)的定义(killB)
-
- 最后,将步骤1和步骤3的结果合并,得到基本块B的输出集(OUT[B]), 即从B出发到达后续基本块的定义集合
// 假设我们有以下数据结构
Set genB; // 在基本块B中生成的定义
Set IN[B]; // 进入基本块B的定义
Set killB; // 在基本块B中被杀死的定义
Set OUT[B]; // 从基本块B输出的定义
// 转移函数
OUT[B] = genB UNION (IN[B] DIFFERENCE killB);
Control Flow:IN[B] = Up a_predecesso_of_B Out[P]
IN[B]: 表示进入基本块B的活跃定义集合。即在执行基本块B之前,所有可能活跃的变量定义的集合
Out[P]: 表示从基本块P出发可以到达后续基本块的活跃定义集合
a_predecessor_of_B: 指的是基本块B的所有前驱(即所有可以跳转到B的基本块)
等式的意思,基本块B的入口定义集合(IN[B]) 是由基本所有前驱基本块P的出口定义集合(Out[p]) 合并而成的。换句话,为了计算基本块B的入口定义,需要查看所有能够到达B的基本块P,并取它们的Out[P]集合的并集
// 假设基本块B有一个或多个前驱基本块P1, P2, ...
IN[B] = Union(Out[P1], Out[P2], ...)
// 在迭代算法中,这可以表示为:
for each block B in CFG
for each predecessor P of B
IN[B] = IN[B] U Out[P]