例如,我有一个C代码:
为了简化LLVM IR级别的代码(其中
据我所知,
void foo(int x) {
int y;
if (x > 0) {
y = 1;
} else {
y = 2;
}
// do something with y
}
为了简化LLVM IR级别的代码(其中
y
可以放在寄存器而不是堆栈中),我可以使用select
:define void @foo(i32 %x) {
%result = icmp sgt i32 %x, 0
%y = select i1 %result, i32 1, i32 2
; do something with %y
}
然而,如果我使用phi
,代码将变得更长:
define void @foo(i32 %x) {
%result = icmp sgt i32 %x, 0
br i1 %result, label %btrue, label %bfalse
btrue:
br label %end
bfalse:
br label %end
end:
%y = phi i32 [1, %btrue], [2, %bfalse]
; do something with %y
ret void
}
据我所知,
phi
相对于 select
唯一的优势是支持多于 2 个分支,而 select
仅支持 2 个分支。除此之外,在任何其他情况下,phi
比 select
更好吗?