如果这篇博客帮助到你,可以请我喝一杯咖啡~
CC BY 4.0 (除特别声明或转载文章外)
考虑以下基本块
t0 = 5;
t1 = 3 * t0;
t2 = R + r;
t3 = t1 * t2;
t4 = t2;
t5 = t3 - t4;
t6 = t1 * t2;
A = t6 + t5;
B = A – r;
t7 = t1;
B = t7 + B;
构造这一基本块的 DAG
flowchart BT
N3-->N5
N4-->N5
N2-->N6
N5-->N6
N5-->N7
N6-->N7
N6-->N8
N7-->N8
N8-->N9
N4-->N9
N2-->N10
N9-->N10
N1["
N1
t0
5
"]
N2["
N2
t1, t7
15
"]
N3["
N3
R
"]
N4["
N4
r
"]
N5["
N5
t2, t4
R + r
"]
N6["
N6
t3, t6
t1 * t2
"]
N7["
N7
t5
t3 - t4
"]
N8["
N8
A
t6 + t5
"]
N9["
N9
B
A - r
"]
N10["
N10
B
t7 + B
"]
假设只有 A 和 B 在基本块后面还要被引用, 产生优化后的三地址代码
t2 = R + r;
t3 = 15 * t2;
t5 = t3 - t2;
A = t3 + t5;
B = A - r;
B = B + 15;
考虑下列代码片段, 为这段代码划分基本块(Basic Block),并画出控制流图(Control Flow Graph). 在答案中你可以直接画出控制流图,但对图中的每个结点,请用 m~n 表示相应的基本块由第 m 至第 n 条语句组成
m = 0 // 1
v = 0 // 2
if v >= n goto (19) // 3
r = v // 4
s = 0 // 5
if r < n goto (9) // 6
v = v + 1 // 7
goto (3) // 8
s = v + r // 9
y = 0 * x // 10
z = v - y // 11
x = z + r // 12
r = m - x // 13
if s <= m goto (17) // 14
m = s // 15
s = s + r // 16
r = r+1 // 17
goto (6) // 18
return m // 19
在下面的控制流图中,每个节点代表一个划分的基本块。
flowchart TB
N1-->N2
N2--else-->N3
N3-->N4
N4--else-->N5
N5-->N2
N4--"if r < n"-->N6
N6-->N7
N7--else-->N8
N8-->N9
N7--"if s <= m"-->N9
N9-->N4
N2--"if v >= n"-->N11
N1["1~2"]
N2["3"]
N3["4~5"]
N4["6"]
N5["7~8"]
N6["9~13"]
N7["14"]
N8["15~16"]
N9["17~18"]
N11["19"]