编译原理-清华大学-第10章1-代码优化

  • 格式:pdf
  • 大小:960.41 KB
  • 文档页数:73

下载文档原格式

  / 73
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
goto(5)
5、合并已知量与复写传播
• 编码时的已知量—常数,可在编译时 计算出它的值,这种变换称为合并已 知量或常数合并。
• 通过复制后没有再改变的值可以互相 替换,不会改变程序的结果,这种变 换称为复写传播。
复写传播
tmp2 = tmp1 ; tmp3 = tmp2 * tmp1; tmp4 = tmp3 ; tmp5 = tmp3 * tmp2 ; c = tmp5 + tmp4 ;
(3)
R:=X mod Y
(4)
if R=0 goto (8)
(5)
X:=Y
(6)
Y:=R
(7)
goto (3)
(8)
write Y
(9)
halt
2019/5/7
25
• 例:划分基本块
(1)
read X
(2)
read Y
1.求出四元式程序中各个基本块的入口语 句:
1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
(1)P:=0 (2)I:=0
(3)T1:=4*I (4)T2:=addr(A) (5)T3:=T2[T1] (6)T4:=T1 (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
(2)对以上求出的每个入口语句,确定其所属 的基本块。它是由该入口语句到下一入口 语句(不包括该入口语句)、或到一转移语 句(包括该转移语句) 、或一停语句(包括该 停语句)之间的语句序列组成的。
入口语句n … … 入口语句m
2019/5/7
入口语句n … … 转移语句m
入口语句n … … 停语句m
4、变换循环控制条件
• 经过变换循环的控制条件后,有些变 量不被引用,可以从循环中删除。
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=4*I
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (3’)T1:=T1+4 (12)if I<=20
goto(5)
(1)P:=0 (2)I:=1 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=4*I
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4 ] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1 <=80
3.强度削弱
•基本思想:把强度大的运算换算成强度 小的。例如: a) i*2 = 2*i = i+i b) 0-1 = -1 c) f/2.0 = f*0.5
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B)
(3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
(1)P:= 0
(2)I:=0
变址取数
(3)T1:=4*I (4)T2:=addr(A)
(5)T3:=T2[T1] (6)T4:=4*I (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1
(12)if I<=20 goto(3)
2)在运行基本块时,只能从其入口进入, 从出口退出。
2、划分基本块算法
(1)求出各基本块的入口语句 1)程序的第一个语句 ; 2)能由条件转移语句和无条件转移语句转
移到达的语句; 3)紧跟在条件转移语句后面的语句。
(2) 对以上求出的每个入口语句,确定其所 属的基本块。它是由该入口语句到下一入 口语句(不包括该入口语句) 之间的语句序 列组成的。
(3)
R:=X mod Y
(4)
if R=0 goto (8)
(5)
X:=Y
(6)
Y:=R
(7)
goto (3)
(8)
write Y
(9)
halt
2019/5/7
27
• 例:划分基本块
(1)
read X
(2)
read Y
1.求出四元式程序中各个基本块的入口语 句:
1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (3‘)T1:=T1+4 (12)if I<=20 goto(5)
(5)T3:=T2[T1] (8)T6:=T5[T1] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5)
10.2局部优化
一、基本块 1、定义
程序中一个只有一个入口和一个出口的一 段顺序执行的语句序列,称为程序的一个基 本块。 注:1)一个给定的程序,可以划分为一系列 的基本块。优化在各基本块中分别进行(局部 优化)。
6.删除无用赋值
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
(1)P:=0
(4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T1] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5)
四、常用优化技术简介
1.删除多余运算 2.循环不变代码外提 3.强度削弱 4.变换循环控制条件 5.合并已知量与复写传播 6.删除无用赋值
1.删除多余运算(删除公共子表达式):
目的:提高目标代码速度。
例如:(假设数组元素占用空间为4个字 节)
P:=0 for I:=1 to 20 do
P:=P+A[I]*B[I]
(3)
R:=X mod Y
(4)
if R=0 goto (8)
(5)
X:=Y
(6)
Y:=R
(7)
goto (3)
(8)
write Y
(9)
halt
2019/5/7
24
• 例:划分基本块
(1)
read X
(2)
Βιβλιοθήκη Baidu
read Y
1.求出四元式程序中各个基本块的入口语 句:
1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
(3)
R:=X mod Y
(4)
if R=0 goto (8)
(5)
X:=Y
(6)
Y:=R
(7)
goto (3)
(8)
write Y
(9)
halt
2019/5/7
26
• 例:划分基本块
(1)
read X
(2)
read Y
1.求出四元式程序中各个基本块的入口语 句:
1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=0
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T1] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5)
tmp3 = tmp1 * tmp1 ; tmp5 = tmp3 * tmp1 ; c = tmp5 + tmp3 ;
2019/5/7
15
(1)P:=0 (2)I:=0 (4)T2:=addr(A) (7)T5:=addr(B) (3)T1:=4*I
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5)
Y:=R
(7)
goto (3)
(8)
write Y
(9)
halt
2019/5/7
2. 对以上求出的 每个入口语句, 确定其所属的基 本块。它是由该 入口语句到下一 入口语句(不包括 该入口语句)、或 到一转移语句(包 括该转移语句)、 或一停语句(包括 该停语句)之间的 语句序列组成的。
29
(1) read (C) (2) A:= 0 (3) B:= 1 (4) L1: A:=A + B (5) if B>= C goto L2 (6) B:=B+1 (7) goto L1 (8) L2: write (A) (9) halt
二、基本块的DAG表示
1、DAG(有向无环图)定义
a)父子结点
若在一有向图中,结点ni有弧指向nj,则称ni是nj 的父结点,nj是ni的子结点。 b)路径与环路
goto(3)
(1)P:=0
(2)I:=0 (4)T2:=addr( A) (7)T5:=addr(B)
(3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1
(8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1
(12)if I<=20 goto(3)
(3)
R:=X mod Y
(4)
if R=0 goto (8)
(5)
X:=Y
(6)
Y:=R
(7)
goto (3)
(8)
write Y
(9)
halt
2019/5/7
28
• 例:划分基本块
(1)
read X
(2)
read Y
(3)
R:=X mod Y
(4)
if R=0 goto (8)
(5)
X:=Y
(6)
•与机器无关的优化---中间代码优化。 •依赖于机器的优化---目标代码优化。
三、优化分类
按照优化所涉及的程序范围分类: (1)窥孔优化:滑动优化包含几条语句/指令
的窗口,窗口有时会超越程序基本块 (2)局部优化:对基本块内的代码进行优化 (3)循环优化:对循环中的代码进行优化 (4)全局优化:在整个程序范围内的优化
22
(3)删除不会被执行的语句
凡是没有纳入到任何一个基本块中的语句 ,都是程序控制流程所无法到达的语句, 即不会被执行到的语句,可将其删除。
• 例:划分基本块
(1)
read X
(2)
read Y
1.求出四元式程序中各个基本块的入口 语句:
1) 程序第一个语句,或 2) 能由条件转移语句或无条件转移语 句转移到的语句,或 3) 紧跟在条件转移语句后面的语句。
2、代码外提
目的:减少循环中代码总数。 方法:把循环不变运算,即其结果独立
于循环执行次数的表达式提到循环的前 面,使之只在循环外计算一次。
(1)P:=0 (2)I:=0
(3)T1:=4*I (4)T2:=addr(A) (5)T3:=T2[T1] (6)T4:=T1 (7)T5:=addr(B) (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20
第十章 代码优化
• 10.1 优化技术简介 • 10.2 局部优化 • 10.3 控制流分析和循环优化
10.1 优化技术简介
一、优化的原则 1、等价原则 优化后不改变原程序运行的功能。 2、有效原则 优化后产生的目标代码运行时间较短,占
用空间较小。
二、优化阶段
源代码
中间代码
目标代码
中间代码优化 目标代码优化
2019/5/7
30
划分为四个基本块
(1) (2) (3)
(4) (5)
(6) (7)
(8) (9)
2019/5/7
31
3、块内优化
主要是进行已知量合并、删除公共子表达式、删 除无用赋值。 注:无用赋值有以下情形:
(a)对某变量A赋值后,在程序中没有引用; (b)对某变量A赋值后,在引用前又重新赋值; (c)对某变量A进行自增赋值,且它仅仅被用在自增 运算中。 对上面第一和第三种情况,应进行全局分析。
入口语句n … … 入口语句m
2019/5/7
20
(2) 对以上求出的每个入口语句,确定其所 属的基本块。它是由该入口语句到下一入 口语句(不包括该入口语句)、或到一转移 语句(包括该转移语句) 之间的语句序列组 成的。
入口语句n … … 入口语句m
入口语句n … … 转移语句m
2019/5/7
21