死代码消除

死代码消除即无用代码消除,和不可达代码消除是两个概念。前者指的是消除执行之后没有任何作用的代码,后者指的是消除永远无法被执行到的代码。现在框架中有不可达代码消除的优化,是在构造流图和常量传播的时候进行的。

我们要求基于活跃变量分析进行死代码消除,不要求基于Faint Variables Analysis。理论上来说Faint Variables Analysis的效果应该是一定不会更差的,但是实现也一定会更复杂,不建议大家做它(做了也不会有额外加分)。

本来这一节应该是这几种优化中最简单的一个的(从结果代码行数可以直接看出),不过因为这是大家的实验任务,所以这里还是讲解的详细一些。首先来推导活跃变量分析的几个集合是怎么来的,这个推导对于到达-定值分析也基本上适用,可以帮助大家理解那几个集合的意义。

最后一个等号使用数学归纳法来证明,读者自证不难。

  1. 对于方程的求解,Flow已经提供了求解的工具。它是基于前向数据流的。根据之前的讲解大家应该知道怎么利用它来求解后向数据流。如果你觉得现有的的代码很难理解,也完全可以自己手动实现数据流方程的求解,我们并不强制使用Flow

    • 所谓的副作用,其实就是除了"改变赋值目标变量"之外,其他所有的作用。显然,tac中没有既没有副作用,同时也没有赋值目标的语句

其实还有一些语句的"副作用"不是很明确,比如load指令a = *(b + imm)和一部分计算指令,如除0,有符号整数溢出等(依平台而定),可能会导致程序崩溃,但是优化的时候可以不把这当成是副作用:按照c/c++常用的说法这叫未定义行为,这可以减轻编译器作者的负担,编译器可以假定程序永远没有未定义行为,并以此为依据来优化。

目前decaf并没有这方面的严格的语言标准,为了让大家的实现尽量简单,我们姑且认为不合法的访存和运算都是未定义行为,所以这样的指令是可以优化掉的。

Last updated