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

上传人:b****2 文档编号:2455746 上传时间:2022-10-29 格式:DOCX 页数:22 大小:145.12KB
下载 相关 举报
编译原理分知识点习题 代码优化.docx_第1页
第1页 / 共22页
编译原理分知识点习题 代码优化.docx_第2页
第2页 / 共22页
编译原理分知识点习题 代码优化.docx_第3页
第3页 / 共22页
编译原理分知识点习题 代码优化.docx_第4页
第4页 / 共22页
编译原理分知识点习题 代码优化.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

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

《编译原理分知识点习题 代码优化.docx》由会员分享,可在线阅读,更多相关《编译原理分知识点习题 代码优化.docx(22页珍藏版)》请在冰豆网上搜索。

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

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

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

解答:

与机器有关的优化有:

寄存器优化,多处理优化,特殊的指令优化,无用的指令消除等四类。

冗余指令删除

假设源程序指令序列

a:

=b+c;c:

=a-d;

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

MOVb,R0

ADDc,R0

MOVR0,a

SUBd,R0

MOVR0,c

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

特殊指令的使用

例如,如果目标机器指令系统包含增1指令INC,对于i:

=i+1的目标代码

MOVi,R0

ADD#1,R0

MOVR0,i

便可被代之以1条指令

Inci

说明:

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

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在一个基本块内可以进行三种优化:

合并常量、删除无用赋值以及多余运算。

对于基本块B1,其DAG如图7.1所示。

F,L,M*

E

*+

 

H*A,GD

*/

 

BC2

图7.1基本块B1的DAG图

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

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

G:

=B*C或G:

=B*C

H:

=G*GS:

=G*G

L:

=H*GL:

=S*G

M:

=LM:

=L(S为临时变量)

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

G:

=B*C或S1:

=B*C

H:

=G*GS2:

=S1*S1

L:

=H*GL:

=S2*S1(S1、S2为临时变量)

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

 

GL,M

*F,J+

+

D,HE,L

+*

 

BK

3AC15

图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*CS2:

=A*C

F:

=D+ES3:

=S1+S2

L:

=F+15L:

=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

S6:

=S4/S5

H:

=S6*S2

(1)试应用DAG进行优化。

(2)假定只有R、H在基本块出口是活跃的,试写出优化后的四元式序列。

(3)假定只有两个寄存器R0、R1试写出上述优化后的四元式序列的目标代码。

解答:

(1)构造DAG如图7.3所示。

H

 

R,,S6

S2

/-

S3,S5

+

 

S0,S4S1

21.5TC

图7.3基本块P的DAG图

优化后的四元式序列为:

S0:

=2

S4:

=2

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

(3)假定只有两个寄存器R0、R1,上述优化后的四元式序列的目标代码为:

LDR0T

SUBR0C

STR0S2

LDR0T

ADDR0C

LDR12

DIVR1R0

LDR0S2

MULR1R0

STR1H

7.设有入图7.4所示的程序流程图:

 

图7.4程序流图

(1)求出流图中各个结点n的必经结点集D(n);

(2)求出该流图中的回边;

(3)求出该流图中的循环。

解答:

(1)在程序流图中,对任意的结点ni和nj,如果从流图的首结点出发,到达nj的任一通路都必须经过ni,则称ni是nj的必经结点,记为niDOMnj。

流图中结点n的所有必经结点称为结点n的必经结点集,记为D(n)。

流图中各结点n的必经结点集D(n)为:

D(B1)={B1}

D(B2)={B1,B2}

D(B3)={B1,B2,B3}

D(B4)={B1,B2,B3,B4}

D(B5)={B1,B2,B3,B5}

D(B6)={B1,B2,B3,B6}

D(B7)={B1,B2,B7}

D(B8)={B1,B2,B7,B8}

(2)流图的回边是指:

若a→b是流图中一条有向边,且有bDOMa,则称a→b是流图的一条回边。

题目所给流图中,有有向边B7→B2,又有D(B7)={B1,B2,B7},所以,B2DOMB7,

即B7→B2是流图的回边。

且无其他回边。

(3)该流图中的循环可利用回边求得。

如果以知有向边n→d是一回边,由它组成的循环就是由结点d、结点n以及有通路到达n而该通路不经过d的所有结点组成,且d是该循环的唯一入口结点。

题目所给出流图中,只有一条回边B7→B2,在该流图中,凡是不能经过结点B2有通路到达结点B7的结点,只有B3,B4,B5,B6,所以,由回边B7→B2组成的循环是{B2,B3,B4,B5,B6,B7}。

8.(中国科学院计算机所1997年)试画出如下中间代码序列的程序流图,并求出:

(1)各结点的必经结点集合D(n);

(2)流图中的回边与循环。

J:

=0;

L1:

I:

=0;

ifI<8gotoL3;

L2:

A:

=B+C;

B:

=D*C;

L3:

ifB=0gotoL4;

WriteB;

gotoL5;

L4:

I:

=I+1;

ifI<8gotoL2;

L5:

J:

=J+1;

ifJ<=3gotoL1;

HALT

解答:

程序的流图入图7.5所示。

(1)各结点的必经结点集分别为:

D(n0)={n0}

D(n1)={n0,n1}

D(n2)={n0,n1,n2}

D(n3)={n0,n1,n3}

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}

n0

 

n1

 

n2

 

n3

 

n4

 

n5

 

n6

n7

图7.5程序流图

(2)流图中的回边有一条:

即n6n1

该回边表示的循环为:

(n1,n2,n3,n4,n5,n6),入口为n1,出口为n6

9.(武汉大学1991年)试对下面的程序段进行尽可能的优化:

 

i:

=1

 j:

=10

read k

l:

x:

=k*i

y:

=j*i

z:

=x*y

writej

i:

=i+1

ifi<100gotol

halt

并指明你进行了何种优化,给出优化过程的简要说明及每种优化后的结果形式。

解答:

程序的流程图如下所示:

 

  B1:

B2:

 

 

B3:

图7.6程序流图

由程序流图可知,{B2}为一个循环。

对于本题中的循环可进行以下优化:

· 削减强度

  循环中有

  x:

=x*i

y:

=y*i

j,k在循环中不改变值。

i每次增加1,x和y的赋值运算可进行强度削减,于是程序流图变为图7.7所示。

 

B1:

       B2ˊ:

 

B2:

 

B3:

 

图7.7削减强度后的程序流图

· 删除归纳变量

 由于i是循环中的基本归纳变量,x、y是与y同族的归纳变量,且有线性关系

 x:

=k*iy:

=j*i

所以,i<100完全可用x<100*k或y<100*j代替。

于是,进一步优化为图7.8所示。

· 代码外提

将循环中不变运算

  writej

tl:

=100*k

提到循环外的前置节点B21中,于是程序流图变为7.9所示的情形。

 

B1:

 

B¹2

 

B2:

 

B3:

图7.8归纳变量后的程序流图

B1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1