gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:24:08 25 4
gpt4 key购买 nike

例如,我有一个 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的唯一优势在 selectphi支持超过 2 个分支,同时 select只支持 2 个分支。除了这种情况,还有没有其他情况 phi优于 select ?

最佳答案

select 的操作数是 Value仅 s,而 phi操作数是成对的 ValueBasicBlock .
另一个区别是 phi可以转一个函数的控制流,而select只允许根据 bool 值在两个值之间进行选择。粗略地说,select对应于 ?:三元运算符,和 phi对应 C switch很多情况下的声明。

关于llvm - LLVM IR 中的 `select` 和 `phi` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63048341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com