如何lower基本块开头的PHI函数

问题背景

最近面试一家静态分析的公司,感觉面试官问的问题非常具有代表性,问的都是《编译原理》里面的知识,并且进行扩展,其中就有一个问题,当时我就很懵逼,即如何对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;

这里就非常清晰了,直接观察第三条语句就可以知道此时我是用的yy2

PHI

还是我个人的理解

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

假设有三个前驱,每个前驱对于x的定值分别是 X1,X2,X3 ,那么 ϕ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值