第11章 代码优化
编译原理第十一章解析
![编译原理第十一章解析](https://img.taocdn.com/s3/m/74306a55cf84b9d528ea7a42.png)
26
此处要用到的有向图,是一种其结点带有下述标记或附 加信息的DAG: ① 图的叶结点,即无后继的结点,以一标识符(变 量名)或常数作为标记,表示这个结点代表该变量或常数 的值。如果叶结点用来代表某变量A的地址,则用addr (A)作为这个结点的标记。通常把叶结点上作为标记的 标识符加上下标0,以表示它是该变量的初值。 ② 图的内部结点,即有后继的结点,以一运算符作为 标记,表示这个结点代表应用该运算符对其后继结点所代 表的值进行运算的结果。 ③ 图中各个结点上可能附加一个或多个标识符,表 示这些变量具有该结点所代表的值。
30
下面是仅含0,1,2型四元式的基本块的DAG构造算法。
首先,DAG为空。 对基本块的每一四元式,依次执行: 1. 如果NODE(B)无定义,则构造一标记为B的叶结点并定 义NODE(B)为这个结点; 如果当前四元式是0型,则记NODE(B)的值为n,转4。 如果当前四元式是1型,则转2.(1)。 如果当前四元式是2型,则:(Ⅰ)如果NODE(C)无定义, 则构造一标记为C的叶结点并定义NODE(C)为这个结点,(Ⅱ) 转2.(2)。 2. (1) 如果NODE(B)是标记为常数的叶结点,则转2.(3), 否则转3.(1)。 (2) 如果NODE(B)和NODE(C)都是标记为常数的叶结 点,则转2.(4),否则转3.(2 (3) 执行op B(即合并已知量),令得到的新常数为P。如 果NODE(B)是处理当前四元式时新构造出来的结点,则删除它。 如果NODE(P)无定义,则构造一用P做标记的叶结点n。置NODE (P)=n,转4.。 (4) 执行B op C(即合并已知量),令得到的新常数为P。如 果NODE(B)或NODE(C)是处理当前四元式时新构造出来的结 点,则删除它。如果NODE(P)无定义,则构造一用P做标记的叶 结点n。置NODE(P)=n,转4.。
7hh第11章 代码优化
![7hh第11章 代码优化](https://img.taocdn.com/s3/m/511d8c9371fe910ef12df882.png)
注意: ① 转移语句结点的右边可附加一语句 位置, 用于指示转移目标, 其余结点 的右边只允许附加标识符;
② 数组元素赋值的结点有三个后继 , 其余结点最多只有两个后继。
利用DAG进行优化的基本思想: 首先按基本块内四元式序列的顺 序把所有四元式构造成一个 DAG, 然后按构造结点的次序将 DAG 还 原成四元式序列。 由于在构造 DAG 的同时作了局部 优化{合并已知量、删除公共子表 达式、删除无用赋值}, 因此, 得到 的是优化的四元式序列。
DAG构造算法的基本步骤: (1) 构造叶结点 (2) 合并已知量 (3) 构造op结点 {删除公共子表达式} (4) 添加附加信息 {删除无用赋值}
基本块的DAG构造算法: { 仅含0,1,2型四元式: A=B, A= op B, A=B op C } (1) 构造叶结点: 若 Node(B) 无定义 , 则构造一标记 为B的叶结点, 并做下述处理: ①若当前四元式是0型, 转(4); ②若当前四元式是1型, 转(2)①; ③若当前四元式是2型, 则 若Node(C)无定义, 则构造一标 记为C的叶结点; 转(2)②;
两者对比:
(1) T0 = 3.14 (2) T1 = 2*T0 (3) T2 = R+r (4) A = T1*T2 (5) B = A (6) T3 = 2*T0 (7) T4 = R+r (8) T5 = T3*T4 (9) T6 = R-r (10) B = T5*T6
(1) T0=3.14 (2) T1=6.28 (3) T3=T1 (4) T2=R+r (5) T4=T2 (6)A=6.28*T2 (7) T5=A (8) T6= R−r (9) B=A*T6
11.1.2 基本块的DAG表示
第11章代码优化
![第11章代码优化](https://img.taocdn.com/s3/m/18ab19d176eeaeaad1f3305c.png)
四元式相应的DAG
编 译 原 理 代 码 优 化
(1)A:= op B 1型
首页
结束
编 译 原 理 代 码 优 化
首页
结束
基本块的DAG构造算法
该算法只对如下三种四元式构造DAG:
编 译 原 理 代 码 优 化
0型
l型 2型
A:=B
A:=op B A:=B op C
op是双目运算符还可以是=[]或[]=。
首页
结束
根据优化所涉及的程序范围分成:
编 译 原 理 代 码 优 化
局部优化:基本块范围内的优化:合并已知量 消除公共子表达式,削减计算强度和删除无用 代码 循环优化:主要是基于循环的优化,包括循环 不变式外提,归纳变量删除,计算强度削减。 全局优化:主要是在整个程序范围内进行的优 化。 因为程序段是非线性的,因此需要分析程 序的控制流和数据流,处理比较复杂。
编 译 原 理 代 码 优 化
1.如果NODE(B)无定义,则构造一标记为B的叶结 点并定义NODE(B)为这个结点;
如果当前四元式是0型,则记NODE(B)的值为n,转4。 如果当前四元式是1型,则转2.(1)。 如果当前四元式是2型,则: (I) 如果NODE(C)无定 义,则构造一标记为C的叶结点并定义NODE(C) 为这 个结点; (II) 转2.(2)
首页 结束
基本块的DAG构造算法
2.(合并已知量)
编 译 原 理 代 码 优 化
(1)如果NODE(B)是标记为常数的叶结点 ,则转 2(3),否则转3.(1)。 (2)如果NODE(B)和NODE(C)都是标记为常数的叶 结点,则转2.(4),否则转3.(2)。 (3)执行op B(即合并已知量),令得到的新常数 为P。如果NODE(B)是处理当前四元式时新构造出来 的结点,则删除它。如果NODE(P)无定义,则构造 一用P做标记的叶结点n。置NODE(P)=n,转4。 (4)执行B op C(即合并已知量),令得到的新常 数为P。如果NODE(B)或NODE(C)是处理当前四元 式时新构造出来的结点,则删除它。如果NODE(P) 无定义,则构造一用P做标记的叶结点n。置 NODE(P)=n,转4。
信息学院06版《编译原理》课程教学大纲
![信息学院06版《编译原理》课程教学大纲](https://img.taocdn.com/s3/m/acc6271a52d380eb62946db1.png)
《编译原理》课程教学大纲课程编号:(先不填)英文名称:Compiler Construction Principles课程类型:专业基础课学时/学分:40+16/3.5授课对象:本科生先修课程:高等数学,数据结构,C程序设计课程简介:本课程是计算机专业学生的一门重要专业基础课,本课程属于计算机科学与技术专业的一门重要的专业必修课。
通过本课程学习,使学生掌握编译程序的一般构造原理,包括语言基础知识、词法分析程序设计原理和构造方法。
各种语法分析技术和中间代码生成符号表的构造、代码优化、并行编译技术常识及运行时存储空间的组织等基本方法和主要实现技术。
它有一定的理论性,又有一定的实践性, 尤其是本课程的知识与计算机应用中很多领域有紧密联系与广泛应用。
了解与掌握本课程的基本内容将有利于学生提高专业素质和适应社会多方面需要的能力。
教学目的和要求:教学目的:培养学生掌握构造编译程序的基本原理与设计方法,为培养计算机语言与大型应用程序的开发人才打下良好的基础。
本课程坚持理论与实践教学并重的原则,理论上主要叙述语言和文法的形式定义、自动机理论、词法分析、语法和语义分析、优化和代码生成等环节的基本理论和方法,与此同时,通过上机实习构造简单语言的编译程序等编辑器使学生掌握开发应用程序的基本方法。
教学要求:通过本课程的学习, 学生应掌握形式语言理论与编译实现相关的基础概念, 了解与掌握编译程序构造的基本原理与技术, 从形式语言理论的角度, 进一步认识与理解程序设计语言及其与编译程序的联系。
做习题是理解课程中基本概念、培养思考能力和解题能力的重要方面, 要求学生认真做好习题, 并注意解题规范化。
学生也应重视配合教学, 做好上机实习。
教学内容:第1章编译程序概述(2学时)1、教学内容:1)什么是编译程序2)编译过程概述3)编译程序的结构4)编译阶段的组合5)编译技术和软件工具2、教学重点:编译程序的结构3、教学难点:编译程序的结构,以及每一阶段任务第3章文法与语言(6学时)1)文法的直观概念2)符号和符号串3)文法与语言的形式定义4)文法的分类5)上下文无关文法及其语法树6)句型的分析7)有关文法实用中的一些说明2、教学重点:与编译技术密切相关的一些术语和概念。
编译原理课后第十一章答案
![编译原理课后第十一章答案](https://img.taocdn.com/s3/m/5607a7f19e3143323968937b.png)
对假设(2) B:=3 D:=A+C E:=A*C F:=D+E K:=B*5 L:=K+F
计算机咨询网()陪着您
10
《编译原理》课后习题答案第十一章
第7题 分别对图 11.25 和 11.26 的流图: (1) 求出流图中各结点 n 的必经结点集 D(n)。 (2) 求出流图中的回边。 (3) 求出流图中的循环。
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
i:=m-1 j:=n t1:=4*n v:=a[t1] i:=i+1 t2:=4*i t3:=a[t2] if t3< v goto (5) j:=j-1 t5:=4*j t5:=a[t4] if t5> v goto (9) if i >=编译原理》课后习题答案第十一章
第 5 题: 如下程序流图(图 11.24)中,B3 中的 i∶=2 是循环不变量,可以将其提到前置结点吗? 你还能举出一些例子说明循环不变量外移的条件吗?
图 11.24 答案: 不能。因为 B3 不是循环出口 B4 的必经结点。 循环不变量外移的条件外有: (a)(I)s 所在的结点是 L 的所有出口结点的必经结点 (II)A 在 L 中其他地方未再定值 (III)L 中所有 A 的引用点只有 s 中 A 的定值才能到达 (b)A 在离开 L 之后不再是活跃的,并且条件(a)的(II)和(III)成立。所谓 A 在离开 L 后不再是活跃的是指,A 在 L 的任何出口结点的后继结点的入口处不是活跃的(从此点后 不被引用) (3)按步骤(1)所找出的不变运算的顺序,依次把符合(2)的条件(a)或(b)的 不变运算 s 外提到 L 的前置结点中。如果 s 的运算对象(B 或 C)是在 L 中定值的,则只有 当这些定值四元式都已外提到前置结点中时,才可把 s 也外提到前置结点。
代码优化概述
![代码优化概述](https://img.taocdn.com/s3/m/108759f5f61fb7360b4c6545.png)
代码优化概述1.1.代码优化简介代码优化是指对程序进行各种等价变换,使得从变换后的程序出发,能生成更高效的目标代码。
目标代码的质量,通常有两个衡量的标准:空间效率和时间效率。
有时空间优化也会导致时间优化(如减少指令条数),但通常它们是一对矛盾,不能兼顾。
代码优化的目的是产生更高效的代码,使程序以更快的速度、占用更少的空间运行。
对于编译器,代码优化分为三个阶段:图1-1 代码优化流程图为了获得更优化的程序,可以从各个环节着手。
首先,在源代码这一级,程序员可以通过选择适当的算法和安排适当的实现语句来提高程序的效率。
其次,再设计语义动作时,要尽可能产生高效的中间代码,同时还可以安排专门的编译优化阶段对中间代码进行各种等价变换,改进代码的效率。
最后,在目标代码这一级上,应该考虑如何有效地利用寄存器,如何选择指令,以及进行窥孔优化等。
对于编译优化,最主要的时机是在语法、语义分析生成中间代码之后,在中间代码上进行。
这一类优化不依赖于具体的计算机,而取决于语言的结构。
另一类优化则是在生成目标程序时进行的,它在很大程度上与具体的计算机有关。
由优化编译程序提供的对代码的各种变换必须遵循如下原则[1]:1)等价:经过优化后不改变程序运行的结果;2)有效:优化后产生的目标代码运行时间较短,占用的存储空间较小;3)合算:应尽可能以较低的代价取得较好的优化效果。
如果为实现一种优化变换所花时间和精力,以及编译器编译源程序时的额外开销,不能从目标程序的运行中得到补偿,那么是没有意义的。
在设计一个编译程序时,究竟应考虑哪些优化项目以及各种优化项目进行到何种程度,应权衡利弊,根据具体情况而定。
其中,控制流分析主要目的是分析出程序的循环结构.循环结构中的代码的效率是整个程序的效率的关键。
数据流分析进行数据流信息的收集,主要是变量的值的定义和使用情况的数据流信息.包括到达-定值分析;可用表达式;活跃变量。
最后,根据上面的分析,对中间代码进行等价变换。
代码优化
![代码优化](https://img.taocdn.com/s3/m/1f1992ff3186bceb18e8bb00.png)
主要内容
优化的概念 代码优化的基本技术 局部优化 机器代码优化-窥孔技术
2
11.1 代码优化的概念
代码优化在整个编译过程的位置
源程序 编译前端 中间代码 中间代码生成 中间代码 目标代码生成 目标程序
中间代码
中间代码优化
目标代码优化
程序员和编译器可能改上程序的位置
同样,可以对归纳变量i和t2进行强度消弱。
17
11.2 代码优化的基本技术
对t4 := j*4 和t2 := i*4完成强度消弱以后, 变量i和j除了在B4中语句if i>= j goto B6
之外,不再被引用。因此,可以删除这 些归纳变量i和j,把这个语句变换为if t2 >= t4 goto B6。 经过强度消弱和删除归纳变量,图11.7以及 图11.5最后就变换为图11.8。
11
11.2 代码优化的基本技术
删除公共子表达式后的B5和B6 分别是
B5
B6
t6 := t2 x := a[t6] t7 := t6 t8 := t4 t9 := a[t8] a[t7] := t9 t10 := t8 a[t10] := x goto B2
t11 := t2 x := a[t11] t12 := t11 t13 := t1 t14 := a[t12] a[t12] := t14 t15 := t1 a[t15] := x
这种变换称为代码外提。在给出的快速排序程序中, 没有可以代码外提之处。
16
11.2 代码优化的基本技术
强度消弱和删除归纳变量
考察图11.7的循环B3。j和t4的值保持着线性关系 t4 := j*4,每循环一次,j的值每减1,t4的值就减 去4。这种变量称为归纳变量。
北京航空航天大学《编译原理》第11章 代码优化(2)
![北京航空航天大学《编译原理》第11章 代码优化(2)](https://img.taocdn.com/s3/m/b019113567ec102de2bd8940.png)
global_c s_c
运行栈
子程序/函数运行时所需的基本空间 进入子程序/函数时分配,地址空间向下生长 (从高地址到低地址) 从子程序/函数返回时,当前运行栈将被废弃 递归调用的同一个子程序/函数,每次调用都 将获得独立的运行栈空间
运行栈
一个典型的运行栈包括
函数的返回地址 全局寄存器的保存区 临时变量的保存区 未分配到全局寄存器的局部变量的保存区 其他辅助信息的保存区
主要内容
中间代码(补充) 代码生成 代码优化 现代编译技术综述
代码生成
代码生成器的总体设计 目标程序 运行时的存储管理 指令选择 寄存器的分配和管理
代码生成器在编译系统中的位置
中间代码 源程序 前端 优化器
中间代码
代码生成 器
目标程序
符号表
教学编译器架构
代码生成器的输入
源程序的中间表示
线性表示(波兰式) 三地址码(四元式) 栈式中间代码(P-CODE/Java Bytecode) 图形表示
丰富的运行库支持
J2ME:CLDC1.1, MIDP2.0, etc. J2SE:SWING, AWT, etc.
Java字节码举例: z = x + 1
iload x iconst_1 iadd
mov eax, esi add eax, 1
x 1 x x+1
esi 1 esi eax
istore z
(下载到本地)
Class loader
(Bytecode verification)
Java class libraries
Java Just-in-time Interpreter compiler
Run-time System Java 字节码 (*.class)
第11章 代码优化 new
![第11章 代码优化 new](https://img.taocdn.com/s3/m/958cba8d83d049649b6658a0.png)
数等价的集合:如x:=x+0 x:=x*1 x:=y**2(变换成x:=y*y)
例如四元式程序: t1 := 4 – 2 t2 := t1 /2 t3 := a * t2 化简为: t1 := a + a t1 := b + t1 c := t1 * t1
t4 := t3 * t1
t5 := b + t4 c := t5 * t5
这种变换把循环不变运算,提到循环前面。上例中,可
以把(4)和(7)提到循环外,经过删除多余运算和代码外提后, 代码变换成图11.3:
9
3.强度削弱:
把强度大的运算换算成强度小的运算,例如把乘法运 算换成加法运算。在图11.3中,可以把循环中计算T1值的
乘法运算变换成在循环前进行一次乘法运算,而在循环中
因此,图11.4中,四元式(3)可变为T1=4,
12
5.合并已知量不复写传播:
复写传播 复写传播是指尽量不引用那些 在程序中仅仅只传递信息而不改 变其值,也不影响其运行结果的 变量。
图中,T4 就是这样一种变量。四元式 (6)T4=T1,下一个四元式 (8)T6=T5[T4],这之间T4的值没有 变化,因此将(8) 变换为 : T6=T5[T1] 。
21
例 给以下四元式序列划分基本块。
(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
27
Java代码优化ppt课件
![Java代码优化ppt课件](https://img.taocdn.com/s3/m/dac1e723b7360b4c2e3f6475.png)
好处:
DW缓存优化
1.写和读分离
2.实时告警处理和告警查询日志分开
3.写增加线程处理,读增加cache处理
16
问题:运行一S段m时间a内tc存h溢e出r内存问题
方法:jmap
17
Smatcher内存问题 1.zkClient$7就是监听数据变更的通知对象
2.进一步查找:居然有1w多个监听器 3.日志:不停的有新客户端注册过来,其实是一样的,新注册就会添 加listener。。。
5
告警统计效率优化
数据:neList 1000w的网元集合,alarmMap<neId,alarm>10w的告警map 问题:根据object_class统计告警数,执行慢 方法:jstack,内存换效率 1.替换耗时的方法。 如:java的crc32换成 hadoop里的crc32 2.换一种思路实现,内存换效率
结论:查看代码修改注册机制
18
Java对象占用内存了解
原生类型(primitive type)的内存占用如下:
Primitive Type Memory Required(bytes)
boolean
1
byte
1
short
2
char
2
int
4
float
4
long
8
2、选择正确的优化指标
选择正确的指标,是优化的一个重要组成部分,你需要按照这些指标来测量优化工作的进展情况。如 果指标选择不恰当,或者完全错误,你所做的努力有可能白费了。即使指标正确,也必须有一些辨别。 在某些情况下,将最多的努力投入到运行消耗时间最多的那部分代码中,这是实用的策略。但也要记住, Unix/Linux内核的大部分时间花费在了空循环上。需要注意的是,如果你轻易选择了一个很容易达到的 指标,这作用不大,因为没有真正解决问题。你有必要选择一个更复杂的、更接近你的目标的指标。
第11章代码优化
![第11章代码优化](https://img.taocdn.com/s3/m/3e951056cc175527072208b8.png)
(29) t15 := 4n
/* 程序段结束*/
(15) x := a[t6]
(30) a[t15] := x
quicksort(m, j);
quicksort(i+1, n); }
图11.4 快速排序部分程序的三地址代码
图11.3 快速排序的C代码
8
11.2 代码优化的基本技术 i := m -1 j := n
goto B2
t11 := 4i
B6
x := a[t11]
t12 := 4i
t13 := 4n
t14 := a[t12]
a[t12] := t14
t15 := 4n
a[t15] := x
9
11.2 代码优化的基本技术
例如,在图11.5的B5中分别把公
共子表达式4*i和4*j的值赋给t7和 这是仅限于基本块的局部优化,
主要内容
❖ 优化的概念 ❖ 代码优化的基本技术 ❖ 局部优化 ❖ 机器代码优化-窥孔技术
1
11.1 代码优化的概念
代码优化在整个编译过程的位置 ❖ 源程序 编译前端 中间代码 中间代码生成 中间代码 目标代码生成 目标程序
中间代码
中间代码优化
目标代码优化
程序员和编译器可能改上程序的位置
源程序
编译前端
(3)经济原则:代码优化需要占用计算机和编译 程序的资源,代码优化取得的效果应该超出优化 工作所付出的代价。否则,代码优化就失去了意 义。
3
11.1 代码优化的概念
❖ 代码优化依据机器相关性、优化范围和优化语言级别的 分类
按照与机器相关的程度,可以分为与机器相关的代码优化和与 机器无关的代码优化。 ❖ 与机器相关的优化一般有寄存器的优化、多处理器的优化、特 殊指令的优化以及无用指令的消除等技术。显然, 这几类优 化与具体机器的特性密切相关,例如寄存器的总数,寄存器的 具体使用规定,等等。这类优化通常的在目标代码生成之后进 行。 ❖ 与机器无关的优化是在目标代码生成以前进行,主要是根据程 序的控制信息和数据信息,对程序进行优化,与机器无关。
编译第11章
![编译第11章](https://img.taocdn.com/s3/m/cfb05371168884868762d6b7.png)
6.删除无用赋值
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4 (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)P:=0 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4
3.强度削弱
•基本思想:把强度大的运算换算成强度小的。 例如: a) i*2 = 2*i = i+i = i<<1 b) i/2 = (int)(i*0.5) c) 0-1 = -1 d) f*2 = 2.0 * f = f + f e) f/2.0 = f*0.5
(1)P:=0
(2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (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.删除多余运算 2.循环不变代码外提 3.强度削弱 4.变换循环控制条件 5.合并已知量与复写传播 6.删除无用赋值
1.删除多余运算(删除公共子表达式):
目的:提高目标代码速度。 例如: P:=0 for I:=1 to 20 do P:=P+A[I]*B[I]
(1)P:=0 (2)I:=1
n1
D
n2
C
n3
B
4、DAG结点的数据表示法
第11章 代码优化
![第11章 代码优化](https://img.taocdn.com/s3/m/e2f1545fbe23482fb4da4c2b.png)
X+1 X:=X+1 Y-1 Y:=Y-1 A<B
Z:=0
相应四元式代码的分块情况如下:
B1: (=:, 1 ,—, Y ) B2: (label,—,—,100) (>, A, B, T1) (then,T1,—,—) B3: (=:, 0, —, X ) (else,—,—, —) B4: (=:, 0 , —,Y ) Y:=1
C*B D+C*B D:=D+C*B
被省略
D+C*B A:=D+C*B
被省略
D+C*B C:=D+C*B
其中四元式2,5,8的运算符、OPR1、OPR2 均相等 但5、8中的D与2中的不同所以不可以 用T2代替T4、T6。 四元式5和8相同因此四元式8对5是多 余的。
经优化后可得到下列四元式代码: 1.(*, C, B,T1) 2.(+, D, T1,T2) 3.(=:,T2,—,D) 4.( )被省略 5.(+, D, T1,T3) 6.(=, T3,—,A) 7.( )被省略 8.( )被省略 9.( =:,T3,—,C)
其中四元式1,4,7的运算符、OPR1、 OPR2均相等,所以可以用T1代替T3、T5。 1.(*,C, B, 2.(+, D, T1, 3.(=:,T2,—, 4.( 5.(+, D, T1, 6.(=:,T4,—, 7.( 8.(+, D, T1, 9.(=: T6,—, T1) T2) D ) ) T4) A ) ) T6) C )
该四元式是否为赋值语句)
4. 如果QT[i].OPRj(j=1,2)都是常数,则计算结 果,填VVL表,并删除四元式QT[i]: ENTRY(QT[i].RESU, cons) (填写表中值) QT[i]:=($, -, -, -) (四元式节省)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本块类似程序中的函数,软件 工程中的模块。 基本块的特点是其中的代码要么全 执行,要么全不执行,不能在中途转出, 也不能从中间转入。
基本块的划分方法: 1. 把第一个四元式作为第一个基本块的入 口四元式。
第一个四元式 ……
2. 当遇标号性四元式时,结束当前块,并作 为新块的入口四元式。
标号性四元式
2
1 3 3 1 4 4
多边扫描公共表达式节省算法:
设新老变量名表为ML,每当一个四元 式被节省时要填写ML表。 1.置ML表为空,令所有量均无编码,i:=i0. 2.若QT[i]的OPR1或OPR2∈ML,则用ML中的 老名代替OPR1或OPR2. (使用新老变量名表ML) 3.若QT[i]为非考虑类,则转8.(处理下一四元式) 4.对QT[i]中的三个变量进行编码. 5.若QT[i].ω=“=:”,则转8.
例:设有程序段: D:=D+C*B; A:=D+C*B; C:=D+C*B;
问:是否可以写成下面的程序? T:=D+C*B; D:= T; A:= T; C:= T;
它的四元式所构成的基本块为: 1.(*,C, B, T1) C*B 2.(+, D, T1, T2) D+C*B 3.(=:,T2,—, D ) D:=D+C*B 4.(*, C, B, T3) C*B 5.(+, D, T3, T4) D+C*B 6.(=:,T4,—, A ) A:=D+C*B 7.(*, C, B, T5) C*B 8.(+, D, T5, T6) D+C*B 9.(=: T6,—, C ) C:=D+C*B
公共表达式节省是通过四元式的节省 来实现的。目前已提出多种实现方法,其 中包括:值编码法,依赖数法,逻辑尺法, DAG法等。
值编码方法: 按一定规则给四元式中的每个变量进 行编码,使得具有相同编码的变量具有相 同值。判定两个四元式是否等价的方法是 看其分量的编码是否分别相同。
判断四元式等价的关键是判断两个变量的 值是否等价。使问题复杂化的主要因素是间接 变量的存在。 间接变量:引用型形参变量 存复合变量地址的临时变量
标号性四元式
X+1 X:=X+1 Y-1 Y:=Y-1 A<B
转移性四元式 转移性四元式 标号性四元式
Z:=0
程序图如下:
B1 B2
B3
B5
B4
B6
B7
11.3 常表达式节省 常表达式节省也叫合并常数。它 的优化范围通常取基本块。 优化工作可在生成四元式的同时 进行,也可在生成四元式后进行。前 一种方法叫单遍扫描法,而后一种叫 多遍扫描法。
X+1 X:=X+1 Y-1 Y:=Y-1 A<B
Z:=0
相应四元式代码的分块情况如下:
B1: (=:, 1 ,—, Y ) B2: (label,—,—,100) (>, A, B, T1) (then,T1,—,—) B3: (=:, 0, —, X ) (else,—,—, —) B4: (=:, 0 , —,Y ) Y:=1
标号性四元式
A>B
转移性四元式
X:=0
转移性四元式
Y:=0
B5: ( ifend,—,—,—) ( +, X , 1, T2 ) ( =:, T2, —,X ) ( —, Y , 1 , T3 ) ( =:, T3, —, Y ) ( < , A , B , T4 ) ( then, T4, —, — ) B6: ( goto, —,—,100 ) B7: ( ifend, —, —, — ) ( =: 0 , —, Z )
4. 如果QT[i].OPRj(j=1,2)都是常数,则计算结 果,填VVL表,并删除四元式QT[i]: ENTRY(QT[i].RESU, cons) (填写表中值) QT[i]:=($, -, -, -) (四元式节省)
转向6.其中ENTRY是填写VVL表的子程序, cons表示计算结果的CONSL表地址.若有同名 项,则只改内容. 5.若QT[i].ω≠“:=”则转向6;否则 (赋值语句) (a)若QT[i].OPR1是常数,则填VVL表: ENTRY(QT[i].RESU, QT[i].OPR1) (b)若QT[i].OPR1是非常数,则删VVL表: DELET(QT[i].RESU) 其中DELET(X)表示从VVL表删去包含X名字 的项,如果没有那种项,则什么也不做.
合并后的 ($,-,-,-) (=:,7,-,i) ($,-,-,-) (=:,10,-,j) ($,-,-,-) ($,-,-,-) (=:,24,-,k) ($,-,-,-) ($,-,-,-) (+,94,m,T7) (=,T7,-,l)
VVL表 1.(T1,7) 2.(i,7) 3.(T2,10) 4.(j,10) 5.(T3,14) 6.(T4,24) 7.(k,24) 8.(T5,70) 9.(T6,94)
A±0 处理为A A/1 处理为A 0/A 处理为0 等等。 3.合并符号:(-X)*(-Y)处理为X*Y 4.用乘法代替指数运算: A**2 处理为A*A A**3 处理为A*A*A 等。
11.2 基本块
基本块可定义于原代码,中间代码, 也可定义于目标代码。 关于目标代码的基本块的定义是: 说一个目标代码是基本块,当且仅当该 段只有一个入口和一个出口。 定义于原代码,中间代码的基本块 定义类似。
例:(下边四元式中没有间接变量) X:=1 Z:=X*Y X:=1 W:=X*Y 得到的四元式如下:
四 元 式 1.(=:,1,-,X) 2.(*, X,Y,T1) 3.(=:, T1,-,Z) 4.(=:, 1,-,X) 5.(*, X, Y,T2) 6.(=:, T2,-,W)
编
码 2
1 1 3 1 1 4
3.对操作数B类似步骤2。 4.对于C的处理过程是: a) (=:, A, -, C)情况 IF direct(C) THEN n(C):=n(A) ELSE n(C):=# b) ([ ],A,B,C),(· ,A,B,C)情况 n(C):=# c) 其他情况: IF n(A)=# ∨ n(B)=# THEN n(C):=# ELSE n(C):=newn
转移性的四元式有:
( goto, —, —, l ) ( then, B, —, — ) ( else, —, —, — ) ( whend,—, —, — ) ( call, g, —, — ) ( call, f, —, T ) 等。
例子:设有一程序段 Y:=1; 100:if A>B then X:=0 else Y:=0; X:=X+1; Y:=Y-1; if A<B then goto 100; Z:=0;
第11章 代码优化
11.1 代码优化种类
从代码的范围上分为 :
局部优化
全局优化
主要的局部优化有基本块上的优化 和循环上的优化。
基本块上的优化主要有常表达式节 省(合并常数)、公共表达式节省(消除 多余运算)。
循环上的优化主要有不变表达式外 提和削减运算强度。
除了这些较典型的优化外还有: 1.消除无用赋值。 2.删除无用的0和1: A*1 处理为A A*0 处理为0
其中四元式1,4,7的运算符、OPR1、 OPR2均相等,所以可以用T1代替T3、T5。
1.(*,C, B, 2.(+, D, T1, 3.(=:,T2,—, 4.( 5.(+, D, T1, 6.(=:,T4,—, 7.( 8.(+, D, T1, 9.(=: T6,—, T1) T2) D ) ) T4) A ) ) T6) C )
11.4 公共表达式节省
公共表达式节省的范围是一个基本块。 如果两个四元式的ω和OPR1及OPR2的值分 别相同,则称这两个四元式等价。如果在 基本块中出现多个等价四元式,则除了第 一个外其他的均可节省。
公共表达式节省工作是通过四元式
的节省来实现的。实现四元式节省的关键 是判别两个四元式是否等价。
C*B D+C*B D:=D+C*B
Hale Waihona Puke 被省略D+C*B A:=D+C*B
被省略
D+C*B C:=D+C*B
其中四元式2,5,8的运算符、OPR1、OPR2 均相等 但5、8中的D与2中的不同所以不可以 用T2代替T4、T6。 四元式5和8相同因此四元式8对5是多 余的。
经优化后可得到下列四元式代码: 1.(*, C, B,T1) 2.(+, D, T1,T2) 3.(=:,T2,—,D) 4.( )被省略 5.(+, D, T1,T3) 6.(=, T3,—,A) 7. ( )被省略 8. ( )被省略 9.( =:,T3,—,C)
……
3. 当遇转移性四元式时,结束当前块,并作为 当前块的出口四元式。他们的后继四元式作为 新的入口四元式。
转移性四元式 ……
4. 当遇形如(=:, A , —, X)的赋值四元式(其中X为 引用形参)时,结束当前块,并作为该块的出口 四元式。
含引用形参 赋值四元式 ……
标号性的四元式有: ( label,—,—, l ) ( while,—,—, — ) ( proc, q,Noff,Moff ) ( func, f,Noff,Moff ) ( ifend,—,—, — ) 等。
为了判断一个变量是否依赖于间接变量,引 进编码 # ,首先使间接变量取编码#; 其次,假设 (ω, A , B , C) 且A , B 中有一个编码取#,则令C的 编码取#。如果四元式有一分量的编码为#,则该 四元式就不可节省。
设当前四元式为(ω, A, B, C),且用 newn表示新的编码值。 值编码规则: 1.开始对一切X,令n(X)=0,以表示未 编过码。 2.若操作数A是未编过码的并且是非 间接变量,则给新的编码(否则给老的编 码) IF indirect(A) THEN N(A):=# ELSE IF n(A)=0 THEN n(A)=newn