美文网首页
[LLVM指令]PHI Instruction&PHI node

[LLVM指令]PHI Instruction&PHI node

作者: HAPPYers | 来源:发表于2019-10-01 13:59 被阅读0次

参考
http://llvm.org/docs/LangRef.html#phi-instruction
以及
http://www.llvmpy.org/llvmpy-doc/dev/doc/llvm_concepts.html#ssa-form-and-phi-nodes
http://mayuyu.io/2018/06/04/PhiNode-in-LLVM/

参考blog
https://www.cnblogs.com/ilocker/p/4892439.html

PHI Instruction

介绍

PHI函数是由SSA形式衍生而来的,由于变量在每次定值的时候,都要有一个编号,如果一个基本快有多个前驱,而每个前驱都对一个x进行定值了,分别编号为x1,x2,...,xn。那么到达本基本快的时候我究竟该使用哪一个版本的x,这时候PHI函数应运而生,我们可以在本基本块的开头添加PHI函数来进行取值。

假设有三个前驱,每个前驱对于x的定值分别是X1,X2,X3,那么ϕ的形式为:
Xn=ϕ((B1,X1),(B2,X2),(B3,X3))

语法

<result> = phi [fast-math-flags] <ty> [ <val0>, <label0>], ...

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

示例

Loop:       ; Infinite loop that counts from 0 on up...
  %indvar = phi i32 [ 0, %LoopHeader ], [ %nextindvar, %Loop ]
  %nextindvar = add i32 %indvar, 1
  br label %Loop

在运行时,phi 指令根据“在当前 block 之前执行的是哪一个 predecessor(前任) block”来得到相应的值。

以上面示例中的 phi 指令为例,如果当前 block 之前执行的是 LoopHeader,则该 phi 指令的值是 0,而如果是从 Loop label 过来的,则该 phi 指令的值是 %nextindvar。

phi 指令的语法中,后面是一个列表,列表中的每个元素是一个 value/label 对,每个 label 表示一个当前 block 的 predecessor block,phi 指令就是根据 label 选相应的 value。

phi 指令必须在 basic block 的最前面。也就是在一个 basic block 中,在 phi 指令之前不允许有非 phi 指令。

PHI Node

http://www.llvmpy.org/llvmpy-doc/dev/doc/llvm_concepts.html#ssa-form-and-phi-nodes
所有 LLVM 指令都使用 SSA (Static Single Assignment,静态一次性赋值) 方式表示。意思是所有变量都只能被赋值一次,这样做主要是便于后期的代码优化。

a = 1;
if (v < 10)
    a = 2;
b = a;

假设 v 的值小于 10,变量 a 就要被赋值为 2,但 a 已经被赋值了一次,由于 SSA 性质的约束,只能赋值另外一个“a”。最后在给 b 赋值时,通过添加一个 PHI node,由其来决定选择哪个版本的 a 来给 b 赋值。

a1 = 1;
if (v < 10)
    a2 = 2;
b = PHI(a1, a2);

PHI node 根据控制流是从哪一个 block (“a1 = 1” or “a2 = 2”) 到达,来决定使用 a1 还是 a2 来给 b 赋值。
这些 PHI node 必须在 IR 中显示创建,llvm 指令集中有对应的 phi 指令。

相关文章

网友评论

      本文标题:[LLVM指令]PHI Instruction&PHI node

      本文链接:https://www.haomeiwen.com/subject/lywfpctx.html