【编译原理】代码优化,流图/DAG优化

优化原因

  • 逐条语句进行的代码生成策略经常产生含有大量冗余指令和次最优解结构的目标代码。
  • 代码优化就是被优化程序进行一种语义保持的变换

 

优化位置

  • 中间代码优化(与机器无关)
  • 目标代码优化(与机器有关)

 

优化分类

  • 局部优化
  • 循环优化
  • 全局优化

 

优化技术

  • 删除公共子表达式t1 = 4 * it2 = 4 * i的右侧是公共的,优化为t1 = 4 * it2 = t1
  • 复写传播t1 = f[t2]t3 = t2t4 = f[t3]优化为t1 = f[t2]t3 = t2t4 = f[t2]
  • 删除无用表达式:把上面的t3 = t2删掉(事实上,复写传播的目的正是使某些变量的复制变为无用)
  • 强度削弱t1 = 4 * i,i的值每次循环减1,优化为t1 = t1 - 4,将强度较高乘法运算优化为强度较低的加法运算
  • 删除归纳变量:若存在线性关系t1 = 4 * it2 = 4 * j,则i > j优化为t1 > t2

 
 

流图构造

——— 根据中间代码构造流图需要三步:

  1. 入口语句程序的第一句 + 转移语句的目标句 + 转移语句的下一句
  2. 根据入口语句划分基本块
  3. 画图

——— 例题练手 >_<:

(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. 找入口语句:(1) (3) (5) (8)
  2. 划分基本块:(1)(2); (3)(4); (5)(6)(7); (8)(9)
  3. 画图
    在这里插入图片描述

 
 
 

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

  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值