将抽象语法树表达式转换为SSA基本块需要以线性序列写出表达式中的所有操作,例如x * y + 1
会转换为按此顺序包含*
和+
的操作列表。
通常在操作列表中包含变量和文字提取吗?即如果上面产生长度为2或5的列表?
一方面,将全局变量或常量的值加载到寄存器中是一项最终必须安排的操作。
另一方面,决定在寄存器中存在哪些值通常是在转换为SSA表格期间或之后进行的。
第三方面,包括线性序列中的原子值意味着您可以回答诸如此函数访问的全局变量之类的问题'通过迭代基本块和操作,而不必迭代每个操作的参数。
我还缺少其他考虑因素吗?
澄清一下:局部变量名通常在SSA中消失(不需要它们,你可以直接使用指向生成该值的操作的指针)。我正在考虑仍然需要名称的东西 - 常量,全局变量名,已经取得地址的局部变量等。
答案 0 :(得分:2)
这取决于您希望优化器做什么。
如果你想有很多自由来安排操作数提取(可能因为它们很昂贵),你会希望将它们显式化,以便你可以操作它们。 (旧的Cray机器有数据和地址寄存器:您可以加载一个地址寄存器并开始获取数据寄存器,然后再做其他事情,最后触摸数据寄存器,如果没有其他计算可以安排)。 / p>
如果您不在乎,可以将整个基本块建模为具有大量输入和输出的单个SSA节点。