gpt4 book ai didi

llvm - PHI 指令到底有什么作用以及如何在 LLVM 中使用它

转载 作者:行者123 更新时间:2023-12-03 05:15:46 29 4
gpt4 key购买 nike

LLVM 有 phi带有相当奇怪解释的指令:

The 'phi' instruction is used to implement the φ node in the SSA graph representing the function.

通常它用于实现分支。如果我理解正确,则需要进行依赖性分析,并且在某些情况下它可以帮助避免不必要的加载。然而,仍然很难理解它到底做了什么。

万花筒 example对于 if 的情况解释得相当好。然而,如何实现 &&|| 等逻辑运算还不是很清楚。如果我输入以下内容到 online llvm编译器:

void main1(bool r, bool y) {
bool l = y || r;
}

最后几行完全让我困惑:

; <label>:10                                      ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8

看起来 phi 节点产生了可以使用的结果。我的印象是 phi 节点只是定义来自哪些路径的值。

有人可以解释一下什么是 Phi 节点,以及如何用它实现 || 吗?

最佳答案

phi 节点是一条指令,用于根据当前 block 的前身选择一个值(查看 here 以查看完整的层次结构 - 它也用作值,它是它继承的类之一)。

由于 LLVM 代码的 SSA(静态单赋值)风格的结构,Phi 节点是必需的 - 例如,以下 C++ 函数

void m(bool r, bool y){
bool l = y || r ;
}

被翻译成以下IR:(通过clang -c -emit-llvm file.c -o out.bc创建 - 然后通过llvm-dis查看)

define void @_Z1mbb(i1 zeroext %r, i1 zeroext %y) nounwind {
entry:
%r.addr = alloca i8, align 1
%y.addr = alloca i8, align 1
%l = alloca i8, align 1
%frombool = zext i1 %r to i8
store i8 %frombool, i8* %r.addr, align 1
%frombool1 = zext i1 %y to i8
store i8 %frombool1, i8* %y.addr, align 1
%0 = load i8* %y.addr, align 1
%tobool = trunc i8 %0 to i1
br i1 %tobool, label %lor.end, label %lor.rhs

lor.rhs: ; preds = %entry
%1 = load i8* %r.addr, align 1
%tobool2 = trunc i8 %1 to i1
br label %lor.end

lor.end: ; preds = %lor.rhs, %entry
%2 = phi i1 [ true, %entry ], [ %tobool2, %lor.rhs ]
%frombool3 = zext i1 %2 to i8
store i8 %frombool3, i8* %l, align 1
ret void
}

那么这里会发生什么?与 C++ 代码不同,变量 bool l 可以是 0 或 1,在 LLVM IR 中,它必须定义一次。因此,我们检查 %tobool 是否为 true,然后跳转到 lor.endlor.rhs

lor.end 中,我们最终得到了 || 的值。运算符(operator)。如果我们是从入口处到达的 - 那么这就是事实。否则,它等于 %tobool2 的值 - 这正是我们从以下 IR 行中得到的结果:

%2 = phi i1 [ true, %entry ], [ %tobool2, %lor.rhs ]

关于llvm - PHI 指令到底有什么作用以及如何在 LLVM 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485531/

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