编译原理第三版 第十章 代码优化

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4) if R=0 goto (8)
(5) X:= Y (6) Y:=R B3 (7) goto (3)
(8) write Y (9) halt
B4
程 序 流 图
4.基本块内的优化
[例]对以下求向量内积的PASCAL程序段的中间代码进行优化: P := 0; (设low=1,w=4) for I := 1 to 20 do (A[I]地址:I*w+(base-low*w) P:= P + A[I] * B[I] (1) P:=0
交换语句的位置. 代数变换.
说明:
无用赋值的判定:
• 对A赋值后, A不被引用 (全局数据流分析)
• 对A赋值后, 引用前又重新赋值 ( 容易判定) • A仅在递归赋值(A:=A+C)中被引用(全局数据 流分析)
#
10.2.2. 基本块的DAG表示及其应用
1. 无环路有向图DAG (Directed Acyclic Graph) (1) 定义: 若有向图中所有通路均非环路, 则称其为DAG (2) 基本块的DAG(用于描述计算过程): a:=b*-c+b*-c的 := 是为结点附加了信息的DAG。 DAG(中间代 a + 码的图形表 叶结点: 示) •下标记: 常数或标识符 * •右标记: 标识符 @ 内结点: b •下标记: 运算符 c • 右标记: 标识符 (2) A:= op B (3) A:=B op C (3) 结点形式 n3 A n2 A (1) A:=B op op n1 A n1 n2 n1 B B C B 0型
(1) P:=0 (2) I:=1
B1
①删除公共子表达式
(3)、(6)为公共子式 可将(6)改为T4:=T1
(2) I:=1
B1
(3)T1:=4*I B2 (4) T2:=addr(A) - 4 (3) T1:=4*I ②进行复写传播 (5) T3:=T2[T1] (4) T2:=addr(A) - 4 T4:=T1 (5) T3:=T2[T1] B2 B2中(6)T6:=T5[T4] (6) T4:= T1 (8) (7) T5:=addr(B) - 4 (6) T4:=4*I T4:=T1 可改为(8)T6:=T5[T1] (8) T6:=T5[T1] (7) T5:=addr(B) - 4 (9) T7:=T3*T6 (8) T6:=T5[T4] T6:=T5[T1] (10) P:=P+T7 (9) T7:=T3*T6 (11) I:=I+1 (10) P:=P+T7 (12) if I≤20 goto (3) (11) I:=I+1 (12) if I≤20 goto (3) 图1 优化前的四元式 图2 删除公共子表达式和复写传播
1. 基本块是指: 程序中一顺序执行的语句(四元式)序列, 其中只有一个入口 (第一个语句), 一个出口(最后一 个语句),执行时只能从入口进入, 出口退出。
2. 划分基本块算法
步骤1. 求出四元式程序中各基本块的入口语句, 它们是: (1) 程序的第一个语句, 或 (2) 由条件或无条件转移语句转到的语句, 或 (3) 紧跟在条件转移语句后面的语句; 步骤2. 构造每一个入口语句所属的基本块, (1) read X 它们是从入口语句到: (2) read Y (1) 下一个入口语句(不包括它), 或 (2) 一转移语句(包括它), 或 (3) R:=X mod Y (3) 一停语句; (4) if R=0 goto (8) 步骤3. 未纳入任一基本块的语句 为控制无法到达的语句, (5) X:=Y 可予删除。 (6) Y:=R (7) goto (3) 〖例〗求最大公因子程序
• 检查公共子表达式:若四元式为公共子表达式,
则把已有的结点作为它的结点(即加右标记); • 检查无用赋值: 若NODE[A]已是某结点的右标记, 则从该右标记集合中删除后再建立新结点。
算法框图:
初始化
取下一条四元式 (0)A:=B、(1)A:=opB、(2)A:=BopC N
NODE(B)定义? Y
(3)T1:=4*I (5) T3:=T2[T1] B2 (8) T6:=T5[T1] (9) T7:=T3*T6 (10) P:=P+T7 (11) I:=I+1 (12) if I≤20 goto (3)
图2 删除公共子表达式和 复写传播
图3删除无用代码和代码外 提
(1) P:=0
(2) I:=1 B1 (4) T2:=addr(A) - 4 ⑤运算强度削弱 (7) T5:=addr(B) - 4 由(3) T1:=4*I (11) I:=I+1 (3)T1:=4*I 可改为: 将(3)外提至B1 (5) T3:=T2[T1] B2 (11)后增加(3‘) (8) T6:=T5[T1] (3’) T1:=T1+4 (9) T7:=T3*T6 (10) P:=P+T7 (11) I:=I+1 (12) if I≤20 goto (3)
(8) write Y (9) halt
3. 程序流图(程序控制流程图) 在基本块的集合上增加控制流信息来表示一个程序。 (1)控制流程图是: 具有唯一首结点的有向图 G = ( N, E, n0 )。
其中:N为结点集, E为有向边集, n0为首结点 所谓首结点, 即它到图中任一结点均有通路。
控制流程图简称为流图。 (2) 程序流图: 流图G = ( N, E, n0 ) 中
图3 删除无用代码和代码外提
图4 运算强度削弱
(1) P:=0
(2) I:=1 B1 (4) T2:=addr(A) - 4 (7) T5:=addr(B) - 4 (3) T1:=4*I (5) T3:=T2[T1] B2 (8) T6:=T5[T1] (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
B1
(1) P:=0
③删除无用代码 ④外提循环不变 式:(4)、(7)为循环
不变式,可外提至 B1中
(2) I:=1 B1 (4) T2:=addr(A) - 4 (7) T5:=addr(B) - 4
(3)T1:=4* I B2 (4) T2:=addr(A) - 4 (5) T3:=T2[T1] (6) T4:= T1 (7) T5:=addr(B) - 4 (8) T6:=T5[T1] (9) T7:=T3*T6 (10) P:=P+T7 (11) I:=I+1 (12) if I≤20 goto (3)
[例]程序的四元式序列:
(1) (2) (3) (4) (5) (6) (7) (8) (9) read X read Y R:=X mod Y if R=0 goto (8) X:= Y Y:=R goto (3) write Y halt
(1) read X (2) read Y
B1
(3) R:=X mod Y B2
方法:循环查找算法、数据流分析;复杂、高效。 全局优化:在整个程序上的优化 方法:全局控制流分析、全局数据流分析; 特点:代价大、高效。
10.2 局部优化
问题: 什么是基本块? 怎样划分基本块? 在基本块中可以进行哪些优化? 怎样进行局部优化? 10.2.1 基本块和流图 对一给定的程序,将其划分为若干个基本块, 在各个基本块中分别进行优化即称为局部优化。
(1) P:=0
(2) I:=1 B1 (4) T2:=addr(A) - 4 (7) T5:=addr(B) - 4 (3) T1:=4*I
(5) T3:=T2[T1] B2 (8) T6:=T5[T1] (9) T7:=T3*T6 (10) P:=P+T7 (11) I:=I+1 (3‘) T1:=T1+4 (12) if I≤20 goto (5)
构造新结点n标记为B (0) Y (1) N B为常数叶结点?
找到标记为B的结点,设为n (2) Y N NODE(C)定义? 生成新结n标为C 找到结点设为n Y B和C都为常数? N
DAG中有唯一后继 为B且标记为op的结? 删除刚生成B结点 有,设为n 构造新结点 n标为P,令 NODE(P)定义? Y N B为其唯一 后继 生成新结n标为P 找到结点设n
结点集N为基本块集; 首结点n0为含有第一个语句的基本块;
有向边集E的构成规则:

i
j
基本块j紧跟在基本块 i 之后, 且基本块 i 的出口语句不是无条件转移语句或停语句; 基本块i 的出口语句是 goto (s) 或 if . . . goto (s) 且 (s) 是基本块j 的入口语句 ;
⑥变换循环控制条件 (1) P:=0 删除归纳变量
(12) if I≤20 goto (5) 分析I的作用: •计算 T1:=4*I •循环控制条件 I≤20 •递归赋值: I:=I+1 变换控制条件: •计数法: I≤20 •比较法: T1≤80 删除(11)
B1
(4) T2:=addr(A) - 4 (7) T5:=addr(B) - 4 (3) T1:=4
1型
2型
2. 基本块DAG构造算法
基本思想:
构造 四元式序列 还原 DAG n
无定义
百度文库
构造算法:
算法大意:
表格结构:标识符(常数)—结点对应表,函数NODE(A)=
对基本块中每一个四元式A:=B op C 执行以下步骤:
• 构造叶结点 NODE[B]、NODE[C], 按四元式类型判转;
•检查合并已知量:若四元式的运算对象均为常数, 则生成该运算结果的结点;
第十章
本章要点
阶段: 编译的第四阶段
代码优化
源程序 词法分析 表 语法分析 格 错

任务:对程序进行各种 等价变换,使得从变换后 的程序出发,能生成更有 效的目标代码。 重点: 局部优化 循环优化
中间代码生成
管 优 理 目标代码生成 目标程序 化 处 理
10.1 优化概述
1. 问题的提出 (1) 编译程序的作用 使计算机的使用方式从用机器语言编程发展到用 高级语言编程。是计算机发展史上的一次飞跃。 (2) 早期编译程序的不足 占用的空间大 目标程序质量差 运行的时间长 2. 解决的方法: 代码优化:即对程序进行各种等价变换,使得从变 换后的程序出发能生成更有效的目标代码。 优化原则:等价、有效、合算
计算P=op B
计算P=Bop C
删除刚生成 的新结B和C
DAG中有以B、 C为后继且标记 为op的结点?
NODE(A)定义? N 将A标记在结点n上
Y
将A 从原 结删除
有,设为n 构造新结点 n标为P,令 N NODE(P)定义? Y B、C为其 生成新结n标为P 找到结点设n 左右后继
[例] 试构造以下基本块的DAG (1) T0:=3.14 (2) T1:=2*T0 (3) T2:=R+S (4) A:=T1*T2 构造DAG n6 (5) B:=A * (6) T3:=2*T0 (7) T4:=R+S n2 (8) T5:=T3*T4 2 T3 (9) T6:=R - S n1 T0 n2 T1 (10) B:=T5*T6 3.14 6.28
[小结]
局部优化: ①删除公共子表达式
⑤合并已知量 ⑥复写传播 ⑦删除无用赋值 循环优化: ②外提循环不变式 ③运算强度削弱 ④变换循环控制条件 优化前后比较: 循环B2 四元式个数 乘法个数 优化前 10 3 优化后 6 1
以上优化方法均可用算法实现
基本块内还可进行以下几种变换 临时变量改名.
⑦合并已知量
(5) T3:=T2[T1] B2 (8) T6:=T5[T1] (9) T7:=T3*T6 (10) P:=P+T7 (3’) T1:=T1+4 (12) if T1≤80 goto (5)
图4. 运算强度削弱
B1中(2) I:=1 (3)T1:=4*I (3) 可改为: (3) T1:=4 图5. 变换循环控制条件与合并 删除(2) 已知量
优化不是目的,只是手段
3. 优化方法 按优化所涉及的程序范围分: 局部优化: 在基本块上进行的优化 • 合并已知量
• 删除无用赋值(无用代码) • 删除多余运算(公共子表达式)
方法:DAG; 特点: 简单、成熟。 循环优化:在循环块上进行的优化 • 代码外提
• 运算强度削弱 • 删除归纳变量
相关文档
最新文档