You are on page 1of 36

编译原理

第十章 优化(optimize)

杨春明

西南科技大学计算机学院软件教研室
教学内容
„ 代码优化概述
„ 局部优化(重点)
„ 循环优化(重点)
„ 要求:
„ 正确理解代码优化的定义和各种可能的优化
概念,掌握用DAG表示进行局部优化的方法。

http://mryang.stumental.com/ 2
代码优化
„ 目的:提高代码的运行效率(时间短,空间少)。
„ 实际上式对代码进行等价变换。
„ 优化可以在三个级别上进行:
„ 源程序级、中间代码级、目标代码级
中间代码级
„ 中间代码优化分为三类:
„ 局部优化:对一段顺序语句序列优化。
„ 循环优化:对一段可重复执行的代码序列优化。
„ 全局优化

http://mryang.stumental.com/ 3
局部优化简介
„ 合并已知量
„ 在编译时已知运算对象都是已知量,不必生成目标
代码等到运算时才计算,直接计算,并用计算结果
代替表达式的计算代码。
„ 删除公共子表达式
„ 对于两个相同的表达式计算,若它的计算结果相
同,则没必要重复的生成两条运算指令。
„ 变量传递(复写传播)
„ 无用赋值删除

http://mryang.stumental.com/ 4
局部优化简介
(1)Pi:=3.14; (1)Pi:=3.14
(2)A:=2*Pi*(R+r); (2)T1:=2*Pi T1:=6.28
(3)B:=A;
(3)T2:=R+r
(4)B:=2*Pi*(R+r)*(R-r);
(4)A:=T1*T2
(1)Pi:=3.14
(5)B:=A
(2)T1:=6.28
(6)T3:=2*Pi T3:=6.28
(3)T2:=R+r
(7)T4:=R+r T4:= T2
(4)A:=T1*T2
(8)T5:=T3*T4 T5:=T1*T2
(8)T5:=T1*T2
(9)T6:=R-r
(9)T6:=R-r
(10)B:=T5*T6
(10)B:=T5*T6
http://mryang.stumental.com/ 5
循环优化简介
„ 1)循环不变运算外提
„ 将循环内运算结果不变的式子提到循环外;
„ 2)降低运算强度
„ 将乘法运算化为加法运算;
„ 3)变换循环控制变量并删除其自增赋值式
„ 循环控制变量的作用有两个:用于控制循环进行,
用于计算器它变量的值。如果这两种作用都可以用
某种办法加以替换,那么就可以删除自增赋值表达
式。

http://mryang.stumental.com/ 6
循环优化简介 B3
(4)T1:=I*10
J:=1; (5)T2:=T1+j
For I=1 to 100 do (6)T3:=a-11
A[I,j]=b[I,j]+2; (7)T4:=I*10
(8)T5:=T4+j
(1)j:=1
B1 (9)T6=b-11
(2)I:=1 (10)T7:=T6[T5]
(11)T8:=T7+2
(12)T3[T2]:=T8
B2 (3)if I>100 goto (15)
(13)I:=I+1
(14)goto (3)
http://mryang.stumental.com/ 7
全局优化简介
„ 经循环优化后再做局部优化(合并已知
量、删除公共子表达式和变量传播)
„ 全局优化还包括合并整个程序中的已知
量、删除不同块内公共子表达式等。

http://mryang.stumental.com/ 8
局部优化
„ 基本块
„ 一个基本块是指程序中一段顺序执行的语句
基本块
序列,只有一个入口和一个出口。
„ 几个概念
„ 对于x:=y+z称对x定值并
定值 引用y和z
引用
„ 如果在程序中(包括在基本快或其他基本快
中)它的值在该点之后被引用,则称该点在
程序中是活跃的。
活跃的

http://mryang.stumental.com/ 9
局部优化
„ 基本块划分算法:
„ 1)求出四元式程序中各个基本块的入口语句:
„ (1)程序的第一个句句;或者
„ (2)能由条件转移语句或无条件转移语句转移到达的语句;
或者,
„ (3)紧跟在条件转移语句后面的语句。
„ 2)对以上求出的每一入口语句,构造其所属的基本
块。
„ 3)凡未被纳入某一基本块中的语句,都是程序中控
制流程无法到达的语句,从而也是不会被执行的语
句,可把他们删除。

http://mryang.stumental.com/ 10
局部优化 (1) Read X
(2) Read Y
Read X;
(3) T1:=X mod Y
Read Y;
(4) If T1<>0 goto (6)
While (X mod Y <>0) Do
(5) Goto (10)
begin
(6) T:=X mod Y
T:=X mod Y
(7) X:=Y
X:=Y;
(8) Y:=T
Y:=T;
(9) Goto (3)
end
(10) Write Y
Write Y
(11) halt
http://mryang.stumental.com/ 11
基本块的DAG表示
„ 定义:
„ (1)若节点ni有弧指向节点nj,则ni是nj的父节
点,nj是ni的子节点;
„ (2)若n1,n2,…,nk间存在有向弧
n1Æn2Æ…Ænk,则称n1到nk之间存在一条
通路,若n1=nk,则称该通路为环路;
„ (3)若有向图中任意通路都不是环路,则称
该图为无环路有向图(DAG)。

http://mryang.stumental.com/ 12
基本块的DAG表示
„ 优化中用到的有向图是一种节点带有下
述标记或附加信息的DGA:
„ (1)图的叶节点以一标示符或常数做标记;
„ (2)图的内部节点以一运算符作为标记;
„ (3)图中各个节点上可能附加一个或多个标
示符,表示这些标示符具有该节点所代表的
值,简称附标。

http://mryang.stumental.com/ 13
基本块的DAG表示
„ 一个基本块可以用一个DAG来表示。
„ 按其四元式对应节点的后继个数分成三
种类型:
„ (0) A:=B
„ (1) A:=op B
„ (2) A:= B op C 或者 A:=B[C]

http://mryang.stumental.com/ 14
DAG节点的数据表示
„ 假设DAG各节点信息用一节点表示,对于每个
节点建立三项信息:
„ (1)标记,叶节点登记变量或常量的入口地址,内部
节点登记操作符;
„ (2)子节点分长子和次子用链表链接;
„ (3)附标,填变量的符号表入口地址,多个附标可连
成链。
„ 为了便于查阅节点表,还建立一张元表,用作登记
四元式中除操作符外的其他三元的名称及其在节点
表中的序号。

http://mryang.stumental.com/ 15
DAG在基本块优化中的作用
„ DAG图可做到如下三种优化:
„ (1)对任何一个四元式,如果其中参与运算
的对象都是编译时的已知量,那么合并已知
量,并用合并后算出的常量生成一个叶节
点;
„ (2)如果某变量被赋值之后,随后又被赋新
值,那么可删除对变量的前一个赋值;
„ (3) 对具有公共子表达式的所有四元式,只
产生一个计算该表达式值的内部节点,把那
些赋值的变量附加到该节点上。
http://mryang.stumental.com/ 16
DAG算法举例
(1) T0:=3.14 n8 B
(6) T3:=2*T0
*
(2) T1:=2* T0
(7) T4:=R+r
(3) T2:=R+r n6 A,T5
(8) T5:=T3*T4
* T2,T4 n T6
(4) A:=T1*T2 (9) T6:=R-r n5 7
+ -
(5) B:=A (10) B:=T5*T6
T1,T3
n1 T0 n2 n3 n4
3.14 6.28 R r

http://mryang.stumental.com/ 17
DAG在基本块优化中的作用
„ 利用DAG图可还原四元式序列:
„ (1)若为叶节点,无附标,则不生成四元式;
„ (2)若为叶节点,标记B,符标A,则A:=B;
„ (3)若为中间节点,有附标,根据标记op生成A:=B
op C A:=op B A:=B[C] if B rop C goto (s)
„ (4)若中间节点无附标,添加一个临时附标SA,转(3)
„ (5)若节点有多个附标A1,A2,…,An有两种情况:
„ (a)若节点是叶节点,标记为B,则A1:=B,A2:=B,…,An:=B;
„ (b)若为内部节点,则除第一附标A1外,其他附标生成
A2:=A1,A3:=A1,…,An:=A1。

http://mryang.stumental.com/ 18
DAG在基本块优化中的作用
„ 例: (1) T0:=3.14
n8 B (2) T1:=6.28
* (3) T3:=6.28

n6 A,T5 (4) T2:=R+r


(5) T4:=T2
* T2,T4 n T6
n5 7 (6) A:=6.28*T2
+ -
(7) T5:=A
T1,T3
(8) T6:=R-r
n1 T0 n2 n3 n4
(9) B:=A*T6
3.14 6.28 R r
http://mryang.stumental.com/ 19
DAG在基本块优化中的作用
„ 可以从DAG中的到一些其他优化信息:
„ 在基本块外被定值并在基本块内被引用的所
有标识符,就是作为叶节点标记的那些标识
符;
„ 在基本块内被定值且该值能在基本块后面被
引用的所有标识符,就是DAG个节点上的那
些符标。

http://mryang.stumental.com/ 20
控制流程分析
„ 程序流图
B1
„ 定义:以基本块为节
点,控制程序流向作为
有向弧,画出的图称为
B2
程序流图。
程序流图
„ 特点:具有唯一首节点
的有向图。
B3 B4

http://mryang.stumental.com/ 21
控制流程分析
„ 必经节点集
„ 定义:若从首节点出发到达nj的各条通路都
必须经过的节点ni,称ni为nj的必经节点,记
作 ni dom nj。
„ nj的全部必经节点的集合称作nj的必经节点
集,记作D(nj)。
„ 求必经节点集的算法
„ 设节点n的父节点是P1,P2,…,Pk,则:
„ D(n)=∩ D(Pi) ∪ {n}
http://mryang.stumental.com/ 22
控制流程分析
„ 必经节点集举例:
1 D(1)={1}
D(2)={1,2}
2 D(3)={1,2,3}
3
D(4)={1,2,4}
4
D(5)={1,2,4,5}

6 5 D(6)={1,2,4,6}
D(7)={1,2,4,7}
7
http://mryang.stumental.com/ 23
深度为主排序
„ 对给定流程图,从首节点出发言者某条
路经尽量前进,直到访问不到新节点
时,退回到前驱节点,在有前驱节点沿
着另外一通路尽量前进,直到访问不到
新节点,退回到前驱节点,此过程一直
进行到退回到首节点且在也访问不到新
节点为止。

http://mryang.stumental.com/ 24
查找循环算法
1
„ 定义:设aÆb时流图中
一条有向边,若b dom 2
3
a,则称aÆb时流图中的
一条回边。
回边 4

6 5
图中的回边有:
7
6Æ6,7Æ4,4Æ2
http://mryang.stumental.com/ 25
查找循环算法
„ 每一条回边构成一个循环
„ 设nÆd是回边,则该回边构成的循环包括下
列节点:n、d以及不经过d能到达n的所有节
点。
„ 例:
„ 回边4Æ2 循环={4,2,3,7,5,6}
„ 回边7Æ4 循环={7,4,5,6}
„ 回边6Æ6 循环={6}

http://mryang.stumental.com/ 26
查找循环算法
„ (1)找出回边nÆd;
„ (2)则n、d必定属于nÆd回边组成的循环L中,
L:={n,d}
„ (3)若n≠ d且n的父节点n’不在L中,则将它添
如L中,L:=L∪ {n’}
„ (4)对(3)求出的父节点n重复(3),直至不再有
新节点加入为止。
„ 定理:对于循环必定满足强连通,而且有维一
定理:
入口点。

http://mryang.stumental.com/ 27
循环优化的一些基本概念
„ 点:程序中某一个四元式的位置;
„ 定值点:对某变量赋值或输入值的四元式位置;
定值点
„ 引用点:引用某变量的四元式位置;
引用点
„ 变量A的到达与定值:d是A的定值点,u是A的引用
的到达与定值
点,存在一条从d到u的通路,并此路上没有A的其他定
值点,称d点对A的定值能达到u点。
„ 活跃变量:对于变量A和点p,存在一条从p开始的路
活跃变量
径,在该路径上A在定置前被引用或仅有引用,则称A
在p点是活跃的变量。

http://mryang.stumental.com/ 28
循环优化
„ 代码外提
„ 定义:形如(s)A:=B op C 四元式,若
„ (1)B、C为常量;
„ (2)到达(s)点的B、C定值点都在循环外;
„ (3)到达(s)点的B、C定值点随在循环内;但
只是一个定值点且已被标为循环不变运算;
„ 则(s)为循环不变运算,A、B、C为循环不变
量。

http://mryang.stumental.com/ 29
循环优化
„ 代码外提
„ 实行代码外提时,在循环入口节点前建立一
个新节点(基本块),称作循环的前置节点。

前置节点
入口节点
… 入口节点
循环L …
… 循环L

http://mryang.stumental.com/ 30
代码外提条件
„ 1)该不变运算所在节点(基本块)必须时
循环出口节点的必经节点或者该不变运
算所定值的不变量在循环出口之后不是
活跃的。
„ 2)循环内不变运算所定值的变量只有唯
一的一个定值点。
„ 3)外提循环不变运算(s)A:=B op C时循
环内所有A的引用点必须而且仅是(s)所
能到达的。
http://mryang.stumental.com/ 31
循环优化
„ 查找循环L的不变运算的算法是:
„ 1)依次查看L中个基本块的每个四元式,如果它的每
个运算对象或为常数,或者定值点在L之外,则将
其标记为“不变运算”;
„ 2)依次查看尚未被标记“不变运算”的四元式,如果
它的每个运算对象或为常数,或者定值点在L之
外,或只有一个到达定值点且该点上的四元式已标
记为“不变运算”,则把被查看的四元式标记为“不变
运算”;
„ 3)重复(2)直至没有新的四元式被标记为“不变运算”。

http://mryang.stumental.com/ 32
循环优化
„ 代码外提算法:
„ (1) 求出循环L的所有不变运算;
„ (2) 对(1) 的每一不变运算(s):A:=B op C 或
A:= op B 或 B:=B 检查是否满足以下条件:
„ I (s)所在的节点式L的所有出口节点的必经节点,或
变量A在离开L后不再活跃;
„ II A在L中其他地方未再定值;
„ III L中所有A的引用点只有(s)中A的定值才能到达。
„ (3)按(1)的顺序依次把符合(2)的不变运算(s)外
提到L的前置节点中。
http://mryang.stumental.com/ 33
循环优化
„ 强度减弱
„ 定义:循环中变量I只有唯一的形如
(s)I:=I+C的赋值,其中C为循环不变量,则
称I为循环中基本归纳变量。
„ 如果变量J与基本归纳变量I可规划为线性关
系J:=C1*I+C2,其中C1、C2为循环不变量,
则称J是与I同族的归纳变量。

http://mryang.stumental.com/ 34
循环优化
„ 强度减弱
„ 设I:=I+C,J:=C1*I+C2
„ 现将赋置式改用等式代替,则有:
„ Ji+1=C1*Ii+1+C2=C1*(Ii+C)+C2=C1Ii+C1C+C2
=Ji+C1C

http://mryang.stumental.com/ 35
循环优化
„ 删除归纳变量算法如下:
„ (1)利用循环不变运算的信息,找出循环中基本归纳
变量X;
„ (2)找出所有归纳变量A,并指出A与X的线性关系
A:=C1X+C2。
„ (3)强度减弱,将L中归纳变量的算式化为自增赋值
算式,然后:
„ 在循环前置节点中按原式计算初值;
„ 将自增赋置算式置于L中原基本归纳变量自增幅置式之后。
„ (4)变换循环变量。

http://mryang.stumental.com/ 36

You might also like