活性分析:编译器优化的关键技术
活性分析基础
在编译器中,前端会将程序转换为包含无限数量临时变量的中间语言,但实际运行的机器寄存器数量是有限的。如果两个临时变量 a
和 b
不会同时被使用,那么它们可以共享同一个寄存器。编译器需要分析中间表示程序,以确定哪些临时变量会同时被使用,这就是活性分析。
控制流图
为了对程序进行分析,通常会构建控制流图。程序中的每个语句都是流图中的一个节点,如果语句 x
可以紧跟语句 y
执行,那么就有一条从 x
到 y
的边。例如,下面是一个简单循环的控制流图:
a := 0
L1: b := a + 1
c := c + b
a := b * 2
if a < N goto L1
return c
对应的控制流图节点编号如下:
1. a := 0
2. b := a + 1
3. c := c + b
4. a := b * 2
5. if a < N goto L1
6. return c
变量活性分析
变量的活性是指其当前值在未来是否会被使用,我们从未来到过去分析活性。以变量 b
为例,它在语句 4 中被使用,所以在边 3 → 4