优化原因
- 逐条语句进行的代码生成策略经常产生含有大量冗余指令和次最优解结构的目标代码。
- 代码优化就是被优化程序进行一种语义保持的变换
优化位置
- 中间代码优化(与机器无关)
- 目标代码优化(与机器有关)
优化分类
- 局部优化
- 循环优化
- 全局优化
优化技术
- 删除公共子表达式:
t1 = 4 * i
和t2 = 4 * i
的右侧是公共的,优化为t1 = 4 * i
和t2 = t1
- 复写传播:
t1 = f[t2]
、t3 = t2
、t4 = f[t3]
优化为t1 = f[t2]
、t3 = t2
、t4 = f[t2]
- 删除无用表达式:把上面的
t3 = t2
删掉(事实上,复写传播的目的正是使某些变量的复制变为无用) - 强度削弱:
t1 = 4 * i
,i的值每次循环减1,优化为t1 = t1 - 4
,将强度较高乘法运算优化为强度较低的加法运算 - 删除归纳变量:若存在线性关系
t1 = 4 * i
和t2 = 4 * j
,则i > j
优化为t1 > t2
流图构造
——— 根据中间代码构造流图需要三步:
- 找入口语句(程序的第一句 + 转移语句的目标句 + 转移语句的下一句)
- 根据入口语句划分基本块
- 画图
——— 例题练手 >_<:
(1) read x
(2) read y
(3) r = x mod y
(4) if r = 0 goto (8)
(5) x = y
(6) y = r
(7) goto (3)
(8) write y
(9) end
- 找入口语句:(1) (3) (5) (8)
- 划分基本块:(1)(2); (3)(4); (5)(6)(7); (8)(9)
- 画图
DAG优化
(1) T0 = 3.14
(2) T1 = 2 * T0
(3) T2 = R + r
(4) A = T1 * T2
(5) B = A
(6) T3 = 2 * T0
(7) T4 = R + r
(8) T5 = T3 * T4
(9) T6 = R - r
(10) B = T5 * T6
(1) T0 = 3.14
(2) T1 = 6.28
(3) T3 = 6.28
(4) T2 = R + r
(5) T4 = T2
(6) A = 6.28 * T2
(7) T5 = A
(8) T6 = R - r
(9) B = A * T6
E N D END END