本文概述
- 1.保留结构的转换
- 2.代数变换
基本块优化有两种类型。这些如下:
- 保留结构的转换
- 代数变换
- 常见子表达式消除
- 消除死代码
- 重命名临时变量
- 两个独立的相邻语句的互换
在公共子表达式中, 不需要一遍又一遍地对其进行计算。取而代之的是, 你可以一次计算它, 并在再次遇到它时将其保存在引用的位置。
a : = b + cb : = a - d c : = b + cd : = a - d
在上面的表达式中, 第二和第四表达式计算出相同的表达式。因此, 可以按以下方式转换块:
a : = b + c b : = a - dc : = b + cd : = b
(b)消除死代码
- 程序可能包含大量无效代码。
- 一旦声明和定义一次, 而忘记将其删除, 则可能导致这种情况, 因为它们毫无用处。
- 假设语句x:= y + z出现在一个块中, 并且x是死符号, 这意味着它以后将不再使用。然后, 无需更改基本块的值, 就可以安全地删除此语句。
可以将语句t:= b + c更改为u:= b + c, 其中t是一个临时变量, u是一个新的临时变量。 t的所有实例都可以用u替换, 而无需更改基本块值。
(d)陈述的互换
假设一个块具有以下两个相邻的语句:
t1 : = b + c t2 : = x + y
当t1的值不影响t2的值时, 这两个语句可以互换而不会影响block的值。
2.代数变换
- 在代数变换中, 我们可以将表达式集更改为代数等效集。因此, 可以从基本块中消除表达式x:= x + 0或x:= x * 1, 而无需更改表达式集。
- 恒定折叠是一类相关的优化。在这里, 在编译时, 我们评估常量表达式, 并用它们的值替换常量表达式。因此, 表达式5 * 2.7将被13.5代替。
- 有时, 意外的公共子表达式由诸如< =, > =, < , > , +, =等的关系运算符生成。
- 有时, 在不更改基本块值的情况下, 将关联表达式应用于公开子表达式。如果源代码具有分配
a:= b + ce:= c +d +b
【基本块的优化】可能会生成以下中间代码:
a:= b + ct:= c +de:= t + b