当前位置:
文档之家› 《编译原理教程》课后习题答案 第五章 代码优化
《编译原理教程》课后习题答案 第五章 代码优化
第五章 代码优化 5.6 出: (1) 各结点的必经结点集合D(n); (2) 流图中的回边与循环。 J=0 L1:I=0 if I< 8 goto L3 试画出如下中间代码序列的程序流图,并求
L2:A=B+C
B=D*C
第五章 代码优化 L3:if B =0 goto L4 write B
提到前置结点B2′中,同时在B3中I=I+1之后给C增加一
个常量1。进行强度削弱后的结果如图5-7所示。
第五章 代码优化
A=0 I=1 B=J+1 C=B+I
B1
′ B2
B2 L :A=C+A 1 if I=100 goto2L F I=I+1 C=C+1 goto L 1 B3 T L :write A B4 2 halt
运算,所以只能进行加法运算的强度削弱。从图5-5中
可以看到,B2中的C=B+I,变量B因代码外提其定值点已 在循环之外,故相当于常数。而另一加数I值由B3 中的
I=I+1决定,即每循环一次I值增1;也即每循环一次,
B2中的C=B+I其C值增量与B3中的I相同,即常数1。因此, 我们可以对C进行强度削弱,即将B2中的四元式C=B+I外
第五章 代码优化 5.8 对下面四元式代码序列: A=0
I=1
L1: B=J+1 C=B+I
A=C+A
if I=100 goto L2 I=I+1 goto L1 L2: write A
halt
第五章 代码优化 (1) 画出其控制流程图; (2) 求出循环并进行循环的代码外提和强度削弱 优化。 【解答】 (1) 在构造程序的基本块的基础上画出 该程序的流图,如图5-5所示。
b=a-d0
d=b c=d+c0
第五章 代码优化 5.5 对于基本块P: S0=2 S1=3/S0 S2=T-C S3=T+C
R=S0/S3
H=R S4=3/S1 S5=T+C S6=S4/S5
H=S6*S2
第五章 代码优化 (1) 应用DAG对该基本块进行优化; (2) 假定只有R、H在基本块出口是活跃的,试写
环可通过回边求得,即找出由结点B2、结点B3以及有通
路到达B3但不经过B2的所有结点。所以,由回边组成的 B3→B2循环是{ B2,B3}。
进行代码外提就是将循环中的不变运算外提到循
环入口结点前新设置的循环前置结点中。经检查,找 出的不变运算为B2中的B=J+1。因此,代码外提后的程 序流图如图5-6所示。
出优化后的四元式序列。
【解答】 列为 S0=2 S4=2 (1) 根据DAG图得到优化后的四元式序
S1=1.5
S2=T-C
第五章 代码优化 S3=T+C S5=S3 R=2/S3 S6=R H=S6*S2
(2) 若只有R、H在基本块出口是活跃的,优化后的四 元式序列为
S2=T-C S3=T+C R=2/S3 H=R*S2
第五章 代码优化
第五章 代码优化
5.1 完成以下选择题: (1) 优化可生成 a. 运行时间较短 的目标代码。
b. 占用存储空间较小
c. 运行时间短但占用内存空间大 d. 运行时间短且占用存储空间小
第五章 代码优化 (2) 下列 a. 强度削弱 优化方法不是针对循环优化进行的。 b. 删除归纳变量
(2) b在该基本块出口处活跃;
请分别给出下列代码经过优化之后的代码: (1) a=b+c (3) c=b+c (2) b=a-d (4) d=a-d
第五章 代码优化
n5 c + n4 - n2 a + n0 b0 n1 c0 n3 d0 b, d
图5-2 习题5.4的DAG图
第五章 代码优化 【解答】 后的代码为 a=b0+c0 d=a-d0 c=d+c0 (2) 当b在出口活跃时,生成优化后的代码为 a=b0+c0 (1) 当b在出口处不活跃时,生成优化
…
…
ni1
ni2 …
…
nij n
图5-4 具有回边n→d的流图
第五章 代码优化 证明过程如下: (1) 令结点d、结点n以及有通路到达n而该通路不经过d 的所有结点构成集合L(即图5-4中的全部结点),则L必定是 强连通的。为了证明这一点,令M=L-{d,n}。由L的组成成分 可知 M 中 每 一结点 ni 都可以不 经过 d 而到 达 n。又因 d DOM
(2) 基本块i的出口语句是goto(s)或if…goto(s),并
且(s)是基本块j的入口语句。 应用上述方法求出本题所给程序的基本块及程序 流图见图5-1,图中的有向边、实线是按流图画法(1)画 出的,虚线是按流图画法(2)画出的。
第五章 代码优化
read(A,B) F=1 C=A*A D=B*B ifC<D gotoL 1 B1
c. 删除多余运算
(3) 基本块内的优化为 。
d. 代码外提
a. 代码外提,删除归纳变量 b. 删除多余运算,删除无用赋值 c. 强度削弱,代码外提
d. 循环展开,循环合并
第五章 代码优化 (4) 在程序流图中,我们称具有下述性质 列为一个循环。 a. 它们是非连通的且只有一个入口结点 b. 它们是强连通的但有多个入口结点 c. 它们是非连通的但有多个入口结点 的结点序
d. 们是强连通的且只有一个入口结点
(5) 关于必经结点的二元关系,下列叙述中不正确的 是 。
a. 满足自反性
c. 满足反对称性 【解答】 (1) d (2) c (3) b
b. 满足传递性
d. 满足对称性 (4) d (5) d
第五章 代码优化 5.2 何谓局部优化、循环优化和全局优化?优化工作在
第五章 代码优化
A=0 I=1
B1
B2 L :B=J+1 1 C=B+I A=C+A if I=100 goto2L F I=I+1 goto L 1 B3 T L :write A B4 2 halt
图5-5 习题5.8的程序流图
第五章 代码优化 (2) 很容易看出,B3→B2是流图中的一条有向边, 并且有B2 DOM B3 ,故B3→B2 为流图中的一条回边。循
n2 n3
n5 L :I=I+1 4 if I<8 goto2L
n6 L :J=J+1 5 if J<=3 goto 1 L halt n7
图5-3 习题5.6的程序流图
第五章 代码优化 由于有n5→n2 和n6→n1 ,而n2 不是n5 的必经结点,n1 是n6 的必经结点,所以n6→n1 为回边;即该回边表示的
D(n4)={n0,n1,n3,n4}
D(n5)={n0,n1,n3,n5} D(n6)={n0,n1,n3,n6} D(n7)={n0,n1,n3,n6,n7} 程序流图如图5-3所示。
第五章 代码优化
J=0 n0
L :I=0 1 if I<8 goto3 L
n1
L :A=B+C 2 B=D*C L :if B=0 goto L 3 4 write B n 4 goto L 5
编译的哪个阶段进行? 【解答】 优化根据涉及的程序范围可分为三种。 (1) 局部优化是指局限于基本块范围内的一种优化。一 个基本块是指程序中一组顺序执行的语句序列(或四元式序
列),其中只有一个入口(第一个语句)和一个出口(最后一个
语句)。对于一个给定的程序,我们可以把它划分为一系列的 基本块,然后在各个基本块范围内分别进行优化。通常应用 DAG方法进行局部优化。
E=A*A B2 F=F+1 E=E+F write(E) halt
B3 L :E=B*B 1 F=F+2 E=E+F write(E) if E>100 goto2L halt B4 L :F=F-1 B5 2 goto L 1
图5-1 程序流图
第五章 代码优化 5.4 基本块的DAG如图5-2所示。若: (1) b在该基本块出口处不活跃;
结点之间必有一通路,L中任意两个结点之间亦必有一
通路。此外,由M中结点性质可知:d到M中任一结点ni 的通路上所有结点都应属于M,ni 到n的通路上所有结
点也都属于M。因此,L中任意两结点间通路上所有结
点都属于L,也即,L是强连通的。
第五章 代码优化 (2) 因为对所有ni∈L,都有d DOM ni,所以d必为L 的一个入口结点。我们说d也一定是L的唯一入口结点。 如不然,必有另一入口结点d1∈L且d1≠d。d1 不可能是 首结点,否则d DOM n不成立(因为有d DOM d1,如果d1 是首结点,则d就是首结点d1的必经结点,则只能是d=d1, 与d≠d1矛盾)。现设d1不是首结点,且设d1在L之外的前 驱是d2 ,那么,d2 和n之间必有一条通路d2→d1→…→n, 且该通路不经过d,从而d2应属于M,这与d2∈L矛盾。所 以不可能存在上述结点d1 ,也即d是循环的唯一入口结 点。 至此,我们已经满足了循环的定义:循环是程序流 图中具有唯一入口结点的强连通子图,也即,L是包含 回边n→d的循环,d是循环的唯一入口结点。
goto L5
L4:I= I+1 if I<8 goto L2 L5:J= J+1 if J<=3 goto L1
halt
第五章 代码优化 【解答】 (1) 各结点的必经结点集分别为 D(n0)={n0}
D(n1)={n0,n1}
D(n2)={n0,n1,n2} D(n3)={n0,n1,n3}
第五章 代码优化 (2) 循环优化是指对循环中的代码进行优化。例 如,如果在循环语句中某些运算结果不随循环的重复
执行而改变,那么该运算可以提到循环外,其运算结
果仍保持不变,但程序运行的效率却提高了。循环优 化包括代码外提、强度削弱、删除归纳变量、循环合