编译原理第八章 优化

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

⑴(= 5 _ B ) ⑵(* 2 3.14 _ t1) ⑶(+ R r t2 ) ⑷(/ t1 t2 t3 ) ⑸(= t3 _ A )
⑹(* 2 3.14 t4 ) ⑺(+ R r t5 ) ⑻(/ t4 t5 t6 ) ⑼(- R r t7 ) ⑽(* t6 t7 t8 ) ⑾(= t8 _ B )
t1=6.28
t4 =6.28 t5≡t2 t6≡t3
优化后
A=2*3.14/(R+r); B=A*(R-r); ⑴(= 5 _ B )
⑶(+ R r t2 ) ⑷(/ 6.28 t2 t3 ) ⑸(= t3 _ A )
B 没有引用!
⑼(- R r t7 ) ⑽(* t3 t7 t8 ) ⑾(= t8 _ B )
如:a=b*d+1;e=b*d-2; …… b*d是公共表达式! 注 则可优化为 t=b*d; a=t+1; e=t-2;
若:b=b*d+1; e=b*d-2; 则 b*d不是公共表达式!
⒊ 删除无用赋值
如:a=b+c;x=d-e;y=b;a=e-h/5; 则 a=b+c 为无用赋值! 则可优化为 x=d-e;y=b;a=e-h/5; a 未有应用!!
ni A n1 B
※ 四元式序列的DAG表示示例:
【例8.2】 求下述语句片断的DAG表示:
为什么 B=5; A=2*3.14*(R+r); B=2*3.14*(R+r)/R-r); 要位置
ⅰ. 根据四元式序列构造优化的DAG:
交换?
⑴B=5 ⑵t1=2*3.14 ⑶t2=R+r ⑷t3=t1*t2 ⑸A=t3 ⑹t4=2*3.14
② 则前一赋值点为无用赋值;

Βιβλιοθήκη Baidu
8.4 基于DAG的局部优化方法
DAG(Directed Acyclic Graph)是指无环有向图;这里用 来对基本块内的四元式序列进行优化。
8.4.1 四元式序列的DAG表示
⒈ DAG的结点内容及其表示:
前驱 ni M|A1,A2,A3,…
后继
n1
DAG
n2 n3
n4 n5
ni: 结点的编码; : 运算符( 运算对象为其后继节点); M : 主标记(叶结点时,是变量和常数的初值); Ai :附加标记(运算结果变量;为便于描述等价关系,
可设置多个)i=1,2,3,…。
(接上页)
⒉ 单个四元式的 DAG表示:
❖ 赋值 ( = B _ A ) 或 A = B
ni B|A
第 8 章 优化处理
优化处理是指产生更高效的目标代码所做的工作。
内容 提要
8.1 优化的分类 8.2 常见的几种优化方法 8.3 局部优化算法探讨 8.4 基于DAG的局部优化方法
8.1 优化的分类
⑴ 与机器无关的优化(在源代码或中间代码级上进行); 又分两种: ①全局优化— 针对整个源程序。
※②局部优化— 除全局优化外皆属此类。 ⑵ 与机器有关的优化(目标代码级上的优化):
/ 8 tB8||tB8
⑺t5=R+r ⑻t6=t4*t5 ⑼t7=R-r ⑽t8=t6/t7 ⑾B=t8
则可优化为
t,i 线性关系
i=1;t=4*i; while (t<400){t=t+4; b=a*a;…;}
8.3 局部优化算法探讨
※ 局部优化算法是以基本块为单位进行的,基本块 也是目标代码生成的基本单位。
【定义】基本块是程序中一段顺序执行的语 句序列,其中只有一个入口和一个出口。
8.3.1 基本块划分算法
x=1; a:r=x*5; if(x<10){x=x+1;goto a;}
对应的四元式序列 ⑴ x=1
r=0;
※以基本块为结点的 程序流图,如下所示:
⑵ lb a ⑶ t1=x*5
⑷ r=t1 ⑸ t2=x<10
⑹ if(t2)_
⑺ t3=x+1

⑻ x=t3

⑼ gt a
基 本
⑽ ie _

⑾ r=0
※ 优化的基本算法设计:
• 常值表达式节省(例8.2中的 ⑵⑹): 方法:① 先进行常值计算;
② 取常值的变量以常值代之; • 公共表达式节省(例8.2中的 ⑺⑻): 方法:① 找公共表达式,建立结果变量等价关系;
② 等价变量以老变量代替新变量; • 删除无用赋值(例8.2中的 ⑴): 方法:① 确认一个变量两个赋值点间无引用点;
B1 X=1
B2
⑵lb a ⑶t1=x*5
⑷r=t1 ⑸t2=x<10
B3
⑹if(t2)_
true
false B4
⑺t3=x+1 ⑻x=t3 ⑽ ie _
⑼ gt a
⑾ r=0
8.3.2 局部优化过程示例
【例8.2】基本块内设有语句片断:
优化 过程
B=5; A=2*3.14/(R+r); B=2*3.14/(R+r)*(R-r);
包括: ※ ① 寄存器分配的优化; ② 消除无用代码。
8.2 常见的几种局部优化方法
⒈ 常值表达式节省(常数合并)
如:a=5+3;b=a+1; ……. 5+3,a+1 皆为常值表达式! 注 则可优化为 a=8;b=9;
若:a=5+3;…;a=x…; a=a+1; 则 a+1 不是常值表达式!
⒉ 公共子表达式节省(删除多余运算)
⒋ 不变表达式外提(循环优化之一)
即把循环不变运算,提到循环外。
如:i=1; while(i<100){x=(k+a)/i;…;i++;}
则可优化为 i=1;t=k+a;
循环不变表达式
while (i<100){x=t/i;…;i++;}
⒌ 消减运算强度(循环优化之二)
即把强度大的运算换算成强度小的运算。 如:i=1; while(i<100){ t=4*i;b=a↑2;…;i++;}
❖ 双目运算 ( B C A ) 或 A = B C
❖ 单目运算 ( B _ A ) 或 A=B
n2 A n1 B
n3 A n1 B n2 C
❖ 下标变量赋值运算
A=B[C] [ ] n3 A
B[C]=D [ ] n4
❖ 转向 ( [B] _ A )
可选
n2 A
n1 B n2 C
n1 B n2 C n3 D
1.找出基本块的入口语句,它们是: ⑴ 程序的第一个语句或 转向语句转移到的语句; ⑵ 紧跟在转向语句后面的语句。。
2.对每一入口语句,构造其所属的基本块: ⑴ 从该入口语句到另一入口语句之间的语句序列; ⑵ 从该入口语句到另一转移语句(或停止语句)之间 的语句序列;
※ 基本块划分示例:
【例8.1】设有源程序片段:
相关文档
最新文档