2

将抽象语法树表达式转换为 SSA 基本块需要以线性顺序写出表达式中的所有操作,例如x * y + 1转换为包含*and的操作列表+

通常在操作列表中包含变量和文字提取吗?即上面应该产生一个长度为2或5的列表吗?

一方面,将全局变量或常量的值加载到寄存器中是最终必须安排好的操作。

另一方面,决定哪些值将存在于寄存器中通常是在从 SSA 形式转换期间或之后完成的。

另一方面,在线性序列中包含原子值意味着您可以通过遍历基本块和操作来回答诸如“此函数访问哪些全局变量”之类的问题,而不必遍历每个操作的参数。

还有其他我遗漏的注意事项吗?

澄清一下:局部变量名称通常在 SSA 中消失(不需要它们,您可以直接使用指向生成值的操作的指针)。我正在考虑仍然需要名称的东西 - 常量、全局变量名称、地址已被占用的局部变量等。

4

1 回答 1

2

这取决于您希望优化器做什么。

如果您想在安排操作数获取时有很大的自由度(可能是因为它们很昂贵),您将希望使它们显式以便您可以操纵它们。(旧的 Cray 机器有数据和地址寄存器:您可以加载一个地址寄存器并开始对数据寄存器进行取指,然后去做其他事情,最后在没有其他可以安排的计算时触摸数据寄存器)。

如果您不太在意,您可以将整个基本块建模为具有大量输入和输出的单个 SSA 节点。

于 2015-05-13T19:18:50.240 回答