第八章 中间代码优化

17

description

第八章 中间代码优化. 本章内容. 概述 常量表达式优化 公共表达式优化 循环不变式外提. 概述. 优化的目标 提高程序执行效率 优化的要求 有效 平衡 优化的对象 深层循环和下标变量地址的计算. 概述(续). 优化的种类 常表达式优化(合并常数项) 公共表达式优化(消除重复操作) 循环不变表达式外提 削减运算强度 优化方法: 全局优化 局部优化:源代码、中间代码、目标代码. 常表达式优化. 基本块与程序流图 常表达式局部优化方法. 基本块和程序流图. 基本块: 单入口单出口的程序段。 程序流图: 以基本块为结点的有向图,有向边表示 - PowerPoint PPT Presentation

Transcript of 第八章 中间代码优化

Page 1: 第八章 中间代码优化
Page 2: 第八章 中间代码优化

本章内容• 概述• 常量表达式优化• 公共表达式优化• 循环不变式外提

Page 3: 第八章 中间代码优化

概述• 优化的目标– 提高程序执行效率

• 优化的要求– 有效– 平衡

• 优化的对象– 深层循环和下标变量地址的计算

Page 4: 第八章 中间代码优化

概述(续)• 优化的种类– 常表达式优化(合并常数项)– 公共表达式优化(消除重复操作)– 循环不变表达式外提– 削减运算强度

• 优化方法:– 全局优化– 局部优化:源代码、中间代码、目标代码

Page 5: 第八章 中间代码优化

常表达式优化• 基本块与程序流图

• 常表达式局部优化方法

Page 6: 第八章 中间代码优化

基本块和程序流图基本块:单入口单出口的程序段。程序流图:以基本块为结点的有向图,有向边表示 程序执行的流程。中间代码基本块的划分:– 初始代码为第一个基本块的入口– 遇转移性中间代码时,结束当前基本块,下一条代码

作为新基本块的入口– 遇标号性代码结束当前基本块,代码本身作为新基本

块的入口。– 遇( ASSIG,A,n,X )时,如果 X 为引用型形参时结束

当前块,并作为该块的出口。

Page 7: 第八章 中间代码优化

基本块划分的例子

y = 1 ;if ( A&&B ) x = 0;else y = 0 ;x = x + 1 ;y = y – 1 ;while (x + y > 0) x = x - 1 ;z = 0 ;

Page 8: 第八章 中间代码优化

基本块划分的例子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)

Page 9: 第八章 中间代码优化

常表达式局部优化• 常表达式的定义– 任何时候都取固定常数值的表达式

处理思想:

针对每个基本块,如果一个多元式的两个分量的值已知,则计算其值,并删掉相应的中间代码。

Page 10: 第八章 中间代码优化

常表达式优化原理常量定值表 ConsDef : (Var,Val) 。– 基本块入口置 ConstDef 为空;– 对当前多元式的分量利用 ConstDef 表进行值代

换;– 新多元式形如( ,A,B,t ) : 如果 A 和 B 是常数,

则计算 AB 的值 v ,并将( t,v )填入ConsDef 表。并删除该多元式

– 形如( ASSIG,A,n,B ) : 如果 A 是常数,则把( B,A )填入 ConsDef 表,若已有 B 项,只需修改其值;否则从 ConsDef 中删除 B 的登记项。

Page 11: 第八章 中间代码优化

常表达式局部优化的例子源程序 中间代码 ConstDef 优化后的代码a=1 (ASSIG,1,-,a) (a,1 ) (ASSIG,1,-,a)

b=a+1 (ADDI,a,1,t1) (a,1)(t1,2) ( )

(ASSIG,t1,-,b) (a,1)(t1,2)(b,2) (ASSIG,2,-,b)

a=x (ASSIG,x,-,a) (t1,2)(b,2) (ASSIG,x,-,a)

c=b+5 (ADDI,b,5,t2) (t1,2)(b,2)(t2,7) ( )

(ASSIG,t2,-,c) (t1,2)(b,2)(t2,7)(c,7) (ASSIG,7,c)

Page 12: 第八章 中间代码优化

基于值编码的公共表达式局部优化• 按值等价原理• 优化思想:– 对一个多元式的分量分别编码,具有相同编码

的分量等价。

• 值编码表 ValuNnm• 可用表达式代码表 UsableExpr• 临时变量等价表 TempEqua

Page 13: 第八章 中间代码优化

基于值编码的 ECC 优化算法• 入口处初始化:

– 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 的中间代码。

Page 14: 第八章 中间代码优化

基于值编码的优化实例

A=B*C+B*C;D=B;E=D*C+B*C;

Page 15: 第八章 中间代码优化

循环不变式外提优化• 循环的识别:识别循环的入口、重复体、出口部

分• 识别方法:基于程序文本,基于程序图。• 外提对象:循环不变式• 安全性 : 除法表达式不能外提 ( 除零溢出 ) 赋值表

达式不能外提 ( 不一定执行该循环)• 原理:– 定义 LoopDef 是在循环体内被定义的变量集合 ;– 对每层循环记录 LoopDef; 若循环体内的多元式

( ,A,B,t) 中的 A,B 不在本层的 LoopDef 中 , 则把( ,A,B,t) 外提到循环体的入口处。

Page 16: 第八章 中间代码优化

循环优化实例

i=1;while (i<=100){

z=i*k*5;a=2*k+2*k*2;i=i+1;}

Page 17: 第八章 中间代码优化

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 )