在每一个基本块中创建常量表,对于当前基本块,每次读入一条语句,就执行以下步骤:
注意:含有地址相加的不能作为常数写进常数表里
该方法涉及到的数据结构:
V
a
l
u
N
u
m
ValuNum
ValuNum(变量编码),可用表达式代码表
U
s
a
b
l
e
E
x
p
r
UsableExpr
UsableExpr,等价表
P
A
I
R
PAIR
PAIR
运行时,区分基本块,对于每一条读入的四元式遵循如下原则
i
f
if
if(当前运算符不是赋值运算符)
使用 P A I R PAIR PAIR表中的对四元式 ( w , A , B , t ) (w,A,B,t) (w,A,B,t)中的可能临时变量 A , B A,B A,B( A , B A,B A,B未必是临时变量)进行替换(因为此时有一些临时变量可能已经通过 U s a b l e E x p r UsableExpr UsableExpr删去了,如果该四元式需要被保留不能使用一个不存在的临时变量)
在 V a l u N u m ValuNum ValuNum表中寻找变量编码,在四元式中替换,不能被替换的变量新建编码。
将替换编码之后的四元式变换成映射编码四元式,形如
(
w
,
i
,
j
,
k
)
(w,i,j,k)
(w,i,j,k),其中
w
w
w为操作码且
w
w
w不为赋值运算符,其中
i
,
j
,
k
i,j,k
i,j,k为值编码
(
>
=
1
)
(>=1)
(>=1),如果发现在
U
s
a
b
l
e
E
x
p
r
UsableExpr
UsableExpr中存在相同的映射编码四元式为
(
w
,
i
,
j
,
l
)
(w,i,j,l)
(w,i,j,l)注意映射编码四元式相同应该定义为w,i,j分别相同而k和l可以相同可以不同则将
k
k
k和
l
l
l所对应变量填入
P
A
I
R
PAIR
PAIR表中,将
k
k
k编码为
l
l
l的编码,删去
(
w
,
i
,
j
,
l
)
(w,i,j,l)
(w,i,j,l)四元式(此时已经没有临时变量
k
k
k了)
e l s e else else
首先要注意一些不能外提的:
算法流程
这里有个问题:如果现在给删了,之后如果再出现这个变量怎么算?
喵喵喵,刚才问完老师了,不能用重复的中间变量
能秒回的老师我太爱了
注意:含有地址相加的可以往外提
练习:
