Compiler construction 在基本块中包含原子值

Compiler construction 在基本块中包含原子值,compiler-construction,ssa,Compiler Construction,Ssa,将抽象语法树表达式转换为SSA基本块需要以线性顺序写出表达式中的所有操作,例如,x*y+1转换为包含*和+的操作列表 通常在操作列表中包含变量和文字回迁吗?也就是说,上面应该列出长度为2或5的列表吗 一方面,将全局变量或常量的值加载到寄存器中是一个最终必须调度的操作 另一方面,决定哪些值将存在于寄存器中通常是在转换SSA表单期间或之后进行的 第三方面,在线性序列中包含原子值意味着您可以通过迭代基本块和操作来回答诸如“此函数访问哪些全局变量”之类的问题,而不必迭代每个操作的参数 我还缺少其他考虑因

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

通常在操作列表中包含变量和文字回迁吗?也就是说,上面应该列出长度为2或5的列表吗

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

另一方面,决定哪些值将存在于寄存器中通常是在转换SSA表单期间或之后进行的

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

我还缺少其他考虑因素吗


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

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

如果您想在调度操作数回迁时有很大的自由度(可能是因为它们很昂贵),那么您需要将它们显式化,以便可以对它们进行操作。(旧的克雷机器有数据和地址寄存器:您可以加载地址寄存器并开始提取数据寄存器,然后执行其他操作,最后在没有其他可以安排的计算时触摸数据寄存器)

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