编译原理chapter10 优化

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理
i=m-1; j=n ; T1=4*n; v=a[T1];
i=i+1;T2=4*i;T3=a[T2]; if T3<v goto B2
chapter10 优化
B1 每个数组元 素占4个单元
B2
B3 j=j-1;T4=4*j;T5=a[T4];
if T5>v goto B3
B4 if i>=j goto B6
①. 合并已知量
②. 交换语句位置
③. 代数变换
x=pow(y,2); 可变换为 x=y*y; (强度削弱)
以基本块为结点,构造程序的流程图,称为流图。
编译原理
2. 基本块的DAG表示及其应用
chapter10 优化
①.基本块的DAG表示
一个基本块的DAG为如下形式的图: Ⅰ.叶子结点:以一个标识符或常数或变量的地址作为
以下通过一个实例简介各种优化方法。
wenku.baidu.com
编译原理
chapter10 优化
例: void quicksort(int m,int n) { 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; } x=a[i]; a[i]=a[n]; a[n]=x; quicksort(m,j); quicksort(i+1,n); }
重写的代码序列如下:
T0=3.14 T1=6.28 T3=6.28
B8
T5
*
A6B
T2=R+r T0
*
T4= T2
1
A=6.28*T2 3.14
T1 2 T3 T2
6.28
5
+
T4
7
-
T6
T5=A T6=R-r B=T5*T6
34
R
r
编译原理
chapter10 优化
对该基本块还可进行如下优化:
假设T0--T6在基本块后不再使用,即可删除对其的赋值, 得到如下代码:
chapter10 优化
B3 j=j-1;T4=4*j;T5=a[T4];
if T5>v goto B3
我们称这些变量为归纳变量,T2、T4强度削弱后,
i和j 仅在B4中引用,因此可将 i和j 的赋值语句删除
B4 变换为:
B4
if i>=j goto B6
if T2>=T4 goto B6
7. 合并已知量
编译原理
chapter10 优化
Chapter10 优化
编译原理
10.1 概述 10.2 局部优化 10.3 循环优化 *10.4 数据流分析
chapter10 优化
编译原理
chapter10 优化
优化主要为两类:
中间代码的优化(不依赖硬件)
目标代码的优化(依赖硬件) 本章讨论的优化主要指对中间代码进行等价的变换,
Goto B2
编译原理
3. 删除无用代码
B5 T6=T2; x=T3; T7= T2; T8=T4;
T9=T5; a[T2]=T5; T10= T4; a[T4]=T3;
Goto B2
chapter10 优化
B5
a[T2]=T5; a[T4]=T3; Goto B2
B6 T11=4*i; x=a[T11]; T12=4*i; T13=4*n; T14=a[T13]; a[T12]=T14; T15=4*n; a[T15]=x;
T0=3.14 T1=6.28 T3=6.28 T2=R+r T4= T2 A=6.28*T2 T5=A T6=R-r B=T5*T6
T2:=R+r 变换为: A:=6.28*T2
T6:=R-r B:=A*T6
变换为:
T6:=R-r T2:=R+r A:=6.28*T2 B:=A*T6
编译原理
chapter10 优化
使其成为执行效率更高的中间码。
编译前端
代码优化器
代码产生
控制流分析 数据流分析 代码变换 代码优化器的地位和结构
编译原理
chapter10 优化
10.1 概述
优化对代码进行的变换必须遵守以下原则:
1. 等价原则: 经优化的代码执行结果不变;
2. 有效原则: 优化后确实执行时间短、占用空间少;
3. 合算原则: 以较低的代价,换取较好的优化效果。
10.3 循环优化
对循环中的代码可以实行代码外提、强度削弱和 删除归纳变量等优化。
例: i=1;
变换为:
T=4*i;
i=1; T=4;
编译原理
chapter10 优化
经前述各种优化处理后,最终的中间代码如下:
i=m-1; j=n ;
T1=4*n; v=a[T1];
B1
T2=4*i; T4=4*j;
T2=T2+4;T3=a[T2]; if T3<v goto B2
B2
T4=T4+4;T5=a[T4]; if T5>v goto B3
B5
B6
T6=4*i; x=a[T6]; T7=4*i; T8=4*j; T9=a[T8]; a[T7]=T9; T10=4*j; a[T10]=x;
goto B2
T11=4*i; x=a[T11];
T12=4*i; T13=4*n; T14=a[T13]; a[T12]=T14;
T15=4*n; a[T15]:=x;
(4) if R=0 goto (8) (9) halt
入口语句有:(1) (3) (5) (8)
基本块有:{1,2} {3,4} {5,6,7} {8,9}
编译原理
例: (1) read x (2) read y (3) R=x%y (4) if R=0 goto (8)
chapter10 优化
②. 对以上入口语句,构造其所属的基本块: 此入口语句到下一条入口语句前,或下一条跳转
语句前,或一条停语句前的语句序列组成一个基本块。
③.删除未被纳入任何基本块的语句。
例:
(5) x=y
(1) read x
(6) y=R
(2) read y
(7) goto (3)
(3) R=x%y
(8) write y
用+、- 法取代 *、/ 法等强度高的运算。T2=4*i;
B2 i=i+1;T2=4*i; T3=a[T2];
if T3<v goto B2
变换为:
B2 i=i+1;T2=T2+4; T3=a[T2];
if T3<v goto B2
编译原理
6. 删除归纳变量
B2
i=i+1;T2=4*i;T3=a[T2]; if T3<v goto B2
对于给定的一个程序,可以将其划分为一系列的 基本块,分别在块内进行局部优化(基本块内的优化)。
以下先给出划分基本块的算法。 ①. 求出程序中可做基本块入口的语句,它们是: Ⅰ. 程序的第一条语句; Ⅱ. 能由条件转移语句或无条件转移语句转移到的语句;
Ⅲ. 紧跟在条件转移语句后面的语句。
编译原理
chapter10 优化
编译原理
chapter10 优化
1. 删除公共子表达式(多余运算)
B5
T6=4*i; x=a[T6]; T7=4*i; T8=4*j; T9=a[T8]; a[T7]=T9; T10=4*j; a[T10]=x;
goto B2
B5 T6=4*i; x=a[T6];
变换为: T7=T6; T8=4*j; T9=a[T8]; a[T7]=T9; T10= T8; a[T10]=x; Goto B2
(5) x=y (6) y=R (7) goto (3) (8) write y (9) halt
read x B1 read y
R=x%y
B2
if R=0 goto (8)
x=y B3 y=R goto (3)
write y B4 halt
编译原理
chapter10 优化
对基本块内的语句可以进行如下一些优化变换:
T10=T4; a[T4]=x;
Goto B2
B2 i=i+1;T2=4*i;T3=a[T2];
if T3<v goto B2
B3 j=j-1;T4=4*j;T5=a[T4];
if T5>v goto B3
B5 T6=T2; x=T3; T7= T2; T8=T4;
T9=T5; a[T2]=T5; T10= T4; a[T4]=T3;
B2 i=i+1;T2=4*i;T3=a[T2];
if T3<v goto B2
B3 j=j-1;T4=4*j;T5=a[T4];
if T5>v goto B3
B5 T6=T2; x=a[T6]; T7= T6; T8=T4;
T9=a[T8]; a[T7]=T9; T10=T8; a[T10]=x;
B6
变换为:
a[T2]=v; a[T1]=T3;
编译原理
chapter10 优化
4. 代码外提 对循环中的有些代码,若它的结果在循环中不变,
可将这些代码提到循环外,以避免循环执行。
例: while ( i<=limit-2)
变换为:t=limit-2; while ( i<=t)


5. 强度削弱 循环中的代码,由于循环执行多遍,应尽量
Goto B2
编译原理
chapter10 优化
2. 复写传播
B5 T6=T2; x=a[T6]; T7=T6; T8=T4;
T9=a[T8]; a[T7]=T9; T10=T8; a[T10]=x;
Goto B2
B5
T6=T2; x=a[T2];
变换为:
T7=T2; T8=T4; T9=a[T4]; a[T2]=T9;
B3
if T2>=T4 goto B6 B4
B5
B6
a[T2]=T5;
a[T4]=T3; goto B2
a[T2]=V; a[T1]=T3;
编译原理
chapter10 优化
10.2 局部优化
1. 基本块及流图 基本块:程序中一顺序执行的语句系列,其中只有 一个入口和一个出口,第一个语句为入口, 最后一个语句为出口。
标记。标识符可以0为下标,表示初值; Ⅱ.内部结点:以运算符为标记; Ⅲ.各结点可附加多个标识符,表示这些标识符等价,
且具有该结点的值。
编译原理
chapter10 优化
例: T0=3.14 T1=2*T0 T2=R+r A=T1*T2 B=A
T3=2*T0 T4=R+r T5=T3*T4 T6=R-r B=T5*T6
相关文档
最新文档