minidecaf-tutorial

死代码消除

死代码消除(Dead code elimination, DCE)即无用代码消除,死代码和不可达代码是两个概念。前者指的是执行之后没有任何作用的代码(例如:多余的计算),后者指的是永远无法被执行到的代码。

死代码消除通常依赖于Use-Def和Def-Use数据流分析,这个数据流分析可以帮我们找到每个指令用到的变量是在哪里定义的。

这里介绍一种 DCE 的方法(来源于《高级编译器设计与实现》(鲸书)):

具体实现上,可以借助du/ud链来实现:

此处举个例子:

_main:
      _T0 = 1
      _T1 = 2
      _T2 = _T1 + 5
      _T3 = _T0 + 2
      _T4 = _T3 * 5 
      return _T4     # _T4 是必要值

顺着ud链,可以找到 _T4 = _T3 * 5,因此 _T3 也是必要值。继续找到 _T3 = _T0 + 2,因此 _T0 也是必要值。最终 _T0_T3_T4 都是必要值,而 _T1_T2 的定义指令都可以认为是Dead Code。

因此可以优化为:

_main:
      _T0 = 1
      _T3 = _T0 + 2
      _T4 = _T3 * 5 
      return _T4