定义问题是数据流分析中最基本的问题之一。给定一个包含变量定义和用途的控制流图,问题导致计算哪些变量定义可以达到特定用途。
例如考虑流程图:
____________
1:| x <- ... |
------------
| \
| __________
| 2:| x <- ... |
| -----------
| /
____________
3:| ... <- x |
------------
块 3 中变量 x 的使用可以通过块 1 或块 2 中的定义来实现。
计算哪些定义可以使用的算法是经典的数据流问题。使用龙编译器书(新版)中的符号,到达定义数据流问题如下:
域:定义集(例如 {x <- .., ...})
方向:前向
传递函数:fb(x) = gen(B) U (x - kill(B)) 其中 gen(B) 是块 B 生成的定义集并 kill(B) 块 B 杀死
的
定义集流向块是前代块定义的联合。
方程:OUT[B] = fb(IN[B]), IN[B] = U(P in pred)OUT[P]
初始化:OUT[B] = {}
但是,并非所有定义都相同。例如,块 1 中的定义可能永远无法在块 3 中使用,因为它可能会被块 2 中的定义杀死。另一方面,块 2 中的定义如果被执行,将保留其值直到它在块中使用3.
我想找到从定义到用法的任何路径上都没有杀死定义的用法的到达定义。我的问题是是否存在类似的数据流问题(可能是传播等)。在数据流分析方面如何解决。
我确实有一个可能的解决方案,但如果解决方案已经存在,我不想重新发明轮子。