有向无环图:
有向无环图(DAG)用于表示基本块的结构,可视化基本块之间的值流,并在基本块中提供优化技术。为了将优化技术应用于基本块,DAG 是作为中间代码生成结果而生成的三地址代码。
- 有向无环图是一种数据结构,用于对基本块进行变换。
- 有向无环图 (DAG) 有助于基本块的转换。
- DAG 是一种识别常见子表达式的有效方法。
- 它演示了如何在后续语句中使用语句的计算值。
有向无环图的例子:
有向无环图特点:
基本块的有向无环图是在节点上具有以下标签的有向无环图。
- 图的每个叶子都有一个唯一的标识符,可以是变量名或常量。
- 图的内部节点标有运算符符号。
- 此外,节点被赋予字符串标识符,用作存储计算值的标签。
- 有向无环图对传递闭包和传递归约有自己的定义。
- 有向无环图定义了拓扑排序。
有向无环图的构造算法:
在三个地址代码上构建 DAG 有三种可能的场景:
情况 1 – x = y op z
情况 2 – x = op y
情况 3 – x = y
上述情况的有向无环图可以如下构建:
第1步 –
- 如果未定义 y 操作数,则创建一个节点 (y)。
- 如果未定义 z 操作数,则为 case(1) 创建一个节点作为 node(z)。
第2步 –
- 为案例(1)创建节点(OP),节点(z)作为其右孩子,节点(OP)作为其左孩子(y)。
- 对于情况(2),看看是否有一个节点运算符(OP)和一个子节点(y)。
- 在情况 (3) 中,节点 n 将是节点 (y)。
第 3 步 –
从节点标识符列表中删除 x。步骤 2:将 x 添加到节点 n 的附加标识符列表中。
例子 :
T0 = a + b —Expression 1
T1 = T0 + c —-Expression 2
d = T0 + T1 —–Expression 3
表达式 1:T 0 = a + b
表达式 2:T 1 = T 0 + c
表达式 3:d = T 0 + T 1
例子 :
T1 = a + b
T2 = T1 + c
T3 = T1 x T2
例子 :
T1 = a + b
T2 = a – b
T3 = T1 * T2
T4 = T1 – T3
T5 = T4 + T3
例子 :
a = b x c
d = b
e = d x c
b = e
f = b + c
g = f + d
例子 :
T1:= 4*I0
T2:= a[T1]
T3:= 4*I0
T4:= b[T3]
T5:= T2 * T4
T6:= prod + T5
prod:= T6
T7:= I0 + 1
I0:= T7
if I0 <= 20 goto 1
有向无环图的应用:
- 有向无环图决定了常用的子表达式。
- 有向无环图确定块内使用的名称以及块外计算的名称。
- 确定块中的哪些语句可以在块外具有它们的计算值。
- 代码可以用一个有向无环图来表示,它描述了在代码中执行的每个算术运算的输入和输出;这种表示允许编译器有效地执行公共子表达式消除。
- 几种编程语言描述了通过有向无环图链接在一起的价值系统。当一个值改变时,它的后继值被重新计算; DAG 中的每个值都被评估为其前身的函数。