第11章-作业及习题参考答案
- 格式:doc
- 大小:204.00 KB
- 文档页数:10
1 / 10 第11章
(8分)将下面程序划分为基本块,并画出其基本块程序流图。
(1) if a
(2) halt
(3) if c
(4) goto (8)
(5) t1:=y+z
(6) x :=t1
(7) goto (1)
(8) t2:=y-z
(9) x :=t2
(10) goto (1)
11.1答:所谓代码优化即对代码进行等价变换,使得变换后的代码与变换前代码运行结果相同,而运行速度加快或占用存储空间少,或两者兼有。
进行优化的基础是中间或目标代码生成,以及基本块的识别、控制流分析和数据流分析。
2答:根据不同的阶段,分为中间代码优化和目标代码的优化。
根据优化所涉及的程序范围,又可分为局部优化、循环优化和全局优化。
3答:最常用的代码优化技术有:
(1)删除多余运算 (2)代码外提
(3)强度削弱 (4)变换循环控制条件
(5)合并已知量和复写传播 (6)删除无用赋值
4 图11.23是图11.22的C代码的部分四元式代码序列
(1) 请将图11.23的四元式代码序列划分为基本块并做出其流图?
(2) 将每个基本块的公共子表达式删除?
(3) 找出流图中的循环,将循环不变量计算移出循环外?
(4) 找出每个循环中的归纳变量,并且在可能的地方删除它们
图11.22
void quicksort(m,n)
int m,n; { int i,j;
int v,x; if (n<=m) return;
/* fragment begins here */
i = m-1;
j = n;
v = a[n];
while(1) {
do i = i+1;while (a[i]
do j = j-1; while (a[j]>v);
if (i>=j) break;
x = a[i];
a[i] = a[j];
a[j] = x;
}
x = a[i];
a[i] = a[n];
a[n] = x;
/* fragment ends here */
quicksort (m,j);
quicksort(i+1,n);
}
图11.23
(1) i:=m-1
(2) j:=n
(3) t1:=4*n
(4) v:=a[t1]
(5) i:=i+1
(6) t2:=4*i
(7) t3:=a[t2]
(8) if t3< v goto (5)
(9) j:=j-1
(10) t4:=4*j
(11) t5:=a[t4]
(12) if t5> v goto (9)
(13) if i >= j goto (23)
(14) t6:=4*i
(15) x:=a[t6] (16) t7:=4*i
(17) t8:=4*j
(18) t9:=a[t8]
(19) a[t7]:=t9
(20) t10:=4*j
(21) a[t10]:=x
(22) goto (5)
(23) t11:=4*i
(24) x:=a[t11]
(25) t12:=4*i
(26) t13:=4*n
(27) t14:=a[t13]
(28) a[t12]:=t14
(29) t15:=4*n
(30) a[t15]:=x
答:
(1)1-4为第1块,5-8为第2块,9-12为第3块,13句为第4块,14-22为第5块,23-30句为第6块。流图如下:
B1 3 / 10
B2
B3
B4
B5 B6
(2) (14)和(16)都有4*i的运算,将(16)换成t7=t6
(17)和(20)都有4*j的运算,将(20)换成t10=t8
(23)和(25)都有4*i的运算,将(25)换成t12=t11
(3)、(26)和(29)都有4*n的运算,将(26)换成t13=t1,(29)换成t15=t1
(3) 有(5)-(8)、(9)-(12)、(5)-(22)三个循环。三个循环中没有循环不变量。
(4) 在循环(5)-(8)中,有基本归纳变量i和归纳变量t2;
在循环(9)-(12)中,有基本归纳变量j和归纳变量t4;
在循环(5)-(22)中,有基本归纳变量i和归纳变量t7、基本归纳变量j和归纳变量t8、t10。
注意到B6:(23)-(30)不在循环内,且B6中依然对i存在引用,所以i不能删除;但j可以删除
(1) i:=m-1
(2) j:=n
(3) t1:=4*n
(4) v:=a[t1]
(p) t4 := 4 * n
(p+1) t8 := t4
(p+2) t10 := t4
(5) i:=i+1
(6) t2:=4*i
(7) t3:=a[t2]
(8) if t3< v goto (5)
(9) j:=j-1 //删除
(10) t4:=t4 + 4
(11) t5:=a[t4]
(12) if t5> v goto (9)
(13) if t2 >= t4 goto (23)
(14) t6:=4*i
(15) x:=a[t6]
(16) t7:=4*i
(17) t8:=t8 + 4 (18) t9:=a[t8]
(19) a[t7]:=t9
(20) t10:=t10 + 4
(21) a[t10]:=x
(22) goto (5)
(23) t11:=4*i
(24) x:=a[t11]
(25) t12:=4*i
(26) t13:=4*n
(27) t14:=a[t13]
(28) a[t12]:=t14
(29) t15:=4*n
(30) a[t15]:=x
至于程序段中存在的大量4 * i公共子表达式,在代码优化时,不会在“删除归纳变量”步骤中删除。
5.如下程序流图(图11.24)中,B3中的i∶=2是循环不变量,可以将其提到前置结点吗?你还能举出一些例子说明循环不变量外移的条件吗?
图11.24
答:不能将i=2提成前置节点,这样不管中间的判断如何,最后j=2。
6. 试对以下基本块B1和B2:
B1:(a) A := B * C B2: B := 3
(b) D := B / C D := A + C 5 / 10 (c) E := A + D E := A * C
(d) F := 2 * E F:= D + E
(e) G := B * C G := B * F
(f) H := G * G H := A + C
(g) F := H * G I := A * C
(h) L := F J := H + I
(i) M := L K := B * 5
(j) L := K + J
(k) M := L
解:B1的DAG:
n1
B n2
C n3 A, G
* n4 D
(h) n5 E
/ + n6
2 n7
*
n8 H
* n9 * F, L n1
B n2
C n3 A, G
* n4 D
(g) n5 E
/ + n6
2 n7
*
n8 H
* n9 * F n1
B n2
C n3 A, G
* n4 D
(f) n5 E
/ + n6
2 n7
* F
n8 H
*
n1
B n2
C n3 A, G
* n4 D
(e) n5 E
/ + n6
2 n7
* F
n8 G
*
n1
B n2
C n3 A
* n4 D
(d) n5 E
/ + n6
2 n7
* F n1
B n2
C n3 A
* n4 D
(c) n5 E
/ +
n1
B n2
C n3 A
* n4 D
(b) /
n1
B n2
C n3 A
*
(a)
优化后的四元式序列:
(1) 假设只有G、L、M在基本块后还要被引用
G := B * C
H := G * G
L := H * G
M := L
(2) 假设只有L在基本块后还要被引用
A := B * C
H := A * A
L := H * A
B2的DAG:
n1
B n2
C n3 A, G
* n4 D
(i) n5 E
/ + n6
2 n7
*
n8 H
* n9 * F, L, M
n2
A n3
C n4 D
+
(e) n1
3 B E n5
* n6 F
+ n7
* G n2
A n3
C n4 D +
(d) n1
3 B E n5 * n6 F + n1
A n2
C n3 D
+
(c) n1
B 3 E n4 *
n1
A n2
C n3 D
+
(b) n1
B 3 n1
B 3
(a)