2 把以下程序划分基本块,做出流程图
基本快
行数 | 代码 | 块 |
---|---|---|
1 | read A, B | B1 |
2 | F := 1 | B1 |
3 | C := A * A | B1 |
4 | D := B * B | B1 |
5 | if C < D goto L1 | B1 |
6 | E := A * A | B2 |
7 | F := F + 1 | B2 |
8 | E := E + F | B2 |
9 | write E | B2 |
10 | halt | B2 |
11 | L1: E := B * B | B3 |
12 | F := F + 2 | B3 |
13 | E := E + F | B3 |
14 | write E | B3 |
15 | if E > 100 goto L2 | B3 |
16 | halt | B4 |
17 | L2: F := F - 1 | B5 |
18 | goto L1 | B5 |
流程图
3
对基本块分别用DAG优化,并写出优化后的三地址代码(原题为四地址序列)
B1
A := B * C
D := B / C
E := A + D
F := 2 * E
G := B * C
H := G * G
F := H * G
L := F
M := L
DAG图
情况1: 只有G,L,M会被块后引用
G = B * C
S1 = G * G
L = S1 * G
M = L
情况2: 只有L会被块后引用
S1 = B * C
S2 = S1 * S1
L = S2 * S1
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会被块后引用
S1 = A + C
S2 = A * C
S3 = S1 + S2
G = 3 * S3
L = 15 + S3
M = L
情况2: 只有L会被块后引用
S1 = A + C
S2 = A * C
S3 = S1 + S2
L = 15 + S3