达成定义分析 (Reaching Definitions Analysis,may analysis)

377 阅读2分钟

概述

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) 的意思是:

    1. 首先,考虑在基本块B生成的所有新定义(genB)
    1. 然后,考虑所有进入基本块B的定义(IN[B])
    1. 从这些进入的定义中,移除在B中被杀死(覆盖)的定义(killB)
    1. 最后,将步骤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]

参考资料