引言
什么是可用表达式和活跃变量?假设有如下代码:
int main()
{
int a=1,b=2,c=1;
int x=a+b+b+b+b;
int y=a+b+b+b+b;
int z=a+b+b+b+b;
return 0;
}
可用表达式:
举例来说,a+b+b+b+b就是可用表达式,如果不加以优化,其将被计算三次,太浪费了,所以编译优化过程要求发现这个可用表达式。
活跃变量:
举例来说,a,b就是活跃变量,c是不活跃变量,前者叫做live,后者叫做dead。
上面只是直观的理解了以下,下面是书中的概念。
可用表达式
相关定义:
例子。
对上面的解释,产生b+c是因为,b+c被计算过,所以可能后面有地方会用到,所以要产生b+c,在这个程序点会认为这个表达式时可用表达式,接下来由于b被赋值改变了,所以原来的b+c肯定对后面没用了,所以注销。(注意,红色的是我自己加的,我觉得是这样。)
对于一般的情况,例子如下:
注意:下面是我个人的看法,我感觉上述有点问题:
程序化的可用表达式计算为:
活跃变量
例子:我们在每条指令之前做活跃分析。
有:
同样,一般地,我们有:
程序化的可用表达式计算为:
到达定值