- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第十章 优化
本章要点
优化概述局部优化基本块的DAG表示及其应用控制流分析和循环查找算法,到达定值与引用定值链,循环优化。
本章目标
考核学生对优化概述,局部优化,基本块的DAG表示及其应用,控制流分析和循环查找算法,到达定值与引用定值链,循环优化等内容的理解和掌握。
本章重点
1.对各类优化的理解,包括常量合并、公共子表达式删除、复写传播、死代码删除、循环优化(代码外提、归纳变量删除、强度削弱)等。
2.控制流分析:掌握建立程序流图的算法和流图中自然循环的识别算法。
本章难点
2. 循环优化;
作业题
一、单项选择题:
在对编译程序产生的中间代码进行优化时,就实施优化的范围来说,分 A 优化和 B 优化。循环优化属于 B 优化,它对于提高目标代码的运行速度是非常有效的。循环优化主要采用的三项优化措施是 C 、 D 、 E 。
二、多项选择题:
1. 2. 在编译程序采用的优化方法中,是在循环语句范围内进行的。
a. 合并已知常量;b. 删除多余运算;c. 删除归纳变量;d. 强度削弱;e. 代码外提;
3. 一下代码可进行哪些优化?
a. 合并已知常量;b. 删除多余运算;c. 删除归纳变量;d. 强度削弱;e. 代码外提;
4. 四元式程序中各个基本块的入口语句是________。
a. 程序第一个语句;b. 能由条件转移语句或无条件转移语句转移到的语句;
c. 紧跟在条件转移语句后面的语句;d. 调用语句;
三、填空题:
四、判断题:
( )
( )五、名词解释:
1.;
六、简答题:
1. 2. 在循环优化中,为什么要代码外提?试说明在哪些情况下可以外提?
3. 如何理解有些程序优化后质量反而下降?
4. 有一C语言程序如下:
1 main( )
2 { int x;
3 x=25;
4 print(“%d\n”, x);
5 }
经过编译连接后,由符号调试器跟踪其执行,却无法检查变量x的值,因为调试器报告“无此变量”。试解释其原因。
七、应用题:
1. 试构造下面的程序的流图,并找出其中所有回边及循环。read Px := 1c := P * Pif c 100 goto L1B := P * Px := x + 1B := B + xwrite xhalt
L1: B:= 10
x := x + 2
B := B + x
write B
if B 100 goto L2
halt
L2: x := x + 1
goto L1
2. 对本题中所示的流图,求出其各结点n的控制结点集D(n)、回边及循环(n0为首结点)。
考虑下面求矩阵A、B成绩的程序片段: BEGIN
FOR i := 1 TO n DO
FOR j := 1 TO n DO
FOR k = 1 TO n DO
c[i, j] := c[i, j] + A[i, k} * B[k, j]
END
(1)假定对数组A、B、C采用静态存储分配,每个字占用4个字节,存储器以字节为单位编址。给出该程序的三地址代码序列。(2)构造该程序相应的流图。(3)删除流图中各基本块内的公共子表达式(4)指出流图中所有回边及其相应循环,并且进行循环优化。试求出如下四元式程序中的循环并进行循环优化I := 1
read J, K
L: A := K * I
B := J * I
C := A * B
write C
I := I + 1
if I 100 goto L
halt
5. 下面是应用筛法求2到N之间素数的程序:begin
read N;
for i := 2 to N do
A[i] := true; /*置初值*/for i := 2 to N**0.5 do /*运算符**代表幂乘*/if A[i] then /*i是一个素数*/for j := 2 * i to N by i do
A[j] := false /*j可被i除尽*/end
(1)试写出其四元式中间代码,假设对数组A用静态分配存储单元,且下届为0;(2)作出流图并求出其中的循环;(3)进行代码外提;(4)进行强度削弱和删除归纳变量;
对下面的程序片段作出其程序流图并计算:(1)各基本块的到达_定值集IN[B];(2)各基本块中各变量引用点的ud链;(3)各基本块出口的活跃变量集V_OUT[B];(4)各基本块中变量定值点的du链。N := 0
L1: I := 2
L2: if I N goto L4
write N
L3: N := N+1
goto L1
L4: J := N/I
if J = 0 goto L3
I := I=1
goto L2
7. 设有如下的基本块:
T1:=A+B
T2
文档评论(0)