10.1 对下列基本块应用 DAG 进行优化:
(=,3, ,B)
(+,A,C,D)
(*,A,C,E)
(+,D,E,F)
(*,B,F,G)
(+,A,C,H)
(*,A,C,I)
(+,H,I,J)
(*,B,5,K)
(+,K,J,L)
(=,L, ,M)
解:构造 DAG 如下:
G
n7
*
L,M
n9
+
B
n1
3
K
n8
15
F,J
n6
+
D,H
E,I
n4
+
n5
*
n2
A
n3
C
按照上图的 DAG 结点顺序,优化后生成的程序如下:
(=,3, ,B)
(+,A,C,D)
(=,D, ,H)
(*,A,C,E)
(=,E, ,I)
(+,D,E,F)
(=,F, ,J)
(*,3,F,G)
(=,15, ,K)
(+,15,J,L)
(=,L, ,M)
10.2 对下面程序段画出程序流图,并进行循环优化。
I=1;
J=10;
K=5;
L1:X=K*I;
Y=J*I;
Z=X*Y;
I=I+1
IF I<100 GOTO L1;
解:程序流图如下:
B1:I=1;
J=10;
K=5;
B2:X=K*I;
Y=J*I;
Z=X*Y;
I=I+1;
IF I<100 GOTO B2;
从程序流图可知,要优化的循环是基本块 B2。对循环 B2 中代码分别实行代码外提、强度
删弱和删除归纳变量优化如下:
(1) 代码外提:循环中无不变运算、
(2) 强度删弱:由于循环中有
X=K*I;
Y=J*I;
其中,K,J 在循环中值不发生改变,I 每次增加 1。因此,对 X,Y 可进行强度删弱,将乘
法运算(*)改为加法运算(+)。强度删弱后程序流图如下图所示:
B1:I=1;
J=10;
K=5;
B2’:X=K*I;
Y=J*I;
B2:Z=X*Y;
X=X+K;
Y=Y+J;
I=I+1;
IF I<100 GOTO B2;
(3) 删除基本归纳变量:循环中 I 是基本归纳变量,X、Y 是与 I 同族的归纳变量,且有
如下线性关系:
X=K*I;
Y=J*I;
于是,条件 I<100 可用 X