问题背景
最近面试一家静态分析的公司,感觉面试官问的问题非常具有代表性,问的都是《编译原理》里面的知识,并且进行扩展,其中就有一个问题,当时我就很懵逼,即如何对phi函数进行lower。
what is “Lower”?
简单来说,lower是一个对操作和类型进行合法化的过程,即如果芯片中的寄存器的位数是8位,而你要进行16位的运算,那么就要对两个加法操作数进行拆分,变成两个8位的相加,并分别保存到结果的低8位和高8位中,还有对于操作的lower,关于这个可以详细参考我写的另外一篇博客科普LLVM中MSP430的Lower过程。
不得不说面试官问的问题真是一针见血,直接来了一句,如何对phi函数进行lower,当时没答上来,现在想了一下,就先说说我自己的想法。(反正百度上面也搜不到,以后慢慢自己去google再进行完善)
SSA和PHI
SSA:静态单赋值形式
我就不搬任何wiki,baidu,或者google上面的概念了,我就说说我自己的想法。
SSA对源代码的变量进行版本的编号,使其进行某些优化的过程更加容易。
eg.
y = 1;
y = 2;
x = y + 3;
就这么三条语句,如果要判断第三条语句x = y + 3
中的y使用的是上面两条语句中哪个y
的时候,此时就要进行到达定值分析,从而可以判断是第二条语句中定义的y
到达了第三条语句,因为第二条语句所在的程序点kill了第一条语句所在的程序点可以如果我们换一种思路,用SSA
形式来进行表示呢。如下
y1 = 1;
y2 = 2;
x1 = y2 + 3;
这里就非常清晰了,直接观察第三条语句就可以知道此时我是用的y
是y2
。
PHI
还是我个人的理解
PHI函数是由SSA形式衍生而来的,由于变量在每次定值的时候,都要有一个编号,如果一个基本快有多个前驱,而每个前驱都对一个x进行定值了,分别编号为x1,x2,,xn。那么到达本基本快的时候我究竟该使用哪一个版本的x,这时候PHI函数应运而生,我们可以在本基本块的开头添加PHI函数来进行取值。
假设有三个前驱,每个前驱对于x的定值分别是 X1,X2,X3 ,那么 ϕ