For example, I have a C code:
void foo(int x) {
int y;
if (x > 0) {
y = 1;
} else {
y = 2;
}
// do something with y
}
To simplify this code in LLVM IR level (where y
can be put in the register rather than stack), I can use select
:
define void @foo(i32 %x) {
%result = icmp sgt i32 %x, 0
%y = select i1 %result, i32 1, i32 2
; do something with %y
}
However, if I use phi
, the code becomes much longer:
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
}
As far as I know, the only advantage of phi
over select
is that phi
supports more than 2 branches, while select
only supports 2 branches. Beyond this situation, is there any other situation where phi
is better than select
?