Compiler construction SSA的语义与多重赋值

Compiler construction SSA的语义与多重赋值,compiler-construction,ssa,Compiler Construction,Ssa,在SSA形式中,根据到达路径,从phi分配的变量以适当的值结束。但是,如果可能通过一些不寻常的路径,两个输入到phi都被分配了,会发生什么呢?e、 g a = 1 ... b = 2 ... c = phi(a, b) 它是否被定义为一个并集,使得c最终的值为2,因为这是最后一个赋值?对于SSA单静态赋值,phi节点的两个操作数应该是特定变量的两个定义 例如,这意味着b=2和a=1是单个变量的两个定义。因为b=2总是在a=1之后运行。因此,定义b=2将终止定义a=1。所以,你的phia,b实际

在SSA形式中,根据到达路径,从phi分配的变量以适当的值结束。但是,如果可能通过一些不寻常的路径,两个输入到phi都被分配了,会发生什么呢?e、 g

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

它是否被定义为一个并集,使得c最终的值为2,因为这是最后一个赋值?

对于SSA单静态赋值,phi节点的两个操作数应该是特定变量的两个定义

例如,这意味着b=2和a=1是单个变量的两个定义。因为b=2总是在a=1之后运行。因此,定义b=2将终止定义a=1。所以,你的phia,b实际上是非法的


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

对于SSA单静态赋值,phi节点的两个操作数应该是特定变量的两个定义

例如,这意味着b=2和a=1是单个变量的两个定义。因为b=2总是在a=1之后运行。因此,定义b=2将终止定义a=1。所以,你的phia,b实际上是非法的


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

。我是否正确理解这意味着没有简单的多项式时间算法来检查代码块是否是有效的SSA?对我来说,似乎存在有效的SSA检查多项式时间算法。对于SSA,我们只需要确保,1每个赋值或定义创建一个变量的新版本。2如果代码有不同的路径,比如if-then-else,for循环。插入φ节点以合并它们。但是很好地处理别名有点困难。3相反,对于一个phi,没有可能的路径可以分配两个操作数-这似乎与首先计算SSA一样困难,所以它可以在多项式时间内完成,只是不是很简单。当然,有些优化在任何情况下都需要进行类似的检查。这很公平。我是否正确理解这意味着没有简单的多项式时间算法来检查代码块是否是有效的SSA?对我来说,似乎存在有效的SSA检查多项式时间算法。对于SSA,我们只需要确保,1每个赋值或定义创建一个变量的新版本。2如果代码有不同的路径,比如if-then-else,for循环。插入φ节点以合并它们。但是很好地处理别名有点困难。3相反,对于一个phi,没有可能的路径可以分配两个操作数-这似乎与首先计算SSA一样困难,所以它可以在多项式时间内完成,只是不是很简单。当然,有些优化在任何情况下都需要类似的检查。