编译原理清华大学第2版第11章代码优化精品PPT课件
合集下载
编译原理第十一章解析
![编译原理第十一章解析](https://img.taocdn.com/s3/m/74306a55cf84b9d528ea7a42.png)
25
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.。
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.。
编译原理 课件第十一章
![编译原理 课件第十一章](https://img.taocdn.com/s3/m/17f5caeb81c758f5f61f6727.png)
11.2 局部优化:基本块内的优化 局部优化:
基本块:是指程序中一顺序执行的语句序列, 基本块:是指程序中一顺序执行的语句序列,其中只有一个 入口语句和一个出口语句。 入口语句和一个出口语句。 入口语句: 入口语句: 1. 程序的第一个语句;或者, . 程序的第一个语句;或者, 2. 条件转移语句或无条件转移语句的转移目标语句;或者 . 条件转移语句或无条件转移语句的转移目标语句; 3. 紧跟在条件转移语句后面的语句。 . 紧跟在条件转移语句后面的语句。
main() { int x, y, z; x = (1+20)*( -x); ( ) y = x*x+(x/y); y = z = (x/y)/(x*x); }
tmp1 = 1 + 20 ; tmp2 = -x ; x = tmp1 * tmp2 ; tmp3 = x * x ; tmp4 = x / y ; y = tmp3 + tmp4 ; tmp5 = x / y ; tmp6 = x * x ; z = tmp5 / tmp6 ; y = z ;
11.1 11.2 11.3 11.4
什么是代码优化 局部优化 控制流程分析和循环 数据流分析举例
11.1 优化技术简介
何谓代码优化: 宗旨: 获得较好性能的代码 宗旨: 等价 意图,结果, 意图,结果,权衡 目标代码优化 阶段: source front I.R code target code generator code 用户 中间代码优化
第十一章 代码优化
为了让编译程序能够生成效率高的目标代码, 为了让编译程序能够生成效率高的目标代码, 应对中间代码进行优化 注意:优化≠ 注意:优化≠最佳化 要求:相对合理性。 要求:相对合理性。应考虑空间和时间上的 取舍,及二者的平衡。 取舍,及二者的平衡。 本章将介绍基于结构信息的优化 基于结构信息的优化。 本章将介绍基于结构信息的优化。 假定 优化对象是四元式序列的中间代码
《编译原理》课件
![《编译原理》课件](https://img.taocdn.com/s3/m/a1256348a7c30c22590102020740be1e650eccd3.png)
代码生成
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类
编译器可以将高级语言编写的源代码转换成机器语言或低级语言,以便在特定的硬件平台上运行。编 译器还可以生成可执行文件或动态链接库等二进制文件。
编译器在人工智能领域的应用
机器学习编译器
机器学习编译器可以将机器学习模型转换成可执行代码,以便在嵌入式设备或边缘计算 设备上运行。这种编译器可以优化模型的计算性能和内存占用,提高模型的运行效率。
3
缺点
对于某些复杂文法,可能导致大量的无用推导和 状态爆炸。
自底向上的语法分析
分析步骤
从输入符号序列的最后一个符号开始,逐步向上构建语法树,直 到找到与文法中的某个产生式右部匹配的符号串。
优点
可以充分利用已知信息,避免不必要的推导和状态爆炸。
缺点
对于某些复杂文法,可能导致大量的无用归约和状态爆炸。
04
中间代码生成
中间代码生成的定义和任务
定义
中间代码生成是编译器的一个阶段,将源代码转换成中间代码的过程。
任务
将源代码转换成一种中间表示形式,以便进行后续的优化和目标代码生成。
三地址代码的生成
01
三地址代码是一种中间代码形 式,由一系列的三元式组成。
02
三元式的形式为(op, arg1, arg2),表示执行一个操作(op) 并产生一个结果,操作数arg1 和arg2来自寄存器、常数或之 前的计算结果。
语义分析
检查AST是否有语义错误,如类型错 误、未定义的变量等。
中间代码生成
将AST转换为中间代码,通常是三地 址代码。
代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换为机器语言代码, 能够在特定硬件上执行。
编译器的分类
slide11
![slide11](https://img.taocdn.com/s3/m/a3596b054a7302768e9939b2.png)
B1 {d1,d2} {d3,d4 ,d5}
for i := 1 to n {
newin := OUT[p]; if newin IN[Bi] { change := ture; } } } IN[Bi] := newin; OUT[Bi] : = (IN[Bi] – KILL[Bi]) GEN[Bi] //pP[Bi]
数据流分析基础
B5
{ }
{ }
数据流分析基础
到达-定值数据流分析
数据流方程求解过程举例
对于右边的流图,如下是上页 数据流方程的一个求解过程:
GEN KILL IN
{d3} {d1,d2} {d2, d3}
《编译原理》
d1 I:=2 d2 J:=I+1 d3 read I
B1
B2
OUT
{d1,d2} {d2, d3} {d3,d4} {d5} { }
d4 J:=J+1 d5 J:=J-4 B4 B3
B1 {d1,d2} {d3,d4 ,d5}
B2
B3 B4 B5
{d3} {d4} {d5} { }
{d1}
{d2 ,d5} {d4} { }
d6 write I d7 write J
B5
{ }
{ }
数据流分析基础
到达-定值数据流分析
数据流方程求解过程举例
基本块、流图和循环
循环(loop)
支配结点集(dominators)
《编译原理》
如果从流图的首结点出发,到达 n 的任意通路都要经过 m, 则称 m 支配 n, 或 m 是 n 的支配结点,记为 m DOM n (a. a DOM a) 结点n 的所有支配结点的集合, 称为结点 n 的支配结点集, 记为D(n).
《编译原理》课件
![《编译原理》课件](https://img.taocdn.com/s3/m/60683662bdd126fff705cc1755270722182e5979.png)
了解中间代码生成的概念和它在编译过程中的角色。 学习四元式和三地址码的表示和生成方式,以及中间代码优化的技巧。
六、代码生成
了解目标机器的指令系统和存储结构,以及它们对代码生成的影响。 学习寄存器分配和目标代码生成的基本原理和方法。
七、附录
参考文献提供了进一步学习编译原理的资源。 课程总结将回顾课程中学到的重要知识,并概述关键概念和技术。 问题解答将回答学生在课程学习中提出的问题。 课程评价将收集学生对课程的反馈和评价,以便对将来的课程进行改进。
《编译原理》PPT课件
编译原理PPT课件将带您深入了解编译原理的重要概念和技术。这个课程介绍 了编译原理的意义以及编译过程的概述。
一、引言
课程介绍编译原理的重要性,让您理解为什么编译原理对于软件开发非常关 键。 编译过程的概述将带您了解传统的编译过程中涉及的各个阶段和任务。
二、词法分析
词法分析是编译过程中的第一步,了解词法分析的作用以及它在编译器中的 实现。 掌握正则表达式和有限自动机的概念,这些是实现词法分骤,理解它的作用和不同的语法分析方法。 学习上下文无关文法以及LL(1)语法分析器和LR(1)语法分析器的实现原理。
四、语义分析
语义分析是编译过程中的重要一环,了解它的作用和涉及的任务。 学习语义动作、符号表管理和类型检查,以及如何进行语法制导翻译。
五、中间代码生成
六、代码生成
了解目标机器的指令系统和存储结构,以及它们对代码生成的影响。 学习寄存器分配和目标代码生成的基本原理和方法。
七、附录
参考文献提供了进一步学习编译原理的资源。 课程总结将回顾课程中学到的重要知识,并概述关键概念和技术。 问题解答将回答学生在课程学习中提出的问题。 课程评价将收集学生对课程的反馈和评价,以便对将来的课程进行改进。
《编译原理》PPT课件
编译原理PPT课件将带您深入了解编译原理的重要概念和技术。这个课程介绍 了编译原理的意义以及编译过程的概述。
一、引言
课程介绍编译原理的重要性,让您理解为什么编译原理对于软件开发非常关 键。 编译过程的概述将带您了解传统的编译过程中涉及的各个阶段和任务。
二、词法分析
词法分析是编译过程中的第一步,了解词法分析的作用以及它在编译器中的 实现。 掌握正则表达式和有限自动机的概念,这些是实现词法分骤,理解它的作用和不同的语法分析方法。 学习上下文无关文法以及LL(1)语法分析器和LR(1)语法分析器的实现原理。
四、语义分析
语义分析是编译过程中的重要一环,了解它的作用和涉及的任务。 学习语义动作、符号表管理和类型检查,以及如何进行语法制导翻译。
五、中间代码生成
chp11
![chp11](https://img.taocdn.com/s3/m/cadd60fa941ea76e58fa0423.png)
2
优化的目的是为了获得更高效的代码,必须遵 循以下原则: (1)等价原则:优化后不能改变程序运行的结果 (2)有效原则:优化后所产生的目标代码运行时间 更短、占用的存储空间更小 (3)合算原则:尽可能以较低的代价获取较好的优 化效果。 常用的优化技术: 1.删除多余运算 2.循环不变代码外提 3.强度削弱 4.变换循环控制条件 5.合并已知量与复写传播 6.删除无用赋值 7.代数化简
4
常数传播
_tmp4 = 0 ; f0 = _tmp4 ; _tmp5 = 1 ; f1 = _tmp5 ; _tmp6 = 2 ; i = _tmp6 ;
优化
f0 = 0 ; f1 = 1 ; i = 2 ;
5
代数简化
x+0 = x 0+x = x x*1 = x 1*x = x 0/x = 0 x-0 = x b && true = b b && false = false b || true = true b || false = b b = 5 + a + 10 ; 优化前: 优化前: _tmp0 = 5 ; _tmp1 = _tmp0 + a ; _tmp2 = _tmp1 + 10 ; b = _tmp2 ; 优化后: 优化后: _tmp0 = 15 ; _tmp1 = a + _tmp0 ; b = _tmp1 ;
12
11.2局部优化 局部优化 局部优化就是以程序的基本块为范围进行局部优化。 11.2.1基本块和流图 基本块和流图 基本块:程序中一顺序执行的语句序列,其中第一句为其 基本块 唯一的入口,最后一句为其唯一的出口。 划分四元式为基本块的算法: 1)求四元式程序中各个基本块的入口语句: (1)程序的第一个语句 (2)能由条件转移语句或无条件转移语句转移到的语句 (3)紧跟在条件转移语句后面的语句 2)对每一个入口语句,其基本块是由该入口语句到下一个 入口语句(不包括此入口语句)、或到一个转移语句(包括 此转移语句)、或到一个停语句(包括此停语句)之间的语 句序列组成。 3)将未划入基本块的语句删除。
编译原理 代码优化
![编译原理 代码优化](https://img.taocdn.com/s3/m/3952baaf951ea76e58fafab069dc5022abea4653.png)
B6 t11 := 4 * i x := a[t11] t13 := 4 * n t14 := a[t13]
a[t11] := t14 a[t13] := x
•优化举例
公共子表达式删除-基本块间
t2:=4 * i : B2 -- B5
t4:= 4 * j : B3 -- B5
B5 t6 := 4 * i x := a[t6] t8 := 4 * j t9 := a[t8] a[t6] := t9 a[t8] := x goto B2
•优化举例
快速排序程序片段如下, i = m 1; j = n; v = a[n]; while (1) { do i = i +1; while(a[i]<v);
do j =j 1;while (a[j]>v); if (i >= j) break;
x=a[i]; a[i]=a[j]; a[j]=x; }
- 代码外提 - 归纳变量删除 - 强度削弱
例:while (i <= limit 2 ) …
变换成 t = limit 2; //为什么提出循环? while (i <= t ) …
•优化举例
强度削弱和归纳变量删除
j和t4的值步伐一致地变化 这样的变量叫做归纳变量
在循环中有多个归纳变量时, 也许只需要留下一个 这个操作由归纳变量删除 过程来完成
do j =j 1;while (a[j]>v); if (i >= j) break;
x=a[i]; a[i]=a[j]; a[j]=x; }
x=a[i]; a[i]=a[n]; a[n]=x;
//B4 (13) if i >= j goto (23)
编译原理清华第十一章代码优化
![编译原理清华第十一章代码优化](https://img.taocdn.com/s3/m/6dd2a5a831b765ce04081491.png)
把T1的值复写到T4 (4)T6:=T5[T1] 复写传播
3. 删除无用赋值 有些变量的赋值从未被引用,称为无用赋值,应删除。 无用赋值分三种情况: – 变量被赋值,但在程序中从未被引用(在局部范围内难判定) – 变量赋值后未被引用又重新赋值,则前面赋值是无用的 – 变量的赋值只被计算变量自己引用,其他变量都不引用它
之间的语句序列组成的。
3.凡未被纳入某一基本块的语句,是不会被执行到的语句, 可以把它们删除。
例:
((11)) rreeaadd XX (2) read Y ((33)) RR::==XX mmoodd YY (4) if R=0 goto (8) (5) X:=Y ((65)) YX::==RY (7) goto (3) (8) write Y (98) hwarlite Y
第11章 代码优化
学习目标: 掌握:基本块的划分、基本块的DAG优化 理解:什么是局部优化、循环优化、全局优化 了解:循环优化技术
11.1 优化技术简介 11.2 局部优化 11.3 循环优化简介
11.1 优化技术简介
什么是优化: 所谓优化是对代码进行等价变换,使得变换后的代码的效率 更高(节省运行时间、存储空间或两者兼而有之) 优化可在编译的不同阶段进行,最主要的优化有 – 中间代码优化(不依赖具体计算机) – 目标代码优化(依赖于具体计算机)
(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
11.3.2 循环优化
1. 代码外提 把循环不变运算,即其结果独立于循环执行次数的表达式, 提到循环的前面,使之只在循环外计算一次,这种优化称为 代码外提。 循环不变运算:运算量为常量或在循环外定值,每次循环时 其值不变的运算。
3. 删除无用赋值 有些变量的赋值从未被引用,称为无用赋值,应删除。 无用赋值分三种情况: – 变量被赋值,但在程序中从未被引用(在局部范围内难判定) – 变量赋值后未被引用又重新赋值,则前面赋值是无用的 – 变量的赋值只被计算变量自己引用,其他变量都不引用它
之间的语句序列组成的。
3.凡未被纳入某一基本块的语句,是不会被执行到的语句, 可以把它们删除。
例:
((11)) rreeaadd XX (2) read Y ((33)) RR::==XX mmoodd YY (4) if R=0 goto (8) (5) X:=Y ((65)) YX::==RY (7) goto (3) (8) write Y (98) hwarlite Y
第11章 代码优化
学习目标: 掌握:基本块的划分、基本块的DAG优化 理解:什么是局部优化、循环优化、全局优化 了解:循环优化技术
11.1 优化技术简介 11.2 局部优化 11.3 循环优化简介
11.1 优化技术简介
什么是优化: 所谓优化是对代码进行等价变换,使得变换后的代码的效率 更高(节省运行时间、存储空间或两者兼而有之) 优化可在编译的不同阶段进行,最主要的优化有 – 中间代码优化(不依赖具体计算机) – 目标代码优化(依赖于具体计算机)
(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
11.3.2 循环优化
1. 代码外提 把循环不变运算,即其结果独立于循环执行次数的表达式, 提到循环的前面,使之只在循环外计算一次,这种优化称为 代码外提。 循环不变运算:运算量为常量或在循环外定值,每次循环时 其值不变的运算。
《编译原理课件》PPT课件
![《编译原理课件》PPT课件](https://img.taocdn.com/s3/m/bbaf71b6195f312b3069a511.png)
它是源程序的一种内部表示形式。 设计中间代码的原则:一是容易生成,二是
容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
容易翻译成目标代码。 常用的中间代码有三地址码、四元式、三元
式、间接三元式、逆波兰表示(后缀式)、 树形表示等。
14
中间代码:四元式
例: id1:=id2+id3*10
sum:=first+count*10 翻译为四元式中间代码的形式:
5
1.2 编译程序的工作过程与结构
一个编译程序的整个工作过程是划分成阶段 进行的,每个阶段将源程序从一种表示形式 转换成另一种表示形式。
编译阶段的典型划分方法是划分为5个基本阶 段:词法分析、语法分析、语义分析产生中 间代码、代码优化、代码生成。
掌握编译过程的5个基本阶段,是学习编译原 理课程的基本内容。
29
自编译:T形图表示
PASCAL2
A代码
PASCAL2
A代码
PASCAL1 PASCAL1
A代码 A代码
用PASCAL1语言 编写的功能更
强的PASCAL2语 言编译程序的
A代码
已有的PASCAL1 语言的编译程序
自编译得到
功能更强的
PASCAL2语言 的编译程序
源程序
注意:T形图的组合规则:① ②
Java语言的操作平台无关性的实现就是如此。
26
1.3 编译程序的开发
构造编译程序,可以:
1. 使用机器语言或汇编语言作工具构造 2. 使用高级语言作工具构造 3. 使用机器语言或汇编语言构造编译程序的核心
部分,使用高级语言构造编译程序的扩充部分 4. 使用编译程序自动生成工具构造
使用高级语言作工具构造编译程序可以大大节 省程序设计的时间,并且编译程序易于阅读、 维护和移植。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
goto(3)
9
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)
(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)
2021/2/4
(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)
2021/2/4
5
1.删除多余运算(删除公共子表达式): 目的:提高目标代码速度。
例如:(假设数组元素占用空间为4个字 节)
P:=0 for I:=1 to 20 do
P:=P+A[I]*B[I]
2021/2/4
6
(1)P:= 0
(2)I:=0
变址取数
(3)T1:=4*I (4)T2:=addr(A)
goto(5)
2021/2/4
(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 <g=o8t0o(5)
tmp3 = tmp1 * tmp1 ;
tmp5 = tmp3 * tmp1 ;
c = tmp5 + tmp3 ;
2021/2/4
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)
goto(3)
2021/2/4
(1)P:=0 (2)I:=0 (4)T2:=addr( A) (7)T5:=addr(B)
(3)T1:=4*I ((56))TT34::==TT21[T1] (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20
7
2、代码外提
目的:减少循环中代码总数。 方法:把循环不变运算,即其结果独立
于循环执行次数的表达式提到循环的前 面,使之只在循环外计算一次。
2021/2/4
8
(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
2021/2/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)
13
5、合并已知量与复写传播
• 编码时的已知量—常数,可在编译时 计算出它的值,这种变换称为合并已 知量或常数合并。
• 通过复制后没有再改变的值可以互相 替换,不会改变程序的结果,这种变 换称为复写传播。
2021/2/4
14
复写传播
tmp2 = tmp1 ; tmp3 = tmp2 * tmp1; tmp4 = tmp3 ; tmp5 = tmp3 * tmp2 ; c = tmp5 + tmp4 ;
(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)
第十一章 代码优化
• 11.1 优化技术简介 • 11.3 控制流分析和循环优化
2021/2/4
1
11.1 优化技术简介
一、优化的原则 1、等价原则 优化后不改变原程序运行的功能。 2、有效原则 优化后产生的目标代码运行时间较短,占
用空间较小。
2021/2/4
2
二、优化阶段
源代码
中间代码
目标代码
中间代码优化 目标代码优化
•与机器无关的优化---中间代码优化。 •依赖于机器的优化---目标代码优化。
2021/2/4
3
三、优化分类
(1)局部优化:对基本块内的代码进行优化 (2)循环优化:对循环中的代码进行优化 (3)全局优化:在整个程序范围内的优化
2021/2/4
4
四、常用优化技术简介
1.删除多余运算 2.循环不变代码外提 3.强度削弱 4.变换循环控制条件 5.合并已知量与复写传播 6.删除无用赋值
11
4、变换循环控制条件
• 经过变换后,有些变量不被引用,可 以从循环中删除。
2021/2/4
12
(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
9
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)
(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)
2021/2/4
(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)
2021/2/4
5
1.删除多余运算(删除公共子表达式): 目的:提高目标代码速度。
例如:(假设数组元素占用空间为4个字 节)
P:=0 for I:=1 to 20 do
P:=P+A[I]*B[I]
2021/2/4
6
(1)P:= 0
(2)I:=0
变址取数
(3)T1:=4*I (4)T2:=addr(A)
goto(5)
2021/2/4
(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 <g=o8t0o(5)
tmp3 = tmp1 * tmp1 ;
tmp5 = tmp3 * tmp1 ;
c = tmp5 + tmp3 ;
2021/2/4
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)
goto(3)
2021/2/4
(1)P:=0 (2)I:=0 (4)T2:=addr( A) (7)T5:=addr(B)
(3)T1:=4*I ((56))TT34::==TT21[T1] (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20
7
2、代码外提
目的:减少循环中代码总数。 方法:把循环不变运算,即其结果独立
于循环执行次数的表达式提到循环的前 面,使之只在循环外计算一次。
2021/2/4
8
(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
2021/2/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)
13
5、合并已知量与复写传播
• 编码时的已知量—常数,可在编译时 计算出它的值,这种变换称为合并已 知量或常数合并。
• 通过复制后没有再改变的值可以互相 替换,不会改变程序的结果,这种变 换称为复写传播。
2021/2/4
14
复写传播
tmp2 = tmp1 ; tmp3 = tmp2 * tmp1; tmp4 = tmp3 ; tmp5 = tmp3 * tmp2 ; c = tmp5 + tmp4 ;
(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)
第十一章 代码优化
• 11.1 优化技术简介 • 11.3 控制流分析和循环优化
2021/2/4
1
11.1 优化技术简介
一、优化的原则 1、等价原则 优化后不改变原程序运行的功能。 2、有效原则 优化后产生的目标代码运行时间较短,占
用空间较小。
2021/2/4
2
二、优化阶段
源代码
中间代码
目标代码
中间代码优化 目标代码优化
•与机器无关的优化---中间代码优化。 •依赖于机器的优化---目标代码优化。
2021/2/4
3
三、优化分类
(1)局部优化:对基本块内的代码进行优化 (2)循环优化:对循环中的代码进行优化 (3)全局优化:在整个程序范围内的优化
2021/2/4
4
四、常用优化技术简介
1.删除多余运算 2.循环不变代码外提 3.强度削弱 4.变换循环控制条件 5.合并已知量与复写传播 6.删除无用赋值
11
4、变换循环控制条件
• 经过变换后,有些变量不被引用,可 以从循环中删除。
2021/2/4
12
(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