excerpt
应用
考虑下面的三地址码r
a
b
和 c
放在寄存器 r
中
a = 1;
b = a + 2;
c = b + 3;
return c;
活跃变量分析的一个应用
活跃变量分析的另一个应用
活跃变量分析
数据流分析 —— 控制流图 CFG
此处所指的控制流图中
例如
src:https://rainoftime.github.io/teaching/index.html
变量的「 活跃性」 /「 Liveness」
称变量 x
在语句 s
中是具有活跃性的
- 存在使用变量
x
的语句s'
- 有一条从
s
到s'
的路径 并且该路径中没有对, x
的赋值/定义
依赖于 CFG 的一些术语
$\text{pred}()$
$\text{pred}(n):=$ 一个节点 $n$ 的全体前驱节点
例如
$\text{pred}(2) = \{1\}$
$\text{pred}(3) = \{2, 5\}$
$\text{succ}()$
$\text{succ}(n) :=$ 一个节点 $n$ 的全体后继节点
例如
$\text{succ}(2) = \{3\}$
$\text{succ}(3) = \{4, 6\}$
$\text{def}()$
$\text{def}(x) :=$ 包含对变量 $x$ 的定义
$\text{def}(n) :=$ 节点 $n$ 中定义
例如
$\text{def}(x) = \{1, 5\}$
$\text{def}(1) = \{x\}$
$\text{use}()$
$\text{use}(x) :=$ 包含变量 $x$ 出现在表达式右侧的语句的全体节点
$\text{use}(n) :=$ 节点 $n$ 中出现在表达式右侧的全体变量
例如
$\text{use}(a) = \{1, 2, 3, 4, 5\}$
$\text{use}(1) = \{a, b\}$
可判定性
考虑下面的代码片段x
在第一行语句处的活跃性
x = 10; // is x live here?
f();
return x;
如果函数 f()
在调用后永远不会返回x
在第一行语句处实际上是不活跃的return x
不可能被执行x
的值永远不会被再次使用
实际上这个构造将
因此x
在语句 s
处的活跃性x1
在语句 s1
处是活跃的x1
在语句 s1
处可能活跃但也可能不活跃x2
在语句 s2
处是不活跃的x2
在语句 s2
处一定不活跃
一种保守的近似算法
这种近似算法扩大了变量活跃性的范畴
$\text{live-in}()$
称变量 x
在边 E
上是活跃的
- $x \in \text{use}(s')$
即, 变量, x
将出现在语句s'
的表达式右侧 - 有一条经过
E
到, s'
的路径 并且该路径中的所有节点的 $\text{def}()$ 均不包括 $x$,
如果一个变量 $x$ 在某个节点 $n$ 的任何一个入边上是活跃的
简写为 $\text{in}()$
$\text{live-out}()$
如果一个变量 $x$ 在某个节点 $n$ 的任何一个出边上是活跃的
简写为 $\text{out}()$
算法
遵循对变量活跃性的定义
RULE 1
假设 $\text{pred}(n) = \{m_1, m_2, \dots, m_k\}$
RULE 2
符合条件的路径是以节点 $n$ 为终点的所有包含 $n$ 的入边的路径
RULE 3
使得 $x \in \text{out}(n)$ 成立的符合条件的路径
根据以上的 RULE 1, 2, 3
这个互递归公式一定是收敛的
以下是这个互递归公式的伪代码实现
for each n
in[n] <- {}; out[n] <- {}
repeat
for each n
in′[n] <- in[n]; out′[n] <- out[n]
in[n] <- use[n] \cup (out[n] − def[n])
out[n] <- \bigcup_{s in succ[n]} s
until in′[n] == in[n] and out′[n] == out[n] for all n
改进
对节点的分析遵从控制流的倒序
复杂度分析
对于一个大小为 $N$ 的程序
- 每个对集合的并操作需要 $\mathcal{O}(N)$ 时间
。 - 对于内层的
for
循环 对每个节点所需要的并操作是常数个: 因此循环总共需要 $\mathcal{O}(N^2)$ 时间, 。 - 对于外层的
repeat ... until ...
循环 所有 $\text{in}()$ 与所有 $\text{out}()$ 集合的大小之和为 $\mathcal{O}(2N^2)$: 这是, repeat ... until ...
循环所能迭代的最高次数。
时间复杂度相乘
如果选择合适的运算顺序
最小不动点
方程组
拥有不止一个解
证明留作课后习题
src: Tiger p.225, p.233
静态活跃性与动态活跃性
静态活跃性a
从某个节点 n
开始a
的地方a
的定义n
处a
是静态活跃的
动态活跃性a
从某个节点 n
开始a
的地方a
的定义n
处a
是静态活跃的
动态活跃集合是静态活跃集合的子集a
在节点 n
是动态活跃的
静态活跃性是一种保守的近似估计