【问题标题】:Semantics of SSA and multiple assignmentSSA 的语义和多重赋值
【发布时间】:2015-05-21 13:27:35
【问题描述】:

在 SSA 形式中,从 phi 分配的变量最终具有适当的值,具体取决于到达它的路径。但是,如果可能通过一些不寻常的路径,对 phi 的两个输入都已分配,会发生什么?例如

a = 1
...
b = 2
...
c = phi(a, b)

它是否被定义为像一个联合一样,使得 c 以值 2 结束,因为那是最后一次赋值?

【问题讨论】:

    标签: compiler-construction ssa


    【解决方案1】:

    对于 SSA(单一静态分配),phi 节点的两个操作数应该是特定变量的两个定义。

    对于您的示例,这意味着 b=2a=1 是单个变量的两个定义。由于b=2 将始终在a=1 之后运行。因此,b=2 的定义将杀死a=1 的定义。所以,你的phi(a,b)实际上是非法的。

    phi 的操作数通常是来自程序的两个不同执行阶段的定义。

    【讨论】:

    • 很公平。我是否正确理解这意味着没有简单的多项式时间算法来检查一段代码是否是有效的 SSA?
    • 对我来说,似乎存在用于有效 SSA 检查的多项式时间算法。对于 SSA,我们只需要确保,1) 每个赋值或定义都会创建一个新版本的变量。 2)如果代码有不同的路径,比如if-then-else,for-loop。插入PHI 节点以合并它们。但是处理好别名有点挑战。
    • 和 3) 相反,没有可能的路径可以将两个操作数分配给 phi - 这似乎与首先计算 SSA 一样困难,因此可以在多项式时间内完成,只是不是很简单。当然,在任何情况下都需要进行类似检查的优化。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2019-10-29
    相关资源
    最近更新 更多