第八章 中间代码优化
This presentation is the property of its rightful owner.
Sponsored Links
1 / 17

第八章 中间代码优化 PowerPoint PPT Presentation


  • 76 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

第八章 中间代码优化

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


5344825

第八章 中间代码优化


5344825

本章内容

  • 概述

  • 常量表达式优化

  • 公共表达式优化

  • 循环不变式外提


5344825

概述

  • 优化的目标

    • 提高程序执行效率

  • 优化的要求

    • 有效

    • 平衡

  • 优化的对象

    • 深层循环和下标变量地址的计算


5344825

概述(续)

  • 优化的种类

    • 常表达式优化(合并常数项)

    • 公共表达式优化(消除重复操作)

    • 循环不变表达式外提

    • 削减运算强度

  • 优化方法:

    • 全局优化

    • 局部优化:源代码、中间代码、目标代码


5344825

常表达式优化

  • 基本块与程序流图

  • 常表达式局部优化方法


5344825

基本块和程序流图

基本块:单入口单出口的程序段。

程序流图:以基本块为结点的有向图,有向边表示

程序执行的流程。

中间代码基本块的划分:

  • 初始代码为第一个基本块的入口

  • 遇转移性中间代码时,结束当前基本块,下一条代码作为新基本块的入口

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

  • 遇(ASSIG,A,n,X)时,如果X为引用型形参时结束当前块,并作为该块的出口。


5344825

基本块划分的例子

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 ;


5344825

B1

B2

B3

B4

B5

B6

B7

B8

程序流图例

基本块划分的例子

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)

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)


5344825

常表达式局部优化

  • 常表达式的定义

    • 任何时候都取固定常数值的表达式

      处理思想:

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


5344825

常表达式优化原理

常量定值表ConsDef:(Var,Val)。

  • 基本块入口置ConstDef为空;

  • 对当前多元式的分量利用ConstDef表进行值代换;

  • 新多元式形如(,A,B,t):如果A和B是常数,则计算AB的值v,并将(t,v)填入ConsDef表。并删除该多元式

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


5344825

常表达式局部优化的例子

源程序 中间代码 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)


5344825

基于值编码的公共表达式局部优化

  • 按值等价原理

  • 优化思想:

    • 对一个多元式的分量分别编码,具有相同编码的分量等价。

  • 值编码表ValuNnm

  • 可用表达式代码表UsableExpr

  • 临时变量等价表TempEqua


5344825

基于值编码的ECC优化算法

  • 入口处初始化:

    • ValueNum,UsableExp和TempEqua为空。

  • 对当前多元式用TempEqua等价替换,生成NewTuple.

  • 如果NewTuple的A和B分量是未编码的,则编新码;

    • 如果多元式形如dk:(,A,B,tk )

      • 若存在diUsableExpr使得dk是di的ECC,则删掉dk,将(tk,ti)填入TempEqua表;

      • 否则,为tk编码;把dk加入到UsableExpr表;

    • 如果多元式形如dk:(ASSIG,A,-,B )

      • 则令B的值编码等于A的值编码,填入ValuNum表中;从UsableExpr删除所有含B的中间代码。


5344825

基于值编码的优化实例

A=B*C+B*C;

D=B;

E=D*C+B*C;


5344825

循环不变式外提优化

  • 循环的识别:识别循环的入口、重复体、出口部分

  • 识别方法:基于程序文本,基于程序图。

  • 外提对象:循环不变式

  • 安全性: 除法表达式不能外提(除零溢出)赋值表达式不能外提(不一定执行该循环)

  • 原理:

    • 定义LoopDef是在循环体内被定义的变量集合;

    • 对每层循环记录LoopDef;若循环体内的多元式( ,A,B,t)中的A,B不在本层的LoopDef中,则把( ,A,B,t)外提到循环体的入口处。


5344825

循环优化实例

i=1;

while (i<=100){

z=i*k*5;

a=2*k+2*k*2;

i=i+1;

}


5344825

( , i ,100, t1 )

([ ], A,t1, t2 )

( , i ,100, t1 )

([ ], A,t1, t2 )

( , j ,10, t3 )

([ ], t2, t3, t4 )

( , i , j, t6 )

( , j ,10, t3 )

([ ], t2, t3, t4 )

( , i , j, t6 )

([ ], t4, k , t5 )

( , t6,k, t7 )

( =, t7, -, t5 )

([ ], t4, k , t5 )

( , t6,k, t7 )

( =, t7, -, t5 )

外提实例

FOR i =0 TO 9 DO

FOR j =0 TO 9 DO

FOR k=0 TO 9 DO

A[i][j][k]=(ij)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 )


  • Login