在线实验融入计算机教学 - USTC · –步骤停留时间:每个实验任务完成时间 –有效学习时间:真正敲代码的时间操作截图(300万分钟/月)
第八章 中间代码优化
-
Upload
yardley-kramer -
Category
Documents
-
view
42 -
download
8
description
Transcript of 第八章 中间代码优化
第八章 中间代码优化第八章 中间代码优化
引言 常量表达式优化 公共表达式优化 循环不变式外提
优化的目标: 优化的要求: 优化的对象:深层循环和下标变量地址的计算 优化的种类:
常表达式优化(合并常数项) 公共表达式优化(消除重复操作) 循环不变表达式外提 削减运算强度等等
优化方法: 全局优化:全局信息 局部优化:局部信息
基本块和程序流图基本块和程序流图 基本块:单入口单出口的程序段。 程序流图:以基本块为结点的有向图,有向边表示 程序执行的流程。 中间代码基本块的划分: 初始代码为第一个基本块的入口 遇转移性中间代码时,结束当前基本块,下一条 代码作为新基本块的入口 遇标号性代码结束当前基本块,代码本身作为新 基本块的入口。 遇( ASSIG, A, X )时,如果 X 为引用型形参时结 束当前块,并作为该块的出口。
基本块划分的例子基本块划分的例子
y := 1 ;
L: if A and B then x := 0 else y := 0 ;
x := x + 1 ;
y := y – 1 ;
while x + y > 0 do x := x - 1 ;
z := 0 ;
基本块划分的例子基本块划分的例子B1:(ASSIG ,1,_,y)B2:(LABEL,L)
(AND, A, B, t) (THEN,t,_,_)
B3:(ASSIG,0,_,x) (ELSE,_,_,_)
B4:(ASSIG,0,_,y) (ENDIF,_,_,_)
B5:(ADDI,x,1,t1) (ASSIG,t1,_,x) (SUBI,y,1,t2) (ASSIG,t2,_,y)
B1
B2
B4B3
B5
B6
B8B7
程序流图例
B6:(WHILE,_,_,) (ADDI,x,y,t3) (GT,t3,0,t4) (DO,t4,_,_)
B7:(SUBI,x,1,t5) (ASSIG,t5,_,x) (ENDWHILE,_,_,_)
B8:(ASSIG,0,_,z)
常表达式局部优化常表达式局部优化 常表达式:任何时候都取固定常数值的表达式 处理思想:针对每个基本块,如果一个多元式的两 个分量的值已知,则计算其值,并删掉 相应的中间代码。 原理:常量定值表 ConsDef : (Var,Val) 。 基本块入口置 ConstDef 为空; 对当前多元式的分量利用 ConstDef 表进行值代换; 新多元式形如(, A, B,t ) : 如果 A 和 B 是常数, 则计算 AB 的值 v ,并将( t,v )填入 ConsDef
表。并 删除该多元式 形如( ASSIG , A, B ) : 如果 A 是常数,则把
( B,A ) 填入 ConsDef 表,若已有 B 项,只需修改其值; 否则从 ConsDef 中删除 B 的登记项。
常表达式局部优化的例子常表达式局部优化的例子源程序 中间代码 ConstDef 优化后的代码
a:=1 (ASSIGN, 1,a) (a,1 ) (ASSIGN,1,a)
b:=a+1 (ADDI,a,1,t1) (a,1)(t1,2) ( )
(ASSIGN,t1,b) (a,1)(t1,2)(b,2) (ASSIGN,2,b)
a:=x (ASSIGN, x,a) (t1,2)( b,2) (ASSIGN,a,x)
c:=b+5 (ADDI,b,5,t2) (t1,2)(b,2)(t2,7) ( ) (ASSIGN,t2,c) (t1,2)(b,2) (t2,7)(c,7)
(ASSIGN,7,c)
基于值编码的公共表达式局部优化基于值编码的公共表达式局部优化 按值等价原理 优化思想: 对一个多元式的分量分别编码,具 有相同编码的分量等价。 值编码表 ValuNnm: 可用表达式代码表 UsableExpr 临时变量等价表 TempEqua
基于值编码的基于值编码的 ECCECC 优化算法优化算法 入口处初始化: ValueNum,UsableExp 和 TempEqua
为空。 对当前多元式用 TempEqua 等价替换,生成 NewTuple. 如果 NewTuple 的 A 和 B 分量是未编码的,则编新码; 如果多元式形如: dk:(, A, B, tk ) 若存在 diUsableExpr 使得 dk 是 di 的 ECC ,则删掉 dk ,将 (tk,ti) 填入 TempEqua 表; 否则,为 tk 编码;把 dk 加入到 UsableExpr 表; dk:(ASSIG, A, B ) 则令 B 的值编码等于 A 的值编码,
填入 ValuNum 表中;从 UsableExpr 删除所有含 B 的 中间代码。
基于值编码的优化实例基于值编码的优化实例
A:=B*C+B*C
D:=B
E:=D*C+B*C
循环不变式外提优化循环不变式外提优化 循环的识别:识别循环的入口、重复体、出口部分 识别方法:基于程序文本,基于程序图。 外提对象:循环不变式 安全性 : 除法表达式不能外提 ( 除零溢出 ) 赋值表达式不能外提 ( 不一定执行该循环) 外提原理: 定义 LoopDef 是在循环体内被定义的变量集合 ; 对每层循环记录 LoopDef; 若循环体内的多元式 ( ,A,B,t) 中的 A,B 不在本 层的 LoopDef 中 , 则把 ( ,A,B,t) 外提到循环体 的入口处。
循环优化实例循环优化实例
i:=1
while i<=100 do
begin z:=i*k*5
a:=2*k+2*k*2
i:=i+1;
end
外提实例外提实例FOR i :=0 TO 9 DO FOR j :=0 TO 9 DO
FOR k:=0 TO 9 DO A[i][j][k]:=(ij)k ENDFOR
ENDFOR ENDFOR
( , i ,100, t1 ) ([ ], A,t1, t2 ) ( , j ,10, t3 ) ([ ], t2, t3, t4 ) ([ ], t4, k , t5 ) ( , i , j, t6 ) ( , t6,k, t7 ) ( , t7, t5 )
( , i ,100, t1 ) ([ ], A,t1, t2 ) ( , j ,10, t3 ) ([ ], t2, t3, t4 ) ( , i , j, t6 )
([ ], t4, k , t5 ) ( , t6,k, t7 ) ( , t7, t5 )
( , i ,100, t1 ) ([ ], A,t1, t2 )
( , j ,10, t3 ) ([ ], t2, t3, t4 ) ( , i , j, t6 )
([ ], t4, k , t5 ) ( , t6,k, t7 ) ( , t7, t5 )