2

当只有一个可能的前任时,使用 phi 节点有什么好处?例如,当我运行时opt -loop-<some specific pass> some-cool-file.ll -S,如果我还没有添加一个可能的前任,输出将经常包含一个只有一个可能的前任的 phi 节点。

例子:

endcond.loopexit:                      ; preds = %loop <- note: one predecessor
  %res.lcssa = phi i64 [ %res, %loop ] ; I'm assuming this is from the
  br label %endcond                    ; loop-closed ssa form pass

endcond:
  %var = phi i64 [ %res.lcssa, %endcond.loopexit ], <other-pred>

如果只有一个可能的前任,上述内容不应该与

endcond.loopexit:                      ; preds = %loop 
  br label %endcond                    ; res assigned a value in %loop

endcond:
  %var = phi i64 [ %res, %endcond.loopexit ], <other-pred> ; use %res directly

不要误会我的意思,我是 phi 节点的忠实粉丝,但我只是好奇在只有一个可能的前任时添加 phi 节点时除了提高可读性和警告之外是否还有其他好处。

4

1 回答 1

7

当然,你说得对,两者是等价的。但是,前一个循环是 LCSSA(闭环 SSA)形式。这种形式提供了一些非常有用的保证,可以简化许多循环优化。

这不是 LLVM 特有的,GCC 也这样做。他们很好地总结了 LCSSA 表格的具体好处:https ://gcc.gnu.org/onlinedocs/gccint/LCSSA.html

在典型的编译通道流水线中,LCSSA PHI 节点将在 InstCombine 通道进行循环优化后被移除。(如果您-instcombine在所有循环优化之后运行 opt with,您将获得预期的输出。)

于 2015-10-08T16:49:49.460 回答