Graph 我对SSA的理解正确吗?(重命名)

Graph 我对SSA的理解正确吗?(重命名),graph,compiler-construction,compiler-optimization,control-flow-graph,ssa,Graph,Compiler Construction,Compiler Optimization,Control Flow Graph,Ssa,我一直在学习ssa(静态单赋值形式),我得到了插入phi函数的下图,但该图尚未重命名: 我不得不重命名变量,这就是我得到的: 我很不确定这是否正确。我是否正确重命名了变量?这是最小ssa吗?我使用(Cytron等人的论文)中的这个算法来重命名变量。请帮忙!:) 不,您的图表不正确。x和y的phi函数和重命名是正确的,问题在于临时变量t1到t3。当输入块L1时,这些变量无效,并且根本不需要任何phi函数。如果您坚持为这些变量使用phi函数,则必须假设变量存在,并且在输入图形时具有som不确定值

我一直在学习ssa(静态单赋值形式),我得到了插入phi函数的下图,但该图尚未重命名:

我不得不重命名变量,这就是我得到的:


我很不确定这是否正确。我是否正确重命名了变量?这是最小ssa吗?我使用(Cytron等人的论文)中的这个算法来重命名变量。请帮忙!:)

不,您的图表不正确。
x
y
的phi函数和重命名是正确的,问题在于临时变量
t1
t3
。当输入块
L1
时,这些变量无效,并且根本不需要任何phi函数。如果您坚持为这些变量使用phi函数,则必须假设变量存在,并且在输入图形时具有som不确定值。让
t1\u 0
t2\u 0
t3\u 0
作为这些值,并相应地更新重命名后的图表。

我不理解给出的图表。为什么在基本块中间的标签<代码> L1 < /代码>?这是否表明
转到L1
将跳转到块的中间(跳过phi节点)?那么,当来自初始块时,t1等的值是什么(它没有给它们任何值)?@sepp2k——感谢您的注意:)——不,这些没有任何意义。。。他们只是帮助我。对不起,我不太确定如何接受你的答复。什么不重要?在我看来,
goto L1
是否跳过phi节点,以及
t1
t3
的初始值是什么,都是非常重要的。就像行
t1\u 0@sepp2k——我指的是goto和标签(
goto L1
和标签
L1
)。另外,
t1\u 0行吗,谢谢。。。还有一件事:我构造了修剪过的ssa,而
y
的phi函数不见了(大概是因为它没有在块
L1
中使用)。我说的对吗?@xilpex您需要在
L1
中为
y
使用一个phi函数,因为此变量根据您通过哪个传入边输入而具有不同的定义。啊,是的——但是如果
y
未在块
L2
中使用,phi函数不是必需的,对吗?它是必需的,因为
y
L1
的输入处不是死的(它在计算
t2
时使用),并且根据到达
L1
的方式有不同的定义。Phi函数用于合并传入流。