循环优化与静态单赋值形式解析
1. 数组边界检查
在安全的编程语言中,会自动对每个下标操作插入数组边界检查。不过,在编写良好的程序里,这些检查大多是冗余的,因为程序不会越界访问数组。我们期望安全语言能达到不安全语言的快速性能,因此需要编译器去除那些能证明为冗余的检查。
1.1 数组边界检查转换的限制
- 整除限制 :如果 $b_j(n - a_k)$ 不能被 $b_k$ 整除,就不能使用该转换,因为整数变量不能存储分数值。
- 符号未知限制 :如果 $b_j$ 或 $b_k$ 不是常量,而是符号未知的循环不变值,也不能使用该转换,因为无法确定使用哪种比较(小于或大于)。
1.2 示例
以比较 $i < n$ 为例,可将其替换为 $k’ < a + 4 \cdot n$。由于 $a + 4 \cdot n$ 是循环不变的,应将其提升。之后 $i$ 变得无用,可删除。转换后的程序如下:
s ← 0
k′ ← a
b ← n · 4
c ← a + b
L1 : if k′ < c goto L2
k ← k′
x ← M[k]
s ← s + x
k′ ← k′ + 4
goto L1
L2
最后,通过复制传播可消除 $k ← k’$,得到优化后的程序。
1.3 消除数组边界检查的条件
数组边界通常为 $0 \leq i \land
超级会员免费看
订阅专栏 解锁全文
10万+

被折叠的 条评论
为什么被折叠?



