我正在为我正在编写的编译器实现SSA构造。在SSA算法中有些东西我不理解(使用和“Java中的现代编译器实现”一书,第二版由A.W. Appel编写)。我是否必须在连接点(定义y的块的主导边界)插入PHI-函数?我是否必须在块C的开头插入一个PHI指令,其中包含两个操作数(每个传入控制流路径一个)?然后,在SSA重命名:我将如何命名来自路径A -> C (而不是通过B)的操作数,其中从未定义y?
如果只有一个可能的前身,那么使用phi节点有什么好处?例如,当我运行opt -loop-<some specific pass> some-cool-file.ll -S时,如果我还没有添加一个可能的前身,输出通常会包括一个带有一个可能的前身的phi节点。%res, %loop ] ; I'm assuming this is from the
br label %endcond ; loop-closed ssai64 [ %res, %endcond.loopexit ],