LLVM IR中的 `select` 和 `phi` 有什么区别?

8
例如,我有一个C代码:
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 个分支。除此之外,在任何其他情况下,phiselect 更好吗?
1个回答

8

select 的操作数仅限于 Value,而 phi 的操作数是由 ValueBasicBlock 组成的一对。

另一个区别在于,phi 可以改变函数的控制流程,而 select 仅允许根据布尔值在两个值之间进行选择。粗略地说,select 对应于 ?: 三元运算符,而 phi 对应于具有多种情况的 C switch 语句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接