什么是IR?
IR分为SSA(static single assignment 静态单赋值) IR和 正常IR
经过后端编译器,可直接生成不同平台的执行文件,比如Arm,X86
用处交叉编译。
什么是PHI?
int i = a > 1 ? 11 : 22;
很简单的代码解释PHI
生成的 sm代码如下
block0:
if (a > 1) goto
block1 else block2
blcok1:
value1 = 11
goto block3
block2:
value2 = 22
goto block3
block3
value3 = ??
编译器是怎么知道 value3 的赋值应该是11还是22呢?
结论:
如果上一级来自block1,那么valuei就取value1的值
如果上一级来自block2,那么valuei就取value2的值
block3的上级是block1和block2,那么value3 =phi(value1, value2)
这个代码执行流程分为两种
block0->blcok1->blcok3
或者
block0->blcok2->blcok3
PHI主要是路径来源,在SSA IR里面,PHI 也是一个变量,是一种特殊变量
int i
if (a > 1)
i = 11
else
i = 22
这里i被赋值了两次,但是ir里面的value只能赋值一次,
但它初始化的时候,根据上级block,选择不同的value给它赋值。
为了应付这种情况,就有了PHI。
网友评论