在基本块中包含原子值

Including atomic values in basic blocks

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

是否通常将变量和文字提取包含在操作列表中? IE。上面应该生成长度为 2 还是 5 的列表?

一方面,将全局变量或常量的值加载到寄存器是一项最终必须被调度的操作。

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

另一方面,在线性序列中包含原子值意味着您可以通过遍历基本块和操作来回答类似 'what global variables does this function access' 的问题,而不必遍历每个操作的参数。

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

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

这取决于您希望优化器执行的操作。

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

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