2

我试图更深入地了解 llvm 中的指令选择过程,为此我正在逐步调试 CodeGenAndEmitDAG 函数。我在合并步骤之前打印了一个小函数(见下文) - 上述函数的第一步。在图中,我看到蓝线,它们似乎总是指向 "ch" ,我认为这意味着“其他”机器值类型。我不明白的是蓝线的含义......这是什么依赖?而且,我对“ch”的含义是否正确?是“其他”吗?在此处输入图像描述

4

1 回答 1

3

蓝色虚线箭头表示指令之间的非数据流依赖关系,并在它们之间强制执行特定顺序。例如,可能访问相同内存的存储和加载不应该重新排序,尽管它们之间没有数据依赖关系。在这种情况下,蓝色箭头用于表示这种隐藏的依赖关系。这些蓝色箭头消耗类型为 的链值 (ch) Other

每个 DAG 都有一个特殊EntryToken的类型Other,它为基本块提供初始链值。

考虑以下示例。注意加载和存储之间的控制依赖关系(蓝色箭头),因为它们被允许指向相同的内存。还要注意将两个指令粘合在一起的红色箭头(胶水)。

int foo(int *a, int *b) {
  a[0] = 42;
  return b[0];
}

在此处输入图像描述

于 2014-10-31T06:31:26.577 回答