编译原理分知识点习题 代码优化

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

1.与机器有关的代码优化有那些种类,请分别举例说明。

解答:与机器有关的优化有:寄存器优化,多处理优化,特殊的指令优化,无用的指令消除等四类。

冗余指令删除

假设源程序指令序列

a:=b+c; c:=a-d;

编译程序为其生成的代码很可能是下列指令序列:

MOV b, R0

ADD c, R0

MOV R0,a

SUB d, R0

MOV R0,c

假如第四条指令没有标号,上述两个赋值语句在一个基本块内,则第四条指令是多余的,可删除。

特殊指令的使用

例如,如果目标机器指令系统包含增1指令INC,对于i:=i+1的目标代码MOV i, R0

ADD #1, R0

MOV R0, i

便可被代之以1条指令

Inc i

说明:优化的特点是每个改进可能会引发新的改进机会,为了得到最好的改进,一般可能需要对目标代码重复扫描进行优化。

2.设有语句序列

a:=20

b:=a*(a+10);

c:=a*b;

试写出合并常量后的三元式序列。

解答:该语句序列对应的三元式序列为:

(1)(:=, 20,a)

(2)(+, a, 10)

(3)(*, a, (2) )

(4)(:=, a, b)

(5)(* a, b)

(6)(:=, (5), c)

合并常量后的三元式序列为:

(1)(:=, 20,a)

(2)(:=, 600, b)

(3)(:=, 12000, c)

3、试写出算术表达式

a+b*c-(c*b+a-e)/(b*c+d)

优化后的四元式序列。

解答:该表达式的四元式序列为:

(1)(*,b,c,T1)

(2)(+,a,T1,T2)

(3)(*,c,b,T3)

(4)(+,T3,a,T4)

(5)(-,T4,e,T5)

(6)(*,b,c,T6)

(7)(+,T6,d,T7)

(8)(/,T5,T7,T8)

(9)(-,T2,T8,T9)

可对该表达式进行删除公共子表达式的优化。优化后的四元式序列为:(1)(*,b,c,T1)

(2)(+,a,T1,T2)

(3)(-,T2,e,T5)

(4)(+,T1,d,T7)

(5)(/,T5,T7,T8)

(6)(-,T2,T8,T9)

4.设有算术表示式

(a*b+c)/(a*b-c)+(c*b+a-d)/(a*b+c)

试给出其优化后的三元式序列。

解答:该算术表达式的三元序列为:

(1)(*,a,b)

(2)(+,(1),c)

(3)(*,a,b)

(4)(-,(3),c)

(5)(/,(2),(4))

(6)(*,c,b)

(7)(+,(6),a)

(8)(-,(7),d)

(9)(*,a,b)

(10)(+,(9),c)

(11)(/,(8),(10))

(12)(+,(5),(11))

可对其进行删除公共子表达式的优化。优化后的三元式列为:

(1)(*,a,b)

(2) (+,(1),c)

(3) (-,(1),c)

(4) (/,(2),(3))

(5) (*, c, b)

(6) (+,(5),a)

(7) (-,(6),d)

(8) (/,(7),(2))

(9) (+,(4),(8))

5.试对以下基本块B1和B2应用DAG进行优化

B1: A:=B*C

D:=B/C

E:=A+D

F:=E*2

G:=B*C

H:=G*G

F:=H*G

L:=F

M:=L

B2: B:=3

D:=A+C

E:=A*C

F:=D+E

G:=B*F

H:=A+C

I:=A*C

J:=H+I

K:=B*5

L:=K+J

M:=L

并就以下两种情况分别写出优化后的四元式序列:

(1)假设G、L、M在基本块后面要被引用;

(2)假设只有L在基本块后面要被引用。

解答:一般应用DAG在一个基本块内可以进行三种优化:合并常量、删除无用赋值以及多余运算。

对于基本块B

,其DAG如图7.1所示。

1

(1) 若只有G、L、M在基本块后面要被引用

G:=B*C 或 G:=B*C

H:=G*G S:=G*G

L:=H*G L:=S*G

M:=L M:=L (S为临时变量)

(2)若只有L在基本块后面要被引用

G:=B*C 或 S1:=B*C

H:=G*G S2:=S1*S1

L:=H*G L:=S2*S1 (S1、S2为临时变量)

对于基本块B2,其DAG如图7.2所示。

3 A C 15

图7.2 基本块B2的DAG图

优化后的四元式序列如下:

(1) 若只有G、L、M在基本块后面要被引用

D:=A+C

E:=A*C

F:=D+E

G:=3*F

L:=F+15

M:=L

(2) 若只有L在基本块后面要被引用

D:=A+C 或 S1:=A+C

E:=A*C S2:=A*C

F:=D+E S3:=S1+S2

L:=F+15 L:=S3+15

(S1、S2、S3为临时变量) 6. 对于基本块P

S0:=2

S1:=3/S0

S2:=T-C

S3:=T+C

R:=S0/S3

H:=R

S4:=3/S1

S5:=T+C

相关文档
最新文档