Appearance
第十章 代码优化和目标代码生成
一、代码优化
- 局部优化:在基本块内的优化
- 合并已知量
- 删除公共子表达式
- 删除无用赋值
- 删除死代码
- 全局优化(循环优化):在基本块间的优化
- 代码外提
- 强度削弱
- 删除归纳变量
二、目标代码的生成
p: x:=y op z
- y本身占有寄存器Ri,且y在P点后不再被引用,
op Ri,z
- 有空余可用寄存器Ri,将Ri分配给x,
MOV y,Ri; OP Ri,z
- 寄存器均被占用
- 占用Ri变量在主存已有副本的
- 占用P点后该变量不再被引用的
- 占用离P点最远才被引用的
例:
t:=a-b
u:=a+c
v:=a-t
w:=v+u
可用寄存器R0,R1
MOV a,R0
SUB R0,b ; t占用R0
MOV a,R1
ADD R1,c ; u占用R1
MOV R1,u ; 释放R1
MOV a,R1
SUB R1,R0 ; v占用R1
MOV R1,v ; 释放R1
ADD R1,u ; w占用R1
三、固定分配寄存器节省的代价
- 0:块内赋值前被引用的次数,未赋值的话都算
- 1:块后是活跃变量则为2
基本块后的活动变量列在基本块下方。
a0 | a1 | b0 | b1 | c0 | c1 | d0 | d1 | e0 | e1 | f0 | f1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
B1 | 2 | 2 | 1 | 1 | 2 | 2 | 1 | |||||
B2 | 1 | 1 | 2 | |||||||||
B3 | 1 | 2 | 1 | 1 | 2 | 1 | ||||||
B4 | 2 | 1 | 1 |
所以答案为:
a:4,b:6,c:3,d:6,e:4,f:4