8

我可以将抽象语法树直接转换为 SSA 表单,还是需要创建一个控制流图,然后从所述 CFG 创建静态单一分配表单?

在控制流图的上下文中:我如何为类似 c 的程序表示这一点?我想我可以为每个函数中的所有基本块存储一个 CFG 图,但是当我调用一个函数时,这可能会使事情复杂化。我能想到的另一种方法是整个程序的 CFG,即所有源文件,但是我将如何存储有关函数的信息?我可以在基本块(即父节点)中存储指向函数的指针吗?

如果我从 CFG 生成 SSA,我是否需要担心有一个代表语句控制流的 CFG?我想我只需要表示基本的块控制流。

4

1 回答 1

14

是的,您可以在不先构建 CFG 的情况下创建 SSA 表单,但您不能使用 Cytron 等人的经典 SSA 构建算法来完成。静态单一分配表单的简单有效构造一文中描述了另一种算法(免责声明:我是作者之一)。该算法在libFirm、 OpenJDK 和 Go 编译器中使用。

大多数编译器(afaik)使用一个 CFG-per-function 模型。每个基本块都是一个节点。语句(又名操作/指令/等)属于一个基本块。一些将指令存储为每个基本块中的列表。一些将指令存储为类似于 CFG 的部分有序图。

于 2016-12-20T08:58:51.340 回答